From a352d4382491f06133ce52be9b7f5723f42fab1a Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Wed, 17 Jan 2018 10:11:30 -0600 Subject: [PATCH] Compare arg+aliases between docs and argument_spec (#34809) * compare arg+aliases between docs and argument_spec * Add some special handling for the network modules provider options that also appear in the top level arg spec * Fix error code for bigip_hostname * Address merge conflicts due to changes in f5 modules * Update validate-modules ignore based off a clean execution * Address merge conflicts * Address renamed module * Address recent changes to modules * Add ignore for ucs_ip_pool * Update aci modules to get more reliable documentation comparison, but not mutating the module_utils aci_argument_spec * Update ignore.txt after recent aci updates * Add extra guard to ensure we handle provider special only for network modules * Address additional changes to modules --- .../dev_guide/testing_validate-modules.rst | 2 + lib/ansible/module_utils/network/aci/aci.py | 25 +- .../network/aci/aci_aaa_user_certificate.py | 2 +- ...s_port_to_interface_policy_leaf_profile.py | 2 +- lib/ansible/modules/network/aci/aci_aep.py | 2 +- .../modules/network/aci/aci_aep_to_domain.py | 2 +- lib/ansible/modules/network/aci/aci_ap.py | 2 +- lib/ansible/modules/network/aci/aci_bd.py | 2 +- .../modules/network/aci/aci_bd_subnet.py | 2 +- .../modules/network/aci/aci_bd_to_l3out.py | 2 +- .../network/aci/aci_config_rollback.py | 2 +- .../network/aci/aci_config_snapshot.py | 2 +- .../modules/network/aci/aci_contract.py | 2 +- .../network/aci/aci_contract_subject.py | 2 +- .../aci/aci_contract_subject_to_filter.py | 2 +- lib/ansible/modules/network/aci/aci_domain.py | 2 +- .../network/aci/aci_domain_to_encap_pool.py | 2 +- .../network/aci/aci_domain_to_vlan_pool.py | 2 +- .../modules/network/aci/aci_encap_pool.py | 2 +- .../network/aci/aci_encap_pool_range.py | 2 +- lib/ansible/modules/network/aci/aci_epg.py | 2 +- .../network/aci/aci_epg_monitoring_policy.py | 2 +- .../network/aci/aci_epg_to_contract.py | 2 +- .../modules/network/aci/aci_epg_to_domain.py | 2 +- lib/ansible/modules/network/aci/aci_filter.py | 2 +- .../modules/network/aci/aci_filter_entry.py | 2 +- .../network/aci/aci_firmware_source.py | 2 +- .../aci/aci_interface_policy_leaf_profile.py | 2 +- ..._selector_to_switch_policy_leaf_profile.py | 2 +- .../modules/network/aci/aci_intf_policy_fc.py | 2 +- .../modules/network/aci/aci_intf_policy_l2.py | 2 +- .../network/aci/aci_intf_policy_lldp.py | 2 +- .../network/aci/aci_intf_policy_mcp.py | 2 +- .../aci/aci_intf_policy_port_channel.py | 2 +- .../aci/aci_intf_policy_port_security.py | 2 +- .../network/aci/aci_l3out_route_tag_policy.py | 2 +- lib/ansible/modules/network/aci/aci_rest.py | 2 +- .../network/aci/aci_switch_leaf_selector.py | 2 +- .../aci/aci_switch_policy_leaf_profile.py | 2 +- .../modules/network/aci/aci_taboo_contract.py | 2 +- lib/ansible/modules/network/aci/aci_tenant.py | 2 +- .../aci/aci_tenant_action_rule_profile.py | 2 +- .../aci/aci_tenant_ep_retention_policy.py | 2 +- .../network/aci/aci_tenant_span_dst_group.py | 2 +- .../network/aci/aci_tenant_span_src_group.py | 2 +- .../aci_tenant_span_src_group_to_dst_group.py | 2 +- .../modules/network/aci/aci_vlan_pool.py | 2 +- .../network/aci/aci_vlan_pool_encap_block.py | 2 +- lib/ansible/modules/network/aci/aci_vrf.py | 2 +- test/sanity/validate-modules/ignore.txt | 720 +++++++++++++++++- test/sanity/validate-modules/main.py | 68 +- test/sanity/validate-modules/module_args.py | 6 +- 52 files changed, 843 insertions(+), 72 deletions(-) diff --git a/docs/docsite/rst/dev_guide/testing_validate-modules.rst b/docs/docsite/rst/dev_guide/testing_validate-modules.rst index 24e375d1f9..8a96633f1c 100644 --- a/docs/docsite/rst/dev_guide/testing_validate-modules.rst +++ b/docs/docsite/rst/dev_guide/testing_validate-modules.rst @@ -108,6 +108,8 @@ Errors 319 ``RETURN`` fragments missing or invalid 320 ``DOCUMENTATION.options`` must be a dictionary/hash when used 321 ``Exception`` attempting to import module for ``argument_spec`` introspection + 322 argument is listed in the argument_spec, but not documented in the module + 323 argument is listed in DOCUMENTATION.options, but not accepted by the module .. --------- ------------------- **4xx** **Syntax** diff --git a/lib/ansible/module_utils/network/aci/aci.py b/lib/ansible/module_utils/network/aci/aci.py index 6d11cc4877..3da513006a 100644 --- a/lib/ansible/module_utils/network/aci/aci.py +++ b/lib/ansible/module_utils/network/aci/aci.py @@ -61,18 +61,19 @@ except ImportError: HAS_XMLJSON_COBRA = False -aci_argument_spec = dict( - hostname=dict(type='str', required=True, aliases=['host']), - username=dict(type='str', default='admin', aliases=['user']), - password=dict(type='str', no_log=True), - private_key=dict(type='path', aliases=['cert_key']), # Beware, this is not the same as client_key ! - certificate_name=dict(type='str', aliases=['cert_name']), # Beware, this is not the same as client_cert ! - protocol=dict(type='str', removed_in_version='2.6'), # Deprecated in v2.6 - timeout=dict(type='int', default=30), - use_proxy=dict(type='bool', default=True), - use_ssl=dict(type='bool', default=True), - validate_certs=dict(type='bool', default=True), -) +def aci_argument_spec(): + return dict( + hostname=dict(type='str', required=True, aliases=['host']), + username=dict(type='str', default='admin', aliases=['user']), + password=dict(type='str', no_log=True), + private_key=dict(type='path', aliases=['cert_key']), # Beware, this is not the same as client_key ! + certificate_name=dict(type='str', aliases=['cert_name']), # Beware, this is not the same as client_cert ! + protocol=dict(type='str', removed_in_version='2.6'), # Deprecated in v2.6 + timeout=dict(type='int', default=30), + use_proxy=dict(type='bool', default=True), + use_ssl=dict(type='bool', default=True), + validate_certs=dict(type='bool', default=True), + ) ''' URL_MAPPING = dict( diff --git a/lib/ansible/modules/network/aci/aci_aaa_user_certificate.py b/lib/ansible/modules/network/aci/aci_aaa_user_certificate.py index 7565be9d85..345e255917 100644 --- a/lib/ansible/modules/network/aci/aci_aaa_user_certificate.py +++ b/lib/ansible/modules/network/aci/aci_aaa_user_certificate.py @@ -107,7 +107,7 @@ ACI_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( certificate=dict(type='str', aliases=['cert_data', 'certificate_data']), certificate_name=dict(type='str', aliases=['cert_name']), diff --git a/lib/ansible/modules/network/aci/aci_access_port_to_interface_policy_leaf_profile.py b/lib/ansible/modules/network/aci/aci_access_port_to_interface_policy_leaf_profile.py index 923afafd5e..cadeb4a918 100644 --- a/lib/ansible/modules/network/aci/aci_access_port_to_interface_policy_leaf_profile.py +++ b/lib/ansible/modules/network/aci/aci_access_port_to_interface_policy_leaf_profile.py @@ -124,7 +124,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update({ 'leaf_interface_profile': dict(type='str', aliases=['leaf_interface_profile_name']), 'access_port_selector': dict(type='str', aliases=['name', 'access_port_selector_name']), diff --git a/lib/ansible/modules/network/aci/aci_aep.py b/lib/ansible/modules/network/aci/aci_aep.py index 26350219a2..5f8dd6390c 100644 --- a/lib/ansible/modules/network/aci/aci_aep.py +++ b/lib/ansible/modules/network/aci/aci_aep.py @@ -95,7 +95,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( aep=dict(type='str', aliases=['name', 'aep_name']), # not required for querying all AEPs description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_aep_to_domain.py b/lib/ansible/modules/network/aci/aci_aep_to_domain.py index 217417a5be..f3232df717 100755 --- a/lib/ansible/modules/network/aci/aci_aep_to_domain.py +++ b/lib/ansible/modules/network/aci/aci_aep_to_domain.py @@ -68,7 +68,7 @@ VM_PROVIDER_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( aep=dict(type='str', aliases=['aep_name']), domain=dict(type='str', aliases=['domain_name', 'domain_profile']), diff --git a/lib/ansible/modules/network/aci/aci_ap.py b/lib/ansible/modules/network/aci/aci_ap.py index e4160f7754..ec067c1acd 100644 --- a/lib/ansible/modules/network/aci/aci_ap.py +++ b/lib/ansible/modules/network/aci/aci_ap.py @@ -95,7 +95,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( tenant=dict(type='str', aliases=['tenant_name']), # tenant not required for querying all APs ap=dict(type='str', aliases=['app_profile', 'app_profile_name', 'name']), diff --git a/lib/ansible/modules/network/aci/aci_bd.py b/lib/ansible/modules/network/aci/aci_bd.py index ce811bc785..a3e810d81c 100644 --- a/lib/ansible/modules/network/aci/aci_bd.py +++ b/lib/ansible/modules/network/aci/aci_bd.py @@ -213,7 +213,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( arp_flooding=dict(choices=['no', 'yes']), bd=dict(type='str', aliases=['bd_name', 'name']), diff --git a/lib/ansible/modules/network/aci/aci_bd_subnet.py b/lib/ansible/modules/network/aci/aci_bd_subnet.py index 98754031e9..82938e4a51 100644 --- a/lib/ansible/modules/network/aci/aci_bd_subnet.py +++ b/lib/ansible/modules/network/aci/aci_bd_subnet.py @@ -211,7 +211,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( bd=dict(type='str', aliases=['bd_name']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_bd_to_l3out.py b/lib/ansible/modules/network/aci/aci_bd_to_l3out.py index 1b604d2a98..6320f62872 100644 --- a/lib/ansible/modules/network/aci/aci_bd_to_l3out.py +++ b/lib/ansible/modules/network/aci/aci_bd_to_l3out.py @@ -57,7 +57,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( bd=dict(type='str', aliases=['bd_name', 'bridge_domain']), l3out=dict(type='str'), diff --git a/lib/ansible/modules/network/aci/aci_config_rollback.py b/lib/ansible/modules/network/aci/aci_config_rollback.py index c59f174049..983c3f2714 100644 --- a/lib/ansible/modules/network/aci/aci_config_rollback.py +++ b/lib/ansible/modules/network/aci/aci_config_rollback.py @@ -145,7 +145,7 @@ except ImportError: def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( compare_export_policy=dict(type='str'), compare_snapshot=dict(type='str'), diff --git a/lib/ansible/modules/network/aci/aci_config_snapshot.py b/lib/ansible/modules/network/aci/aci_config_snapshot.py index 3092a13cb2..7b9e03d946 100644 --- a/lib/ansible/modules/network/aci/aci_config_snapshot.py +++ b/lib/ansible/modules/network/aci/aci_config_snapshot.py @@ -109,7 +109,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( description=dict(type='str', aliases=['descr']), export_policy=dict(type='str', aliases=['name']), diff --git a/lib/ansible/modules/network/aci/aci_contract.py b/lib/ansible/modules/network/aci/aci_contract.py index a88bcf820f..3b2fb7ff9d 100644 --- a/lib/ansible/modules/network/aci/aci_contract.py +++ b/lib/ansible/modules/network/aci/aci_contract.py @@ -89,7 +89,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( contract=dict(type='str', required=False, aliases=['contract_name', 'name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all objects diff --git a/lib/ansible/modules/network/aci/aci_contract_subject.py b/lib/ansible/modules/network/aci/aci_contract_subject.py index 72047e12a0..a921a09c27 100755 --- a/lib/ansible/modules/network/aci/aci_contract_subject.py +++ b/lib/ansible/modules/network/aci/aci_contract_subject.py @@ -137,7 +137,7 @@ MATCH_MAPPING = dict(all='All', at_least_one='AtleastOne', at_most_one='AtmostOn def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( contract=dict(type='str', aliases=['contract_name']), subject=dict(type='str', aliases=['contract_subject', 'name', 'subject_name']), diff --git a/lib/ansible/modules/network/aci/aci_contract_subject_to_filter.py b/lib/ansible/modules/network/aci/aci_contract_subject_to_filter.py index 2e04935d4b..962178ff57 100644 --- a/lib/ansible/modules/network/aci/aci_contract_subject_to_filter.py +++ b/lib/ansible/modules/network/aci/aci_contract_subject_to_filter.py @@ -82,7 +82,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( contract=dict(type='str', aliases=['contract_name']), filter=dict(type='str', aliases=['filter_name']), diff --git a/lib/ansible/modules/network/aci/aci_domain.py b/lib/ansible/modules/network/aci/aci_domain.py index 6b75a7a6f8..7fe5d435c0 100644 --- a/lib/ansible/modules/network/aci/aci_domain.py +++ b/lib/ansible/modules/network/aci/aci_domain.py @@ -144,7 +144,7 @@ VSWITCH_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( dscp=dict(type='str', choices=['AF11', 'AF12', 'AF13', 'AF21', 'AF22', 'AF23', 'AF31', 'AF32', 'AF33', 'AF41', 'AF42', 'AF43', diff --git a/lib/ansible/modules/network/aci/aci_domain_to_encap_pool.py b/lib/ansible/modules/network/aci/aci_domain_to_encap_pool.py index 818eab3fcd..9c36f6da0e 100644 --- a/lib/ansible/modules/network/aci/aci_domain_to_encap_pool.py +++ b/lib/ansible/modules/network/aci/aci_domain_to_encap_pool.py @@ -90,7 +90,7 @@ POOL_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( domain=dict(type='str', aliases=['domain_name', 'domain_profile']), domain_type=dict(type='str', choices=['fc', 'l2dom', 'l3dom', 'phys', 'vmm']), diff --git a/lib/ansible/modules/network/aci/aci_domain_to_vlan_pool.py b/lib/ansible/modules/network/aci/aci_domain_to_vlan_pool.py index 4c183a3093..fbec05bca4 100755 --- a/lib/ansible/modules/network/aci/aci_domain_to_vlan_pool.py +++ b/lib/ansible/modules/network/aci/aci_domain_to_vlan_pool.py @@ -137,7 +137,7 @@ VM_PROVIDER_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( domain=dict(type='str', aliases=['domain_name', 'domain_profile']), domain_type=dict(type='str', choices=['fc', 'l2dom', 'l3dom', 'phys', 'vmm']), diff --git a/lib/ansible/modules/network/aci/aci_encap_pool.py b/lib/ansible/modules/network/aci/aci_encap_pool.py index 7ed5a1ae9b..fd55b51d94 100644 --- a/lib/ansible/modules/network/aci/aci_encap_pool.py +++ b/lib/ansible/modules/network/aci/aci_encap_pool.py @@ -114,7 +114,7 @@ ACI_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( allocation_mode=dict(type='str', aliases=['mode'], choices=['dynamic', 'static']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_encap_pool_range.py b/lib/ansible/modules/network/aci/aci_encap_pool_range.py index 5d764d4224..cc8a768976 100644 --- a/lib/ansible/modules/network/aci/aci_encap_pool_range.py +++ b/lib/ansible/modules/network/aci/aci_encap_pool_range.py @@ -147,7 +147,7 @@ ACI_POOL_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( allocation_mode=dict(type='str', aliases=['mode'], choices=['dynamic', 'inherit', 'static']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_epg.py b/lib/ansible/modules/network/aci/aci_epg.py index 9210731536..fff0187084 100644 --- a/lib/ansible/modules/network/aci/aci_epg.py +++ b/lib/ansible/modules/network/aci/aci_epg.py @@ -159,7 +159,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( epg=dict(type='str', aliases=['name', 'epg_name']), bd=dict(type='str', aliases=['bd_name', 'bridge_domain']), diff --git a/lib/ansible/modules/network/aci/aci_epg_monitoring_policy.py b/lib/ansible/modules/network/aci/aci_epg_monitoring_policy.py index 949e14102b..5634dde684 100644 --- a/lib/ansible/modules/network/aci/aci_epg_monitoring_policy.py +++ b/lib/ansible/modules/network/aci/aci_epg_monitoring_policy.py @@ -70,7 +70,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( monitoring_policy=dict(type='str', required=False, aliases=['name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all objects diff --git a/lib/ansible/modules/network/aci/aci_epg_to_contract.py b/lib/ansible/modules/network/aci/aci_epg_to_contract.py index 6f0a35b49f..1f031b4475 100644 --- a/lib/ansible/modules/network/aci/aci_epg_to_contract.py +++ b/lib/ansible/modules/network/aci/aci_epg_to_contract.py @@ -79,7 +79,7 @@ PROVIDER_MATCH_MAPPING = {"all": "All", "at_least_one": "AtleastOne", "at_most_o def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( ap=dict(type='str', aliases=['app_profile', 'app_profile_name']), epg=dict(type='str', aliases=['epg_name']), diff --git a/lib/ansible/modules/network/aci/aci_epg_to_domain.py b/lib/ansible/modules/network/aci/aci_epg_to_domain.py index ddc5f998c2..2ab65dc9c0 100644 --- a/lib/ansible/modules/network/aci/aci_epg_to_domain.py +++ b/lib/ansible/modules/network/aci/aci_epg_to_domain.py @@ -113,7 +113,7 @@ VM_PROVIDER_MAPPING = dict( def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( allow_useg=dict(type='str', choices=['encap', 'useg']), ap=dict(type='str', aliases=['app_profile', 'app_profile_name']), diff --git a/lib/ansible/modules/network/aci/aci_filter.py b/lib/ansible/modules/network/aci/aci_filter.py index ae88a09999..987b15e9e5 100644 --- a/lib/ansible/modules/network/aci/aci_filter.py +++ b/lib/ansible/modules/network/aci/aci_filter.py @@ -96,7 +96,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( filter=dict(type='str', required=False, aliases=['name', 'filter_name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all objects diff --git a/lib/ansible/modules/network/aci/aci_filter_entry.py b/lib/ansible/modules/network/aci/aci_filter_entry.py index 280a6b6724..5c17e43604 100644 --- a/lib/ansible/modules/network/aci/aci_filter_entry.py +++ b/lib/ansible/modules/network/aci/aci_filter_entry.py @@ -138,7 +138,7 @@ ICMP6_MAPPING = dict(dst_unreachable='dst-unreach', echo_request='echo-req', ech def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( arp_flag=dict(type='str', choices=VALID_ARP_FLAGS), description=dict(type='str'), diff --git a/lib/ansible/modules/network/aci/aci_firmware_source.py b/lib/ansible/modules/network/aci/aci_firmware_source.py index 2e6461b317..f79b7287d3 100644 --- a/lib/ansible/modules/network/aci/aci_firmware_source.py +++ b/lib/ansible/modules/network/aci/aci_firmware_source.py @@ -69,7 +69,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( source=dict(type='str', aliases=['name', 'source_name']), # Not required for querying all objects polling_interval=dict(type='int'), diff --git a/lib/ansible/modules/network/aci/aci_interface_policy_leaf_profile.py b/lib/ansible/modules/network/aci/aci_interface_policy_leaf_profile.py index 6a2636578e..95381d477f 100644 --- a/lib/ansible/modules/network/aci/aci_interface_policy_leaf_profile.py +++ b/lib/ansible/modules/network/aci/aci_interface_policy_leaf_profile.py @@ -84,7 +84,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( leaf_interface_profile=dict(type='str', aliases=['name', 'leaf_interface_profile_name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_interface_selector_to_switch_policy_leaf_profile.py b/lib/ansible/modules/network/aci/aci_interface_selector_to_switch_policy_leaf_profile.py index bfa106714b..072b35065f 100644 --- a/lib/ansible/modules/network/aci/aci_interface_selector_to_switch_policy_leaf_profile.py +++ b/lib/ansible/modules/network/aci/aci_interface_selector_to_switch_policy_leaf_profile.py @@ -80,7 +80,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( leaf_profile=dict(type='str', aliases=['leaf_profile_name']), interface_selector=dict(type='str', aliases=['name', 'interface_selector_name', 'interface_profile_name']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_fc.py b/lib/ansible/modules/network/aci/aci_intf_policy_fc.py index 8a3ca33d1e..bf7fd4c3b2 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_fc.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_fc.py @@ -65,7 +65,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( fc_policy=dict(type='str', required=False, aliases=['name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_l2.py b/lib/ansible/modules/network/aci/aci_intf_policy_l2.py index cff669fc23..ec0751bc73 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_l2.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_l2.py @@ -77,7 +77,7 @@ QINQ_MAPPING = dict(core='corePort', disabled='disabled', edge='edgePort') def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( l2_policy=dict(type='str', required=False, aliases=['name']), # Not required for querying all policies description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_lldp.py b/lib/ansible/modules/network/aci/aci_intf_policy_lldp.py index f8635affc2..89b626d350 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_lldp.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_lldp.py @@ -73,7 +73,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( lldp_policy=dict(type='str', require=False, aliases=['name']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_mcp.py b/lib/ansible/modules/network/aci/aci_intf_policy_mcp.py index 32032ce1c2..22e4601a90 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_mcp.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_mcp.py @@ -65,7 +65,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( mcp=dict(type='str', required=False, aliases=['mcp_interface', 'name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_port_channel.py b/lib/ansible/modules/network/aci/aci_intf_policy_port_channel.py index 7f0581c7b2..610295e40e 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_port_channel.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_port_channel.py @@ -120,7 +120,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( port_channel=dict(type='str', required=False, aliases=['name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_intf_policy_port_security.py b/lib/ansible/modules/network/aci/aci_intf_policy_port_security.py index b49e6db6da..a7c21fc53b 100644 --- a/lib/ansible/modules/network/aci/aci_intf_policy_port_security.py +++ b/lib/ansible/modules/network/aci/aci_intf_policy_port_security.py @@ -64,7 +64,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( port_security=dict(type='str', required=False, aliases=['name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_l3out_route_tag_policy.py b/lib/ansible/modules/network/aci/aci_l3out_route_tag_policy.py index a7998196d3..c150669a9e 100644 --- a/lib/ansible/modules/network/aci/aci_l3out_route_tag_policy.py +++ b/lib/ansible/modules/network/aci/aci_l3out_route_tag_policy.py @@ -73,7 +73,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( rtp=dict(type='str', required=False, aliases=['name', 'rtp_name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for quering all objects diff --git a/lib/ansible/modules/network/aci/aci_rest.py b/lib/ansible/modules/network/aci/aci_rest.py index 6358c9e118..38217cdf88 100644 --- a/lib/ansible/modules/network/aci/aci_rest.py +++ b/lib/ansible/modules/network/aci/aci_rest.py @@ -295,7 +295,7 @@ def aci_response(result, rawoutput, rest_type='xml'): def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( path=dict(type='str', required=True, aliases=['uri']), method=dict(type='str', default='get', choices=['delete', 'get', 'post'], aliases=['action']), diff --git a/lib/ansible/modules/network/aci/aci_switch_leaf_selector.py b/lib/ansible/modules/network/aci/aci_switch_leaf_selector.py index eab4d4a039..c2017ff8fa 100644 --- a/lib/ansible/modules/network/aci/aci_switch_leaf_selector.py +++ b/lib/ansible/modules/network/aci/aci_switch_leaf_selector.py @@ -117,7 +117,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update({ 'description': dict(type='str'), 'leaf_profile': dict(type='str', aliases=['leaf_profile_name']), diff --git a/lib/ansible/modules/network/aci/aci_switch_policy_leaf_profile.py b/lib/ansible/modules/network/aci/aci_switch_policy_leaf_profile.py index 21b35ad160..f64187d781 100644 --- a/lib/ansible/modules/network/aci/aci_switch_policy_leaf_profile.py +++ b/lib/ansible/modules/network/aci/aci_switch_policy_leaf_profile.py @@ -76,7 +76,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( leaf_profile=dict(type='str', aliases=['name', 'leaf_profile_name']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_taboo_contract.py b/lib/ansible/modules/network/aci/aci_taboo_contract.py index 81a6ed9a13..cdd016e6b7 100644 --- a/lib/ansible/modules/network/aci/aci_taboo_contract.py +++ b/lib/ansible/modules/network/aci/aci_taboo_contract.py @@ -74,7 +74,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( taboo_contract=dict(type='str', required=False, aliases=['name']), # Not required for querying all contracts tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all contracts diff --git a/lib/ansible/modules/network/aci/aci_tenant.py b/lib/ansible/modules/network/aci/aci_tenant.py index 6ae92adcfd..e69e0b341d 100644 --- a/lib/ansible/modules/network/aci/aci_tenant.py +++ b/lib/ansible/modules/network/aci/aci_tenant.py @@ -83,7 +83,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( tenant=dict(type='str', required=False, aliases=['name', 'tenant_name']), # Not required for querying all objects description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_tenant_action_rule_profile.py b/lib/ansible/modules/network/aci/aci_tenant_action_rule_profile.py index 51841f623e..7e53f393c5 100644 --- a/lib/ansible/modules/network/aci/aci_tenant_action_rule_profile.py +++ b/lib/ansible/modules/network/aci/aci_tenant_action_rule_profile.py @@ -66,7 +66,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( action_rule=dict(type='str', required=False, aliases=['action_rule_name', 'name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all objects diff --git a/lib/ansible/modules/network/aci/aci_tenant_ep_retention_policy.py b/lib/ansible/modules/network/aci/aci_tenant_ep_retention_policy.py index 50eebc9193..2155c8eabe 100755 --- a/lib/ansible/modules/network/aci/aci_tenant_ep_retention_policy.py +++ b/lib/ansible/modules/network/aci/aci_tenant_ep_retention_policy.py @@ -128,7 +128,7 @@ BOUNCE_TRIG_MAPPING = dict(coop='protocol', rarp='rarp-flood') def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( tenant=dict(type='str', aliases=['tenant_name']), # not required for querying all EPRs epr_policy=dict(type='str', aliases=['epr_name', 'name']), diff --git a/lib/ansible/modules/network/aci/aci_tenant_span_dst_group.py b/lib/ansible/modules/network/aci/aci_tenant_span_dst_group.py index 0bda52e84a..0132a1d059 100644 --- a/lib/ansible/modules/network/aci/aci_tenant_span_dst_group.py +++ b/lib/ansible/modules/network/aci/aci_tenant_span_dst_group.py @@ -68,7 +68,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( dst_group=dict(type='str', required=False, aliases=['name']), # Not required for querying all objects tenant=dict(type='str', required=False, aliases=['tenant_name']), # Not required for querying all objects diff --git a/lib/ansible/modules/network/aci/aci_tenant_span_src_group.py b/lib/ansible/modules/network/aci/aci_tenant_span_src_group.py index 45b23b3324..1a71a839ba 100755 --- a/lib/ansible/modules/network/aci/aci_tenant_span_src_group.py +++ b/lib/ansible/modules/network/aci/aci_tenant_span_src_group.py @@ -75,7 +75,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( admin_state=dict(type='str', choices=['enabled', 'disabled']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_tenant_span_src_group_to_dst_group.py b/lib/ansible/modules/network/aci/aci_tenant_span_src_group_to_dst_group.py index 18e7581e53..0771a032b9 100755 --- a/lib/ansible/modules/network/aci/aci_tenant_span_src_group_to_dst_group.py +++ b/lib/ansible/modules/network/aci/aci_tenant_span_src_group_to_dst_group.py @@ -68,7 +68,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( description=dict(type='str', aliases=['descr']), dst_group=dict(type='str'), diff --git a/lib/ansible/modules/network/aci/aci_vlan_pool.py b/lib/ansible/modules/network/aci/aci_vlan_pool.py index aea528221d..a145b203e7 100644 --- a/lib/ansible/modules/network/aci/aci_vlan_pool.py +++ b/lib/ansible/modules/network/aci/aci_vlan_pool.py @@ -90,7 +90,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( allocation_mode=dict(type='str', aliases=['mode'], choices=['dynamic', 'static']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_vlan_pool_encap_block.py b/lib/ansible/modules/network/aci/aci_vlan_pool_encap_block.py index 6b9a2788d3..a89b91c340 100644 --- a/lib/ansible/modules/network/aci/aci_vlan_pool_encap_block.py +++ b/lib/ansible/modules/network/aci/aci_vlan_pool_encap_block.py @@ -122,7 +122,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( allocation_mode=dict(type='str', aliases=['mode'], choices=['dynamic', 'inherit', 'static']), description=dict(type='str', aliases=['descr']), diff --git a/lib/ansible/modules/network/aci/aci_vrf.py b/lib/ansible/modules/network/aci/aci_vrf.py index d194ca26f8..e8d45b7ee7 100644 --- a/lib/ansible/modules/network/aci/aci_vrf.py +++ b/lib/ansible/modules/network/aci/aci_vrf.py @@ -101,7 +101,7 @@ from ansible.module_utils.basic import AnsibleModule def main(): - argument_spec = aci_argument_spec + argument_spec = aci_argument_spec() argument_spec.update( description=dict(type='str', aliases=['descr']), method=dict(type='str', choices=['delete', 'get', 'post'], aliases=['action'], removed_in_version='2.6'), # Deprecated starting from v2.6 diff --git a/test/sanity/validate-modules/ignore.txt b/test/sanity/validate-modules/ignore.txt index 934a2a0b4a..81806863ba 100644 --- a/test/sanity/validate-modules/ignore.txt +++ b/test/sanity/validate-modules/ignore.txt @@ -1,58 +1,770 @@ +lib/ansible/modules/cloud/amazon/_ec2_ami_find.py E322 +lib/ansible/modules/cloud/amazon/_ec2_ami_find.py E323 +lib/ansible/modules/cloud/amazon/aws_acm_facts.py E322 +lib/ansible/modules/cloud/amazon/aws_acm_facts.py E323 +lib/ansible/modules/cloud/amazon/aws_api_gateway.py E322 +lib/ansible/modules/cloud/amazon/aws_application_scaling_policy.py E322 +lib/ansible/modules/cloud/amazon/aws_direct_connect_gateway.py E322 +lib/ansible/modules/cloud/amazon/aws_s3.py E322 +lib/ansible/modules/cloud/amazon/cloudfront_facts.py E323 +lib/ansible/modules/cloud/amazon/data_pipeline.py E322 +lib/ansible/modules/cloud/amazon/ec2.py E322 +lib/ansible/modules/cloud/amazon/ec2_eip.py E322 +lib/ansible/modules/cloud/amazon/ec2_elb_facts.py E323 +lib/ansible/modules/cloud/amazon/ec2_group.py E322 +lib/ansible/modules/cloud/amazon/ec2_lc.py E322 +lib/ansible/modules/cloud/amazon/ec2_vol.py E322 +lib/ansible/modules/cloud/amazon/ec2_vpc_dhcp_option_facts.py E322 lib/ansible/modules/cloud/amazon/ec2_vpc_subnet.py E317 +lib/ansible/modules/cloud/amazon/ec2_vpc_vgw.py E322 +lib/ansible/modules/cloud/amazon/ec2_vpc_vgw.py E323 +lib/ansible/modules/cloud/amazon/elb_application_lb.py E322 +lib/ansible/modules/cloud/amazon/elb_classic_lb_facts.py E323 +lib/ansible/modules/cloud/amazon/elb_target_group.py E322 lib/ansible/modules/cloud/amazon/iam.py E317 +lib/ansible/modules/cloud/amazon/iam_managed_policy.py E322 lib/ansible/modules/cloud/amazon/iam_policy.py E317 lib/ansible/modules/cloud/amazon/kinesis_stream.py E317 +lib/ansible/modules/cloud/amazon/lambda.py E323 lib/ansible/modules/cloud/amazon/lambda_alias.py E317 lib/ansible/modules/cloud/amazon/lambda_event.py E317 +lib/ansible/modules/cloud/amazon/rds.py E322 +lib/ansible/modules/cloud/amazon/redshift.py E322 +lib/ansible/modules/cloud/amazon/s3_lifecycle.py E322 +lib/ansible/modules/cloud/amazon/s3_sync.py E322 lib/ansible/modules/cloud/amazon/sts_assume_role.py E317 lib/ansible/modules/cloud/atomic/atomic_container.py E317 -lib/ansible/modules/cloud/azure/azure_rm_dnsrecordset.py E321 -lib/ansible/modules/cloud/azure/azure_rm_storageaccount.py E321 +lib/ansible/modules/cloud/azure/azure_rm_acs.py E322 +lib/ansible/modules/cloud/azure/azure_rm_availabilityset.py E322 +lib/ansible/modules/cloud/azure/azure_rm_availabilityset_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_containerinstance.py E322 +lib/ansible/modules/cloud/azure/azure_rm_containerregistry.py E322 +lib/ansible/modules/cloud/azure/azure_rm_deployment.py E322 +lib/ansible/modules/cloud/azure/azure_rm_dnsrecordset.py E322 +lib/ansible/modules/cloud/azure/azure_rm_dnsrecordset_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_dnszone.py E322 +lib/ansible/modules/cloud/azure/azure_rm_dnszone_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_functionapp.py E322 +lib/ansible/modules/cloud/azure/azure_rm_functionapp_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_image.py E322 +lib/ansible/modules/cloud/azure/azure_rm_loadbalancer.py E322 +lib/ansible/modules/cloud/azure/azure_rm_loadbalancer_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_managed_disk.py E322 +lib/ansible/modules/cloud/azure/azure_rm_managed_disk_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_mysqldatabase.py E322 +lib/ansible/modules/cloud/azure/azure_rm_mysqlserver.py E322 +lib/ansible/modules/cloud/azure/azure_rm_networkinterface.py E322 +lib/ansible/modules/cloud/azure/azure_rm_networkinterface_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_postgresqldatabase.py E322 +lib/ansible/modules/cloud/azure/azure_rm_postgresqlserver.py E322 +lib/ansible/modules/cloud/azure/azure_rm_publicipaddress.py E322 +lib/ansible/modules/cloud/azure/azure_rm_publicipaddress_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_resourcegroup.py E322 +lib/ansible/modules/cloud/azure/azure_rm_resourcegroup_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_securitygroup.py E322 +lib/ansible/modules/cloud/azure/azure_rm_securitygroup_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_sqlserver.py E322 +lib/ansible/modules/cloud/azure/azure_rm_sqlserver_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_storageaccount.py E322 +lib/ansible/modules/cloud/azure/azure_rm_storageaccount_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_storageblob.py E322 +lib/ansible/modules/cloud/azure/azure_rm_storageblob.py E323 +lib/ansible/modules/cloud/azure/azure_rm_subnet.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachine.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachine_extension.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachine_scaleset.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachine_scaleset_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachineimage_facts.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualmachineimage_facts.py E323 +lib/ansible/modules/cloud/azure/azure_rm_virtualnetwork.py E322 +lib/ansible/modules/cloud/azure/azure_rm_virtualnetwork_facts.py E322 lib/ansible/modules/cloud/centurylink/clc_alert_policy.py E317 lib/ansible/modules/cloud/centurylink/clc_firewall_policy.py E317 +lib/ansible/modules/cloud/cloudstack/cs_ip_address.py E322 +lib/ansible/modules/cloud/cloudstack/cs_iso.py E323 +lib/ansible/modules/cloud/cloudstack/cs_loadbalancer_rule.py E322 +lib/ansible/modules/cloud/cloudstack/cs_loadbalancer_rule_member.py E322 +lib/ansible/modules/cloud/cloudstack/cs_network_offering.py E322 +lib/ansible/modules/cloud/cloudstack/cs_project.py E322 +lib/ansible/modules/cloud/cloudstack/cs_router.py E322 +lib/ansible/modules/cloud/cloudstack/cs_service_offering.py E322 +lib/ansible/modules/cloud/cloudstack/cs_service_offering.py E323 +lib/ansible/modules/cloud/cloudstack/cs_storage_pool.py E322 +lib/ansible/modules/cloud/cloudstack/cs_volume.py E322 +lib/ansible/modules/cloud/cloudstack/cs_vpn_connection.py E322 +lib/ansible/modules/cloud/cloudstack/cs_zone.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_block_storage.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_floating_ip.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_floating_ip_facts.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_sshkey.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_sshkey_facts.py E322 +lib/ansible/modules/cloud/digital_ocean/digital_ocean_tag.py E322 lib/ansible/modules/cloud/dimensiondata/dimensiondata_network.py E321 +lib/ansible/modules/cloud/docker/_docker.py E322 +lib/ansible/modules/cloud/docker/docker_container.py E322 +lib/ansible/modules/cloud/docker/docker_image.py E322 +lib/ansible/modules/cloud/docker/docker_image_facts.py E322 +lib/ansible/modules/cloud/docker/docker_login.py E322 +lib/ansible/modules/cloud/docker/docker_network.py E322 +lib/ansible/modules/cloud/docker/docker_secret.py E322 +lib/ansible/modules/cloud/docker/docker_service.py E322 +lib/ansible/modules/cloud/docker/docker_volume.py E322 +lib/ansible/modules/cloud/google/gc_storage.py E322 +lib/ansible/modules/cloud/google/gce_eip.py E322 +lib/ansible/modules/cloud/google/gce_instance_template.py E322 +lib/ansible/modules/cloud/google/gce_labels.py E322 +lib/ansible/modules/cloud/google/gce_lb.py E323 +lib/ansible/modules/cloud/google/gce_mig.py E322 +lib/ansible/modules/cloud/google/gce_net.py E323 +lib/ansible/modules/cloud/google/gce_pd.py E322 +lib/ansible/modules/cloud/google/gcp_backend_service.py E322 +lib/ansible/modules/cloud/google/gcp_forwarding_rule.py E322 +lib/ansible/modules/cloud/google/gcp_target_proxy.py E322 +lib/ansible/modules/cloud/google/gcp_url_map.py E322 +lib/ansible/modules/cloud/google/gcpubsub.py E322 +lib/ansible/modules/cloud/google/gcpubsub.py E323 +lib/ansible/modules/cloud/google/gcpubsub_facts.py E322 +lib/ansible/modules/cloud/google/gcspanner.py E322 +lib/ansible/modules/cloud/linode/linode.py E322 +lib/ansible/modules/cloud/lxd/lxd_container.py E322 +lib/ansible/modules/cloud/misc/ovirt.py E322 +lib/ansible/modules/cloud/misc/proxmox_kvm.py E322 +lib/ansible/modules/cloud/misc/proxmox_template.py E323 +lib/ansible/modules/cloud/misc/rhevm.py E322 +lib/ansible/modules/cloud/misc/terraform.py E323 +lib/ansible/modules/cloud/misc/virt.py E322 +lib/ansible/modules/cloud/openstack/os_ironic.py E322 +lib/ansible/modules/cloud/openstack/os_ironic.py E323 +lib/ansible/modules/cloud/openstack/os_ironic_node.py E322 +lib/ansible/modules/cloud/openstack/os_keystone_endpoint.py E322 +lib/ansible/modules/cloud/openstack/os_quota.py E322 +lib/ansible/modules/cloud/openstack/os_quota.py E323 +lib/ansible/modules/cloud/openstack/os_server.py E322 +lib/ansible/modules/cloud/openstack/os_subnets_facts.py E322 +lib/ansible/modules/cloud/openstack/os_subnets_facts.py E323 +lib/ansible/modules/cloud/openstack/os_volume.py E322 lib/ansible/modules/cloud/ovirt/ovirt_affinity_label.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_auth.py E322 lib/ansible/modules/cloud/ovirt/ovirt_cluster.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_cluster.py E322 lib/ansible/modules/cloud/ovirt/ovirt_datacenter.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_disk.py E322 lib/ansible/modules/cloud/ovirt/ovirt_external_provider.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_external_provider.py E322 lib/ansible/modules/cloud/ovirt/ovirt_external_provider_facts.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_external_provider_facts.py E322 lib/ansible/modules/cloud/ovirt/ovirt_host_networks.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_host_networks.py E322 lib/ansible/modules/cloud/ovirt/ovirt_host_pm.py E317 lib/ansible/modules/cloud/ovirt/ovirt_mac_pools.py E317 lib/ansible/modules/cloud/ovirt/ovirt_networks.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_quotas.py E322 +lib/ansible/modules/cloud/ovirt/ovirt_snapshots.py E322 +lib/ansible/modules/cloud/ovirt/ovirt_storage_templates_facts.py E322 +lib/ansible/modules/cloud/ovirt/ovirt_storage_vms_facts.py E322 lib/ansible/modules/cloud/ovirt/ovirt_tags.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_tags_facts.py E323 +lib/ansible/modules/cloud/ovirt/ovirt_templates.py E322 +lib/ansible/modules/cloud/ovirt/ovirt_users.py E322 lib/ansible/modules/cloud/ovirt/ovirt_vmpools.py E317 +lib/ansible/modules/cloud/ovirt/ovirt_vmpools.py E322 +lib/ansible/modules/cloud/packet/packet_sshkey.py E322 +lib/ansible/modules/cloud/profitbricks/profitbricks.py E322 +lib/ansible/modules/cloud/profitbricks/profitbricks_volume.py E322 +lib/ansible/modules/cloud/rackspace/rax.py E322 +lib/ansible/modules/cloud/rackspace/rax_clb_nodes.py E322 +lib/ansible/modules/cloud/rackspace/rax_files_objects.py E323 lib/ansible/modules/cloud/smartos/imgadm.py E317 +lib/ansible/modules/cloud/smartos/vmadm.py E322 +lib/ansible/modules/cloud/spotinst/spotinst_aws_elastigroup.py E322 +lib/ansible/modules/cloud/spotinst/spotinst_aws_elastigroup.py E323 +lib/ansible/modules/cloud/univention/udm_dns_zone.py E322 +lib/ansible/modules/cloud/univention/udm_share.py E322 +lib/ansible/modules/cloud/univention/udm_share.py E323 +lib/ansible/modules/cloud/vmware/vca_fw.py E322 +lib/ansible/modules/cloud/vmware/vca_nat.py E322 +lib/ansible/modules/cloud/vmware/vca_vapp.py E322 +lib/ansible/modules/cloud/vmware/vcenter_license.py E322 +lib/ansible/modules/cloud/vmware/vmware_guest.py E322 +lib/ansible/modules/cloud/vmware/vmware_guest_file_operation.py E322 +lib/ansible/modules/cloud/vmware/vmware_guest_file_operation.py E323 +lib/ansible/modules/cloud/vmware/vmware_guest_powerstate.py E322 +lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py E322 +lib/ansible/modules/cloud/vmware/vmware_maintenancemode.py E323 +lib/ansible/modules/cloud/vmware/vmware_vmkernel.py E322 +lib/ansible/modules/cloud/vmware/vmware_vmkernel.py E323 +lib/ansible/modules/cloud/vmware/vsphere_copy.py E322 +lib/ansible/modules/cloud/vultr/vr_dns_domain.py E323 +lib/ansible/modules/cloud/vultr/vr_firewall_rule.py E323 +lib/ansible/modules/cloud/vultr/vr_user.py E322 lib/ansible/modules/cloud/webfaction/webfaction_app.py E321 lib/ansible/modules/cloud/webfaction/webfaction_db.py E321 lib/ansible/modules/cloud/webfaction/webfaction_domain.py E321 lib/ansible/modules/cloud/webfaction/webfaction_mailbox.py E321 lib/ansible/modules/cloud/webfaction/webfaction_site.py E321 +lib/ansible/modules/clustering/consul.py E322 +lib/ansible/modules/clustering/consul_kv.py E322 +lib/ansible/modules/clustering/consul_session.py E322 +lib/ansible/modules/clustering/k8s/_kubernetes.py E322 +lib/ansible/modules/clustering/k8s/_kubernetes.py E323 lib/ansible/modules/clustering/k8s/k8s_raw.py E321 lib/ansible/modules/clustering/k8s/k8s_scale.py E321 lib/ansible/modules/clustering/openshift/openshift_raw.py E321 lib/ansible/modules/clustering/openshift/openshift_scale.py E321 +lib/ansible/modules/commands/command.py E322 +lib/ansible/modules/commands/command.py E323 +lib/ansible/modules/database/influxdb/influxdb_user.py E322 lib/ansible/modules/database/mongodb/mongodb_parameter.py E317 +lib/ansible/modules/database/mongodb/mongodb_parameter.py E323 +lib/ansible/modules/database/mongodb/mongodb_user.py E322 +lib/ansible/modules/database/mysql/mysql_user.py E322 +lib/ansible/modules/database/postgresql/postgresql_ext.py E322 +lib/ansible/modules/database/postgresql/postgresql_privs.py E322 +lib/ansible/modules/database/postgresql/postgresql_schema.py E322 +lib/ansible/modules/database/postgresql/postgresql_user.py E322 +lib/ansible/modules/database/proxysql/proxysql_backend_servers.py E322 +lib/ansible/modules/database/proxysql/proxysql_global_variables.py E322 +lib/ansible/modules/database/proxysql/proxysql_manage_config.py E322 +lib/ansible/modules/database/proxysql/proxysql_mysql_users.py E322 +lib/ansible/modules/database/proxysql/proxysql_query_rules.py E322 +lib/ansible/modules/database/proxysql/proxysql_replication_hostgroups.py E322 +lib/ansible/modules/database/proxysql/proxysql_scheduler.py E322 +lib/ansible/modules/database/vertica/vertica_role.py E322 +lib/ansible/modules/database/vertica/vertica_schema.py E322 +lib/ansible/modules/database/vertica/vertica_user.py E322 +lib/ansible/modules/files/acl.py E322 +lib/ansible/modules/files/assemble.py E323 +lib/ansible/modules/files/copy.py E322 +lib/ansible/modules/files/copy.py E323 +lib/ansible/modules/files/file.py E322 +lib/ansible/modules/files/ini_file.py E323 +lib/ansible/modules/files/lineinfile.py E322 +lib/ansible/modules/files/lineinfile.py E323 +lib/ansible/modules/files/replace.py E323 +lib/ansible/modules/files/synchronize.py E322 +lib/ansible/modules/files/synchronize.py E323 +lib/ansible/modules/files/unarchive.py E322 +lib/ansible/modules/files/unarchive.py E323 +lib/ansible/modules/identity/ipa/ipa_group.py E322 +lib/ansible/modules/identity/ipa/ipa_subca.py E322 +lib/ansible/modules/identity/ipa/ipa_sudorule.py E322 +lib/ansible/modules/identity/keycloak/keycloak_client.py E322 +lib/ansible/modules/monitoring/bigpanda.py E322 +lib/ansible/modules/monitoring/icinga2_host.py E322 +lib/ansible/modules/monitoring/logentries.py E322 lib/ansible/modules/monitoring/logicmonitor.py E317 lib/ansible/modules/monitoring/logicmonitor_facts.py E317 lib/ansible/modules/monitoring/nagios.py E317 lib/ansible/modules/monitoring/zabbix/zabbix_maintenance.py E317 +lib/ansible/modules/net_tools/basics/get_url.py E322 +lib/ansible/modules/net_tools/basics/get_url.py E323 +lib/ansible/modules/net_tools/basics/slurp.py E322 +lib/ansible/modules/net_tools/basics/uri.py E322 +lib/ansible/modules/net_tools/basics/uri.py E323 lib/ansible/modules/net_tools/cloudflare_dns.py E317 lib/ansible/modules/net_tools/haproxy.py E317 +lib/ansible/modules/net_tools/ldap/ldap_attr.py E322 +lib/ansible/modules/net_tools/nmcli.py E323 lib/ansible/modules/net_tools/omapi_host.py E317 +lib/ansible/modules/net_tools/omapi_host.py E322 +lib/ansible/modules/net_tools/snmp_facts.py E322 +lib/ansible/modules/network/aci/aci_aaa_user_certificate.py E322 +lib/ansible/modules/network/aci/aci_access_port_to_interface_policy_leaf_profile.py E322 +lib/ansible/modules/network/aci/aci_aep.py E322 +lib/ansible/modules/network/aci/aci_aep_to_domain.py E322 +lib/ansible/modules/network/aci/aci_ap.py E322 +lib/ansible/modules/network/aci/aci_bd.py E322 +lib/ansible/modules/network/aci/aci_bd_subnet.py E322 +lib/ansible/modules/network/aci/aci_bd_to_l3out.py E322 +lib/ansible/modules/network/aci/aci_config_rollback.py E322 +lib/ansible/modules/network/aci/aci_config_snapshot.py E322 +lib/ansible/modules/network/aci/aci_contract.py E322 +lib/ansible/modules/network/aci/aci_contract_subject.py E322 +lib/ansible/modules/network/aci/aci_contract_subject_to_filter.py E322 +lib/ansible/modules/network/aci/aci_domain.py E322 +lib/ansible/modules/network/aci/aci_domain_to_encap_pool.py E322 +lib/ansible/modules/network/aci/aci_domain_to_vlan_pool.py E322 +lib/ansible/modules/network/aci/aci_encap_pool.py E322 +lib/ansible/modules/network/aci/aci_encap_pool_range.py E322 +lib/ansible/modules/network/aci/aci_epg.py E322 +lib/ansible/modules/network/aci/aci_epg_monitoring_policy.py E322 +lib/ansible/modules/network/aci/aci_epg_to_contract.py E322 +lib/ansible/modules/network/aci/aci_epg_to_domain.py E322 +lib/ansible/modules/network/aci/aci_filter.py E322 +lib/ansible/modules/network/aci/aci_filter_entry.py E322 +lib/ansible/modules/network/aci/aci_filter_entry.py E323 +lib/ansible/modules/network/aci/aci_interface_policy_leaf_profile.py E322 +lib/ansible/modules/network/aci/aci_interface_selector_to_switch_policy_leaf_profile.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_fc.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_l2.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_lldp.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_mcp.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_port_channel.py E322 +lib/ansible/modules/network/aci/aci_intf_policy_port_security.py E322 +lib/ansible/modules/network/aci/aci_l3out_route_tag_policy.py E322 +lib/ansible/modules/network/aci/aci_rest.py E322 +lib/ansible/modules/network/aci/aci_switch_leaf_selector.py E322 +lib/ansible/modules/network/aci/aci_switch_policy_leaf_profile.py E322 +lib/ansible/modules/network/aci/aci_taboo_contract.py E322 +lib/ansible/modules/network/aci/aci_tenant.py E322 +lib/ansible/modules/network/aci/aci_tenant_action_rule_profile.py E322 +lib/ansible/modules/network/aci/aci_tenant_ep_retention_policy.py E322 +lib/ansible/modules/network/aci/aci_tenant_span_dst_group.py E322 +lib/ansible/modules/network/aci/aci_tenant_span_src_group.py E322 +lib/ansible/modules/network/aci/aci_tenant_span_src_group_to_dst_group.py E322 +lib/ansible/modules/network/aci/aci_vlan_pool.py E322 +lib/ansible/modules/network/aci/aci_vlan_pool_encap_block.py E322 +lib/ansible/modules/network/aci/aci_vrf.py E322 +lib/ansible/modules/network/cloudengine/ce_aaa_server.py E322 +lib/ansible/modules/network/cloudengine/ce_aaa_server_host.py E322 +lib/ansible/modules/network/cloudengine/ce_acl.py E322 +lib/ansible/modules/network/cloudengine/ce_acl_advance.py E322 +lib/ansible/modules/network/cloudengine/ce_acl_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_bfd_global.py E322 +lib/ansible/modules/network/cloudengine/ce_bfd_session.py E322 +lib/ansible/modules/network/cloudengine/ce_bfd_view.py E322 +lib/ansible/modules/network/cloudengine/ce_bgp.py E322 +lib/ansible/modules/network/cloudengine/ce_bgp_af.py E322 +lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py E322 +lib/ansible/modules/network/cloudengine/ce_bgp_neighbor_af.py E322 +lib/ansible/modules/network/cloudengine/ce_command.py E322 +lib/ansible/modules/network/cloudengine/ce_config.py E322 +lib/ansible/modules/network/cloudengine/ce_dldp.py E322 +lib/ansible/modules/network/cloudengine/ce_dldp.py E323 +lib/ansible/modules/network/cloudengine/ce_dldp_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_eth_trunk.py E322 +lib/ansible/modules/network/cloudengine/ce_evpn_bd_vni.py E322 +lib/ansible/modules/network/cloudengine/ce_evpn_bgp.py E322 +lib/ansible/modules/network/cloudengine/ce_evpn_bgp_rr.py E322 +lib/ansible/modules/network/cloudengine/ce_evpn_global.py E322 +lib/ansible/modules/network/cloudengine/ce_facts.py E322 +lib/ansible/modules/network/cloudengine/ce_file_copy.py E322 +lib/ansible/modules/network/cloudengine/ce_info_center_debug.py E322 +lib/ansible/modules/network/cloudengine/ce_info_center_global.py E322 +lib/ansible/modules/network/cloudengine/ce_info_center_log.py E322 +lib/ansible/modules/network/cloudengine/ce_info_center_trap.py E322 +lib/ansible/modules/network/cloudengine/ce_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_interface_ospf.py E322 +lib/ansible/modules/network/cloudengine/ce_ip_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_link_status.py E322 +lib/ansible/modules/network/cloudengine/ce_mlag_config.py E322 +lib/ansible/modules/network/cloudengine/ce_mlag_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_mtu.py E322 +lib/ansible/modules/network/cloudengine/ce_netconf.py E322 +lib/ansible/modules/network/cloudengine/ce_netstream_aging.py E322 +lib/ansible/modules/network/cloudengine/ce_netstream_export.py E322 +lib/ansible/modules/network/cloudengine/ce_netstream_global.py E322 +lib/ansible/modules/network/cloudengine/ce_netstream_template.py E322 +lib/ansible/modules/network/cloudengine/ce_ntp.py E322 +lib/ansible/modules/network/cloudengine/ce_ntp_auth.py E322 +lib/ansible/modules/network/cloudengine/ce_ospf.py E322 +lib/ansible/modules/network/cloudengine/ce_ospf_vrf.py E322 lib/ansible/modules/network/cloudengine/ce_reboot.py E317 +lib/ansible/modules/network/cloudengine/ce_reboot.py E322 +lib/ansible/modules/network/cloudengine/ce_rollback.py E322 +lib/ansible/modules/network/cloudengine/ce_sflow.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_community.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_contact.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_location.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_target_host.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_traps.py E322 +lib/ansible/modules/network/cloudengine/ce_snmp_user.py E322 +lib/ansible/modules/network/cloudengine/ce_startup.py E322 +lib/ansible/modules/network/cloudengine/ce_static_route.py E322 +lib/ansible/modules/network/cloudengine/ce_stp.py E322 +lib/ansible/modules/network/cloudengine/ce_switchport.py E322 +lib/ansible/modules/network/cloudengine/ce_vlan.py E322 +lib/ansible/modules/network/cloudengine/ce_vrf.py E322 +lib/ansible/modules/network/cloudengine/ce_vrf_af.py E322 +lib/ansible/modules/network/cloudengine/ce_vrf_interface.py E322 +lib/ansible/modules/network/cloudengine/ce_vrrp.py E322 +lib/ansible/modules/network/cloudengine/ce_vxlan_arp.py E322 +lib/ansible/modules/network/cloudengine/ce_vxlan_gateway.py E322 +lib/ansible/modules/network/cloudengine/ce_vxlan_global.py E322 +lib/ansible/modules/network/cloudengine/ce_vxlan_tunnel.py E322 +lib/ansible/modules/network/cloudengine/ce_vxlan_vap.py E322 +lib/ansible/modules/network/cnos/cnos_backup.py E322 +lib/ansible/modules/network/cnos/cnos_backup.py E323 +lib/ansible/modules/network/cnos/cnos_facts.py E323 +lib/ansible/modules/network/cnos/cnos_rollback.py E322 +lib/ansible/modules/network/cnos/cnos_rollback.py E323 +lib/ansible/modules/network/cnos/cnos_showrun.py E323 +lib/ansible/modules/network/cumulus/_cl_interface.py E322 +lib/ansible/modules/network/dellos10/dellos10_command.py E322 +lib/ansible/modules/network/dellos6/dellos6_command.py E322 +lib/ansible/modules/network/dellos9/dellos9_command.py E322 +lib/ansible/modules/network/enos/enos_command.py E323 +lib/ansible/modules/network/enos/enos_config.py E323 +lib/ansible/modules/network/enos/enos_facts.py E323 +lib/ansible/modules/network/eos/eos_interface.py E322 +lib/ansible/modules/network/eos/eos_l3_interface.py E322 +lib/ansible/modules/network/eos/eos_linkagg.py E322 +lib/ansible/modules/network/eos/eos_lldp.py E322 +lib/ansible/modules/network/eos/eos_logging.py E322 +lib/ansible/modules/network/eos/eos_static_route.py E322 +lib/ansible/modules/network/eos/eos_vlan.py E322 +lib/ansible/modules/network/eos/eos_vrf.py E322 +lib/ansible/modules/network/f5/bigip_asm_policy.py E322 +lib/ansible/modules/network/f5/bigip_asm_policy.py E323 +lib/ansible/modules/network/f5/bigip_command.py E322 +lib/ansible/modules/network/f5/bigip_command.py E323 +lib/ansible/modules/network/f5/bigip_config.py E322 +lib/ansible/modules/network/f5/bigip_config.py E323 +lib/ansible/modules/network/f5/bigip_configsync_action.py E322 +lib/ansible/modules/network/f5/bigip_configsync_action.py E323 +lib/ansible/modules/network/f5/bigip_device_connectivity.py E322 +lib/ansible/modules/network/f5/bigip_device_connectivity.py E323 +lib/ansible/modules/network/f5/bigip_device_dns.py E322 +lib/ansible/modules/network/f5/bigip_device_dns.py E323 +lib/ansible/modules/network/f5/bigip_device_group.py E322 +lib/ansible/modules/network/f5/bigip_device_group.py E323 +lib/ansible/modules/network/f5/bigip_device_httpd.py E322 +lib/ansible/modules/network/f5/bigip_device_httpd.py E323 +lib/ansible/modules/network/f5/bigip_device_ntp.py E322 +lib/ansible/modules/network/f5/bigip_device_ntp.py E323 +lib/ansible/modules/network/f5/bigip_device_sshd.py E322 +lib/ansible/modules/network/f5/bigip_device_sshd.py E323 +lib/ansible/modules/network/f5/bigip_device_trust.py E322 +lib/ansible/modules/network/f5/bigip_device_trust.py E323 +lib/ansible/modules/network/f5/bigip_facts.py E322 +lib/ansible/modules/network/f5/bigip_facts.py E323 +lib/ansible/modules/network/f5/bigip_gtm_datacenter.py E322 +lib/ansible/modules/network/f5/bigip_gtm_datacenter.py E323 +lib/ansible/modules/network/f5/bigip_gtm_facts.py E322 +lib/ansible/modules/network/f5/bigip_gtm_facts.py E323 +lib/ansible/modules/network/f5/bigip_gtm_pool.py E322 +lib/ansible/modules/network/f5/bigip_gtm_pool.py E323 +lib/ansible/modules/network/f5/bigip_gtm_server.py E322 +lib/ansible/modules/network/f5/bigip_gtm_server.py E323 +lib/ansible/modules/network/f5/bigip_gtm_virtual_server.py E322 +lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py E322 +lib/ansible/modules/network/f5/bigip_gtm_wide_ip.py E323 +lib/ansible/modules/network/f5/bigip_hostname.py E322 +lib/ansible/modules/network/f5/bigip_hostname.py E323 +lib/ansible/modules/network/f5/bigip_iapp_service.py E322 +lib/ansible/modules/network/f5/bigip_iapp_service.py E323 +lib/ansible/modules/network/f5/bigip_iapp_template.py E322 +lib/ansible/modules/network/f5/bigip_iapp_template.py E323 +lib/ansible/modules/network/f5/bigip_iapplx_package.py E322 +lib/ansible/modules/network/f5/bigip_iapplx_package.py E323 +lib/ansible/modules/network/f5/bigip_irule.py E322 +lib/ansible/modules/network/f5/bigip_irule.py E323 +lib/ansible/modules/network/f5/bigip_monitor_http.py E322 +lib/ansible/modules/network/f5/bigip_monitor_http.py E323 +lib/ansible/modules/network/f5/bigip_monitor_https.py E322 +lib/ansible/modules/network/f5/bigip_monitor_https.py E323 +lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py E322 +lib/ansible/modules/network/f5/bigip_monitor_snmp_dca.py E323 +lib/ansible/modules/network/f5/bigip_monitor_tcp.py E322 +lib/ansible/modules/network/f5/bigip_monitor_tcp.py E323 +lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py E322 +lib/ansible/modules/network/f5/bigip_monitor_tcp_echo.py E323 +lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py E322 +lib/ansible/modules/network/f5/bigip_monitor_tcp_half_open.py E323 +lib/ansible/modules/network/f5/bigip_monitor_udp.py E322 +lib/ansible/modules/network/f5/bigip_monitor_udp.py E323 +lib/ansible/modules/network/f5/bigip_node.py E322 +lib/ansible/modules/network/f5/bigip_node.py E323 +lib/ansible/modules/network/f5/bigip_partition.py E322 +lib/ansible/modules/network/f5/bigip_partition.py E323 +lib/ansible/modules/network/f5/bigip_policy.py E322 +lib/ansible/modules/network/f5/bigip_policy.py E323 +lib/ansible/modules/network/f5/bigip_policy_rule.py E322 +lib/ansible/modules/network/f5/bigip_policy_rule.py E323 +lib/ansible/modules/network/f5/bigip_pool.py E322 +lib/ansible/modules/network/f5/bigip_pool.py E323 +lib/ansible/modules/network/f5/bigip_pool_member.py E322 +lib/ansible/modules/network/f5/bigip_pool_member.py E323 +lib/ansible/modules/network/f5/bigip_profile_client_ssl.py E322 +lib/ansible/modules/network/f5/bigip_profile_client_ssl.py E323 +lib/ansible/modules/network/f5/bigip_provision.py E322 +lib/ansible/modules/network/f5/bigip_provision.py E323 +lib/ansible/modules/network/f5/bigip_qkview.py E322 +lib/ansible/modules/network/f5/bigip_qkview.py E323 +lib/ansible/modules/network/f5/bigip_remote_syslog.py E322 +lib/ansible/modules/network/f5/bigip_remote_syslog.py E323 +lib/ansible/modules/network/f5/bigip_security_address_list.py E322 +lib/ansible/modules/network/f5/bigip_security_address_list.py E323 +lib/ansible/modules/network/f5/bigip_security_port_list.py E322 +lib/ansible/modules/network/f5/bigip_security_port_list.py E323 +lib/ansible/modules/network/f5/bigip_selfip.py E322 +lib/ansible/modules/network/f5/bigip_selfip.py E323 +lib/ansible/modules/network/f5/bigip_snat_pool.py E322 +lib/ansible/modules/network/f5/bigip_snat_pool.py E323 +lib/ansible/modules/network/f5/bigip_snmp.py E322 +lib/ansible/modules/network/f5/bigip_snmp.py E323 +lib/ansible/modules/network/f5/bigip_snmp_trap.py E322 +lib/ansible/modules/network/f5/bigip_snmp_trap.py E323 +lib/ansible/modules/network/f5/bigip_software_update.py E322 +lib/ansible/modules/network/f5/bigip_software_update.py E323 +lib/ansible/modules/network/f5/bigip_ssl_certificate.py E322 +lib/ansible/modules/network/f5/bigip_ssl_certificate.py E323 +lib/ansible/modules/network/f5/bigip_ssl_key.py E322 +lib/ansible/modules/network/f5/bigip_ssl_key.py E323 +lib/ansible/modules/network/f5/bigip_static_route.py E322 +lib/ansible/modules/network/f5/bigip_static_route.py E323 +lib/ansible/modules/network/f5/bigip_sys_db.py E322 +lib/ansible/modules/network/f5/bigip_sys_db.py E323 +lib/ansible/modules/network/f5/bigip_sys_global.py E322 +lib/ansible/modules/network/f5/bigip_sys_global.py E323 +lib/ansible/modules/network/f5/bigip_traffic_group.py E322 +lib/ansible/modules/network/f5/bigip_traffic_group.py E323 +lib/ansible/modules/network/f5/bigip_ucs.py E322 +lib/ansible/modules/network/f5/bigip_ucs.py E323 +lib/ansible/modules/network/f5/bigip_user.py E322 +lib/ansible/modules/network/f5/bigip_user.py E323 +lib/ansible/modules/network/f5/bigip_vcmp_guest.py E322 +lib/ansible/modules/network/f5/bigip_vcmp_guest.py E323 +lib/ansible/modules/network/f5/bigip_virtual_address.py E322 +lib/ansible/modules/network/f5/bigip_virtual_address.py E323 +lib/ansible/modules/network/f5/bigip_virtual_server.py E322 +lib/ansible/modules/network/f5/bigip_virtual_server.py E323 +lib/ansible/modules/network/f5/bigip_vlan.py E322 +lib/ansible/modules/network/f5/bigip_vlan.py E323 +lib/ansible/modules/network/f5/bigip_wait.py E322 +lib/ansible/modules/network/f5/bigip_wait.py E323 +lib/ansible/modules/network/f5/bigiq_regkey_license.py E322 +lib/ansible/modules/network/f5/bigiq_regkey_license.py E323 +lib/ansible/modules/network/f5/bigiq_regkey_pool.py E322 +lib/ansible/modules/network/f5/bigiq_regkey_pool.py E323 lib/ansible/modules/network/illumos/dladm_linkprop.py E317 lib/ansible/modules/network/illumos/ipadm_addrprop.py E317 lib/ansible/modules/network/illumos/ipadm_ifprop.py E317 +lib/ansible/modules/network/ios/ios_interface.py E322 +lib/ansible/modules/network/ios/ios_l3_interface.py E322 +lib/ansible/modules/network/ios/ios_linkagg.py E322 +lib/ansible/modules/network/ios/ios_lldp.py E322 +lib/ansible/modules/network/ios/ios_logging.py E322 +lib/ansible/modules/network/ios/ios_static_route.py E322 +lib/ansible/modules/network/ios/ios_user.py E322 +lib/ansible/modules/network/ios/ios_vlan.py E322 +lib/ansible/modules/network/iosxr/iosxr_command.py E322 +lib/ansible/modules/network/iosxr/iosxr_logging.py E322 +lib/ansible/modules/network/iosxr/iosxr_netconf.py E322 +lib/ansible/modules/network/ironware/ironware_command.py E323 +lib/ansible/modules/network/ironware/ironware_config.py E323 +lib/ansible/modules/network/ironware/ironware_facts.py E323 +lib/ansible/modules/network/junos/junos_banner.py E322 +lib/ansible/modules/network/junos/junos_interface.py E322 +lib/ansible/modules/network/junos/junos_l3_interface.py E322 +lib/ansible/modules/network/junos/junos_linkagg.py E322 +lib/ansible/modules/network/junos/junos_lldp.py E322 +lib/ansible/modules/network/junos/junos_lldp_interface.py E322 +lib/ansible/modules/network/junos/junos_logging.py E322 +lib/ansible/modules/network/junos/junos_static_route.py E322 +lib/ansible/modules/network/junos/junos_system.py E322 +lib/ansible/modules/network/junos/junos_vlan.py E322 +lib/ansible/modules/network/junos/junos_vrf.py E322 +lib/ansible/modules/network/netscaler/netscaler_cs_action.py E323 +lib/ansible/modules/network/netscaler/netscaler_cs_vserver.py E322 +lib/ansible/modules/network/netscaler/netscaler_cs_vserver.py E323 +lib/ansible/modules/network/netscaler/netscaler_gslb_vserver.py E322 +lib/ansible/modules/network/netscaler/netscaler_lb_monitor.py E323 +lib/ansible/modules/network/netscaler/netscaler_lb_vserver.py E323 +lib/ansible/modules/network/netscaler/netscaler_service.py E323 +lib/ansible/modules/network/netvisor/pn_vrouter.py E322 +lib/ansible/modules/network/nxos/_nxos_ip_interface.py E323 +lib/ansible/modules/network/nxos/_nxos_mtu.py E323 +lib/ansible/modules/network/nxos/_nxos_portchannel.py E323 +lib/ansible/modules/network/nxos/_nxos_switchport.py E323 +lib/ansible/modules/network/nxos/nxos_aaa_server.py E323 +lib/ansible/modules/network/nxos/nxos_aaa_server_host.py E323 +lib/ansible/modules/network/nxos/nxos_acl.py E323 +lib/ansible/modules/network/nxos/nxos_acl_interface.py E323 +lib/ansible/modules/network/nxos/nxos_banner.py E322 +lib/ansible/modules/network/nxos/nxos_bgp.py E323 +lib/ansible/modules/network/nxos/nxos_bgp_af.py E323 +lib/ansible/modules/network/nxos/nxos_bgp_neighbor.py E323 +lib/ansible/modules/network/nxos/nxos_bgp_neighbor_af.py E323 +lib/ansible/modules/network/nxos/nxos_command.py E323 +lib/ansible/modules/network/nxos/nxos_config.py E323 +lib/ansible/modules/network/nxos/nxos_evpn_global.py E323 +lib/ansible/modules/network/nxos/nxos_evpn_vni.py E323 +lib/ansible/modules/network/nxos/nxos_facts.py E323 +lib/ansible/modules/network/nxos/nxos_feature.py E323 +lib/ansible/modules/network/nxos/nxos_file_copy.py E323 +lib/ansible/modules/network/nxos/nxos_gir.py E323 +lib/ansible/modules/network/nxos/nxos_gir_profile_management.py E323 +lib/ansible/modules/network/nxos/nxos_hsrp.py E323 +lib/ansible/modules/network/nxos/nxos_igmp.py E323 +lib/ansible/modules/network/nxos/nxos_igmp_interface.py E323 +lib/ansible/modules/network/nxos/nxos_igmp_snooping.py E323 +lib/ansible/modules/network/nxos/nxos_install_os.py E323 +lib/ansible/modules/network/nxos/nxos_interface.py E323 +lib/ansible/modules/network/nxos/nxos_interface_ospf.py E323 +lib/ansible/modules/network/nxos/nxos_l2_interface.py E323 +lib/ansible/modules/network/nxos/nxos_l3_interface.py E322 +lib/ansible/modules/network/nxos/nxos_linkagg.py E323 +lib/ansible/modules/network/nxos/nxos_lldp.py E322 +lib/ansible/modules/network/nxos/nxos_logging.py E322 +lib/ansible/modules/network/nxos/nxos_ntp.py E323 +lib/ansible/modules/network/nxos/nxos_ntp_auth.py E323 +lib/ansible/modules/network/nxos/nxos_ntp_options.py E323 +lib/ansible/modules/network/nxos/nxos_nxapi.py E323 +lib/ansible/modules/network/nxos/nxos_ospf.py E323 +lib/ansible/modules/network/nxos/nxos_ospf_vrf.py E323 +lib/ansible/modules/network/nxos/nxos_overlay_global.py E323 +lib/ansible/modules/network/nxos/nxos_pim.py E323 +lib/ansible/modules/network/nxos/nxos_pim_interface.py E323 +lib/ansible/modules/network/nxos/nxos_pim_rp_address.py E323 +lib/ansible/modules/network/nxos/nxos_ping.py E323 +lib/ansible/modules/network/nxos/nxos_reboot.py E323 +lib/ansible/modules/network/nxos/nxos_rollback.py E323 +lib/ansible/modules/network/nxos/nxos_smu.py E323 +lib/ansible/modules/network/nxos/nxos_snapshot.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_community.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_contact.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_host.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_location.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_traps.py E323 +lib/ansible/modules/network/nxos/nxos_snmp_user.py E323 +lib/ansible/modules/network/nxos/nxos_static_route.py E323 +lib/ansible/modules/network/nxos/nxos_system.py E323 +lib/ansible/modules/network/nxos/nxos_udld.py E323 +lib/ansible/modules/network/nxos/nxos_udld_interface.py E323 +lib/ansible/modules/network/nxos/nxos_user.py E323 +lib/ansible/modules/network/nxos/nxos_vlan.py E323 +lib/ansible/modules/network/nxos/nxos_vpc.py E323 +lib/ansible/modules/network/nxos/nxos_vpc_interface.py E323 +lib/ansible/modules/network/nxos/nxos_vrf.py E323 +lib/ansible/modules/network/nxos/nxos_vrf_af.py E323 +lib/ansible/modules/network/nxos/nxos_vrf_interface.py E323 +lib/ansible/modules/network/nxos/nxos_vrrp.py E323 +lib/ansible/modules/network/nxos/nxos_vtp_domain.py E323 +lib/ansible/modules/network/nxos/nxos_vtp_password.py E323 +lib/ansible/modules/network/nxos/nxos_vtp_version.py E323 +lib/ansible/modules/network/nxos/nxos_vxlan_vtep.py E323 +lib/ansible/modules/network/nxos/nxos_vxlan_vtep_vni.py E323 +lib/ansible/modules/network/onyx/onyx_command.py E323 +lib/ansible/modules/network/onyx/onyx_config.py E323 +lib/ansible/modules/network/onyx/onyx_interface.py E323 +lib/ansible/modules/network/ordnance/ordnance_config.py E322 +lib/ansible/modules/network/ordnance/ordnance_facts.py E322 +lib/ansible/modules/network/panos/panos_nat_rule.py E322 +lib/ansible/modules/network/panos/panos_sag.py E322 +lib/ansible/modules/network/panos/panos_sag.py E323 +lib/ansible/modules/network/panos/panos_security_policy.py E322 +lib/ansible/modules/network/panos/panos_security_rule.py E322 lib/ansible/modules/network/radware/vdirect_commit.py E321 lib/ansible/modules/network/radware/vdirect_file.py E321 lib/ansible/modules/network/radware/vdirect_runnable.py E321 +lib/ansible/modules/network/sros/sros_config.py E323 +lib/ansible/modules/network/vyos/vyos_banner.py E322 +lib/ansible/modules/network/vyos/vyos_interface.py E322 +lib/ansible/modules/network/vyos/vyos_l3_interface.py E322 +lib/ansible/modules/network/vyos/vyos_linkagg.py E322 +lib/ansible/modules/network/vyos/vyos_lldp.py E322 +lib/ansible/modules/network/vyos/vyos_lldp_interface.py E322 +lib/ansible/modules/network/vyos/vyos_logging.py E322 +lib/ansible/modules/network/vyos/vyos_static_route.py E322 +lib/ansible/modules/network/vyos/vyos_system.py E322 +lib/ansible/modules/network/vyos/vyos_user.py E322 +lib/ansible/modules/network/vyos/vyos_vlan.py E322 +lib/ansible/modules/notification/cisco_spark.py E322 +lib/ansible/modules/notification/hipchat.py E322 +lib/ansible/modules/notification/irc.py E322 +lib/ansible/modules/notification/mail.py E322 +lib/ansible/modules/notification/pushbullet.py E322 lib/ansible/modules/notification/rocketchat.py E317 +lib/ansible/modules/notification/sendgrid.py E322 lib/ansible/modules/notification/snow_record.py E317 +lib/ansible/modules/packaging/language/pear.py E322 +lib/ansible/modules/packaging/language/pip.py E322 +lib/ansible/modules/packaging/os/apt.py E322 +lib/ansible/modules/packaging/os/apt_key.py E322 +lib/ansible/modules/packaging/os/apt_repository.py E322 +lib/ansible/modules/packaging/os/apt_rpm.py E322 +lib/ansible/modules/packaging/os/dnf.py E322 +lib/ansible/modules/packaging/os/layman.py E322 +lib/ansible/modules/packaging/os/macports.py E322 +lib/ansible/modules/packaging/os/opkg.py E322 +lib/ansible/modules/packaging/os/pkgin.py E322 +lib/ansible/modules/packaging/os/pkgng.py E322 +lib/ansible/modules/packaging/os/portage.py E322 +lib/ansible/modules/packaging/os/portinstall.py E322 +lib/ansible/modules/packaging/os/pulp_repo.py E322 +lib/ansible/modules/packaging/os/rhn_channel.py E322 +lib/ansible/modules/packaging/os/slackpkg.py E322 +lib/ansible/modules/packaging/os/swdepot.py E322 +lib/ansible/modules/packaging/os/urpmi.py E322 +lib/ansible/modules/packaging/os/xbps.py E322 +lib/ansible/modules/packaging/os/yum.py E322 +lib/ansible/modules/packaging/os/yum_repository.py E322 +lib/ansible/modules/remote_management/foreman/foreman.py E322 +lib/ansible/modules/remote_management/foreman/katello.py E322 +lib/ansible/modules/remote_management/oneview/oneview_datacenter_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_enclosure_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_ethernet_network.py E322 +lib/ansible/modules/remote_management/oneview/oneview_ethernet_network_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_fc_network.py E322 +lib/ansible/modules/remote_management/oneview/oneview_fc_network_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_fcoe_network.py E322 +lib/ansible/modules/remote_management/oneview/oneview_fcoe_network_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_logical_interconnect_group.py E322 +lib/ansible/modules/remote_management/oneview/oneview_logical_interconnect_group_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_network_set.py E322 +lib/ansible/modules/remote_management/oneview/oneview_network_set_facts.py E322 +lib/ansible/modules/remote_management/oneview/oneview_san_manager.py E322 +lib/ansible/modules/remote_management/oneview/oneview_san_manager_facts.py E322 lib/ansible/modules/remote_management/stacki/stacki_host.py E317 +lib/ansible/modules/remote_management/stacki/stacki_host.py E322 +lib/ansible/modules/remote_management/ucs/ucs_ip_pool.py E322 +lib/ansible/modules/remote_management/ucs/ucs_ip_pool.py E323 +lib/ansible/modules/remote_management/ucs/ucs_mac_pool.py E322 +lib/ansible/modules/remote_management/ucs/ucs_mac_pool.py E323 +lib/ansible/modules/remote_management/ucs/ucs_san_connectivity.py E322 +lib/ansible/modules/remote_management/ucs/ucs_san_connectivity.py E323 +lib/ansible/modules/remote_management/ucs/ucs_vhba_template.py E322 +lib/ansible/modules/remote_management/ucs/ucs_vhba_template.py E323 +lib/ansible/modules/remote_management/ucs/ucs_vsans.py E322 +lib/ansible/modules/remote_management/ucs/ucs_wwn_pool.py E322 +lib/ansible/modules/remote_management/ucs/ucs_wwn_pool.py E323 +lib/ansible/modules/source_control/subversion.py E322 +lib/ansible/modules/storage/infinidat/infini_export.py E323 +lib/ansible/modules/storage/infinidat/infini_export_client.py E323 lib/ansible/modules/storage/netapp/na_cdot_volume.py E317 +lib/ansible/modules/storage/netapp/na_cdot_volume.py E322 +lib/ansible/modules/storage/netapp/netapp_e_amg.py E322 +lib/ansible/modules/storage/netapp/netapp_e_amg_role.py E322 +lib/ansible/modules/storage/netapp/netapp_e_flashcache.py E322 +lib/ansible/modules/storage/netapp/netapp_e_host.py E322 +lib/ansible/modules/storage/netapp/netapp_e_snapshot_group.py E322 +lib/ansible/modules/storage/netapp/netapp_e_snapshot_images.py E322 +lib/ansible/modules/storage/netapp/netapp_e_storage_system.py E322 +lib/ansible/modules/storage/netapp/netapp_e_storagepool.py E322 +lib/ansible/modules/storage/netapp/netapp_e_volume.py E322 +lib/ansible/modules/storage/netapp/netapp_e_volume_copy.py E322 +lib/ansible/modules/storage/netapp/netapp_e_volume_copy.py E323 +lib/ansible/modules/storage/netapp/sf_account_manager.py E322 +lib/ansible/modules/storage/netapp/sf_check_connections.py E322 +lib/ansible/modules/storage/netapp/sf_snapshot_schedule_manager.py E322 +lib/ansible/modules/storage/netapp/sf_volume_access_group_manager.py E322 +lib/ansible/modules/storage/netapp/sf_volume_manager.py E322 +lib/ansible/modules/storage/zfs/zfs.py E322 +lib/ansible/modules/storage/zfs/zfs.py E323 +lib/ansible/modules/storage/zfs/zfs_facts.py E323 +lib/ansible/modules/storage/zfs/zpool_facts.py E323 +lib/ansible/modules/system/authorized_key.py E322 +lib/ansible/modules/system/capabilities.py E322 +lib/ansible/modules/system/filesystem.py E322 +lib/ansible/modules/system/firewalld.py E322 +lib/ansible/modules/system/gluster_volume.py E322 lib/ansible/modules/system/make.py E317 -lib/ansible/modules/utilities/helper/_accelerate.py E305 -lib/ansible/modules/utilities/logic/async_status.py E310 +lib/ansible/modules/system/open_iscsi.py E322 +lib/ansible/modules/system/osx_defaults.py E322 +lib/ansible/modules/system/puppet.py E322 +lib/ansible/modules/system/runit.py E322 +lib/ansible/modules/system/selinux_permissive.py E322 +lib/ansible/modules/system/service.py E323 +lib/ansible/modules/system/svc.py E322 +lib/ansible/modules/system/ufw.py E322 +lib/ansible/modules/web_infrastructure/ansible_tower/tower_job_launch.py E323 +lib/ansible/modules/web_infrastructure/ansible_tower/tower_job_template.py E322 +lib/ansible/modules/web_infrastructure/ansible_tower/tower_team.py E322 lib/ansible/modules/web_infrastructure/apache2_mod_proxy.py E317 lib/ansible/modules/web_infrastructure/django_manage.py E317 +lib/ansible/modules/web_infrastructure/django_manage.py E322 +lib/ansible/modules/web_infrastructure/gunicorn.py E322 +lib/ansible/modules/web_infrastructure/jenkins_plugin.py E322 +lib/ansible/modules/web_infrastructure/jira.py E322 diff --git a/test/sanity/validate-modules/main.py b/test/sanity/validate-modules/main.py index 908ea3bd4f..87e0e28e3e 100755 --- a/test/sanity/validate-modules/main.py +++ b/test/sanity/validate-modules/main.py @@ -39,7 +39,7 @@ from fnmatch import fnmatch from ansible import __version__ as ansible_version from ansible.executor.module_common import REPLACER_WINDOWS from ansible.plugins.loader import fragment_loader -from ansible.utils.plugin_docs import BLACKLIST, get_docstring +from ansible.utils.plugin_docs import BLACKLIST, add_fragments, get_docstring from module_args import AnsibleModuleImportError, get_argument_spec @@ -49,6 +49,7 @@ from utils import CaptureStd, parse_yaml from voluptuous.humanize import humanize_error from ansible.module_utils.six import PY3, with_metaclass +from ansible.module_utils.basic import FILE_COMMON_ARGUMENTS if PY3: # Because there is no ast.TryExcept in Python 3 ast module @@ -804,6 +805,7 @@ class ModuleValidator(Validator): def _validate_docs(self): doc_info = self._get_docs() deprecated = False + doc = None if not bool(doc_info['DOCUMENTATION']['value']): self.reporter.error( path=self.object_path, @@ -965,7 +967,7 @@ class ModuleValidator(Validator): self._validate_docs_schema(metadata, metadata_1_1_schema(deprecated), 'ANSIBLE_METADATA', 316) - return doc_info + return doc_info, doc def _check_version_added(self, doc): if not self._is_new_module(): @@ -993,12 +995,12 @@ class ModuleValidator(Validator): msg='version_added should be %s. Currently %s' % (should_be, version_added) ) - def _validate_argument_spec(self): + def _validate_argument_spec(self, docs): if not self.analyze_arg_spec: return try: - spec = get_argument_spec(self.path) + spec, args, kwargs = get_argument_spec(self.path) except AnsibleModuleImportError: self.reporter.error( path=self.object_path, @@ -1011,7 +1013,17 @@ class ModuleValidator(Validator): ) return + provider_args = set() + args_from_argspec = set() for arg, data in spec.items(): + args_from_argspec.add(arg) + args_from_argspec.update(data.get('aliases', [])) + if arg == 'provider' and self.object_path.startswith('lib/ansible/modules/network/'): + # Record provider options from network modules, for later comparison + for provider_arg, provider_data in data.get('options', {}).items(): + provider_args.add(provider_arg) + provider_args.update(provider_data.get('aliases', [])) + if data.get('required') and data.get('default', object) != object: self.reporter.error( path=self.object_path, @@ -1021,6 +1033,50 @@ class ModuleValidator(Validator): 'should not be marked as required' % arg) ) + if docs: + try: + add_fragments(docs, self.object_path, fragment_loader=fragment_loader) + except Exception: + # Cannot merge fragments + return + + file_common_arguments = set() + for arg, data in FILE_COMMON_ARGUMENTS.items(): + file_common_arguments.add(arg) + file_common_arguments.update(data.get('aliases', [])) + + args_from_docs = set() + for arg, data in docs.get('options', {}).items(): + args_from_docs.add(arg) + args_from_docs.update(data.get('aliases', [])) + + args_missing_from_docs = args_from_argspec.difference(args_from_docs) + docs_missing_from_args = args_from_docs.difference(args_from_argspec) + for arg in args_missing_from_docs: + # args_from_argspec contains undocumented argument + if kwargs.get('add_file_common_args', False) and arg in file_common_arguments: + # add_file_common_args is handled in AnsibleModule, and not exposed earlier + continue + if arg in provider_args: + # Provider args are being removed from network module top level + # So they are likely not documented on purpose + continue + self.reporter.error( + path=self.object_path, + code=322, + msg='"%s" is listed in the argument_spec, but not documented in the module' % arg + ) + for arg in docs_missing_from_args: + # args_from_docs contains argument not in the argument_spec + if kwargs.get('add_file_common_args', False) and arg in file_common_arguments: + # add_file_common_args is handled in AnsibleModule, and not exposed earlier + continue + self.reporter.error( + path=self.object_path, + code=323, + msg='"%s" is listed in DOCUMENTATION.options, but not accepted by the module' % arg + ) + def _check_for_new_args(self, doc): if not self.base_branch or self._is_new_module(): return @@ -1150,10 +1206,10 @@ class ModuleValidator(Validator): return if self._python_module(): - doc_info = self._validate_docs() + doc_info, docs = self._validate_docs() if self._python_module() and not self._just_docs(): - self._validate_argument_spec() + self._validate_argument_spec(docs) self._check_for_sys_exit() self._find_blacklist_imports() main = self._find_main_call() diff --git a/test/sanity/validate-modules/module_args.py b/test/sanity/validate-modules/module_args.py index 50a9224154..addf02d25f 100644 --- a/test/sanity/validate-modules/module_args.py +++ b/test/sanity/validate-modules/module_args.py @@ -77,8 +77,8 @@ def get_argument_spec(filename): try: args, kwargs = module_mock.call_args try: - return kwargs['argument_spec'] + return kwargs['argument_spec'], args, kwargs except KeyError: - return args[0] + return args[0], args, kwargs except TypeError: - return {} + return {}, (), {}