diff --git a/changelogs/fragments/additional_spec_fix.yml b/changelogs/fragments/additional_spec_fix.yml new file mode 100644 index 00000000000..364eb80c34f --- /dev/null +++ b/changelogs/fragments/additional_spec_fix.yml @@ -0,0 +1,2 @@ +minor_changes: +- Fixes argument spec for several modules for using correct datatypes. diff --git a/lib/ansible/modules/cloud/google/gce_instance_template.py b/lib/ansible/modules/cloud/google/gce_instance_template.py index e5e99e19e94..1116ac32f52 100644 --- a/lib/ansible/modules/cloud/google/gce_instance_template.py +++ b/lib/ansible/modules/cloud/google/gce_instance_template.py @@ -30,6 +30,7 @@ options: name: description: - The name of the GCE instance template. + required: True size: description: - The desired machine type for the instance template. @@ -530,7 +531,7 @@ def main(): module = AnsibleModule( argument_spec=dict( state=dict(choices=['present', 'absent'], default='present'), - name=dict(require=True, aliases=['base_name']), + name=dict(required=True, aliases=['base_name']), size=dict(default='f1-micro'), source=dict(), image=dict(), @@ -571,7 +572,7 @@ def main(): try: gce = gce_connect(module) except GoogleBaseError as e: - module.fail_json(msg='GCE Connexion failed %s' % to_native(e), exception=traceback.format_exc()) + module.fail_json(msg='GCE Connection failed %s' % to_native(e), exception=traceback.format_exc()) if module.check_mode: (changed, output) = check_if_system_state_would_be_changed(module, gce) diff --git a/lib/ansible/modules/cloud/openstack/os_subnet.py b/lib/ansible/modules/cloud/openstack/os_subnet.py index 24f02a89de0..a4ac68047ee 100644 --- a/lib/ansible/modules/cloud/openstack/os_subnet.py +++ b/lib/ansible/modules/cloud/openstack/os_subnet.py @@ -234,8 +234,8 @@ def main(): allocation_pool_start=dict(type='str'), allocation_pool_end=dict(type='str'), host_routes=dict(type='list', default=None), - ipv6_ra_mode=dict(type='str', choice=ipv6_mode_choices), - ipv6_address_mode=dict(type='str', choice=ipv6_mode_choices), + ipv6_ra_mode=dict(type='str', choices=ipv6_mode_choices), + ipv6_address_mode=dict(type='str', choices=ipv6_mode_choices), use_default_subnetpool=dict(type='bool', default=False), extra_specs=dict(type='dict', default=dict()), state=dict(type='str', default='present', choices=['absent', 'present']), diff --git a/lib/ansible/modules/cloud/openstack/os_zone.py b/lib/ansible/modules/cloud/openstack/os_zone.py index 1bdda45ab6f..2103130d0bc 100644 --- a/lib/ansible/modules/cloud/openstack/os_zone.py +++ b/lib/ansible/modules/cloud/openstack/os_zone.py @@ -160,7 +160,7 @@ def _wait(timeout, cloud, zone, state, module, sdk): def main(): argument_spec = openstack_full_argument_spec( name=dict(required=True), - zone_type=dict(required=False, choice=['primary', 'secondary']), + zone_type=dict(required=False, choices=['primary', 'secondary']), email=dict(required=False, default=None), description=dict(required=False, default=None), ttl=dict(required=False, default=None, type='int'), diff --git a/lib/ansible/modules/network/cnos/cnos_static_route.py b/lib/ansible/modules/network/cnos/cnos_static_route.py index 3cbff5cec9f..b297f15db9a 100644 --- a/lib/ansible/modules/network/cnos/cnos_static_route.py +++ b/lib/ansible/modules/network/cnos/cnos_static_route.py @@ -241,7 +241,7 @@ def main(): interface=dict(type='str'), description=dict(type='str'), admin_distance=dict(type='str', default='1'), - tag=dict(tag='str'), + tag=dict(type='str'), state=dict(default='present', choices=['present', 'absent']) ) diff --git a/lib/ansible/modules/network/ios/ios_static_route.py b/lib/ansible/modules/network/ios/ios_static_route.py index c903af7e4d1..541a76a0c15 100644 --- a/lib/ansible/modules/network/ios/ios_static_route.py +++ b/lib/ansible/modules/network/ios/ios_static_route.py @@ -263,7 +263,7 @@ def main(): name=dict(type='str', aliases=['description']), admin_distance=dict(type='str'), track=dict(type='str'), - tag=dict(tag='str'), + tag=dict(type='str'), state=dict(default='present', choices=['present', 'absent']) ) diff --git a/lib/ansible/modules/network/meraki/meraki_firewalled_services.py b/lib/ansible/modules/network/meraki/meraki_firewalled_services.py index 57305bdf674..43842c343f4 100644 --- a/lib/ansible/modules/network/meraki/meraki_firewalled_services.py +++ b/lib/ansible/modules/network/meraki/meraki_firewalled_services.py @@ -135,10 +135,7 @@ data: sample: 192.0.1.0 ''' -import os -from ansible.module_utils.basic import AnsibleModule, json, env_fallback -from ansible.module_utils.urls import fetch_url -from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule, json from ansible.module_utils.common.dict_transformations import recursive_diff from ansible.module_utils.network.meraki.meraki import MerakiModule, meraki_argument_spec @@ -155,7 +152,7 @@ def main(): state=dict(type='str', default='present', choices=['query', 'present']), service=dict(type='str', default=None, choices=['ICMP', 'SNMP', 'web']), access=dict(type='str', choices=['blocked', 'restricted', 'unrestricted']), - allowed_ips=dict(type='list', element='str'), + allowed_ips=dict(type='list', elements='str'), ) mutually_exclusive = [('net_name', 'net_id')] @@ -184,7 +181,7 @@ def main(): org_id = meraki.params['org_id'] if not org_id: org_id = meraki.get_org_id(meraki.params['org_name']) - net_id = None + net_id = meraki.params['net_id'] if net_id is None: nets = meraki.get_nets(org_id=org_id) net_id = meraki.get_net_id(org_id, meraki.params['net_name'], data=nets) diff --git a/lib/ansible/modules/network/meraki/meraki_nat.py b/lib/ansible/modules/network/meraki/meraki_nat.py index b9e908eddd3..69c2f7e6573 100644 --- a/lib/ansible/modules/network/meraki/meraki_nat.py +++ b/lib/ansible/modules/network/meraki/meraki_nat.py @@ -68,6 +68,7 @@ options: description: - The physical WAN interface on which the traffic will arrive. choices: [both, internet1, internet2] + type: str allowed_inbound: description: - The ports this mapping will provide access on, and the remote IPs that will be allowed access to the resource. @@ -153,14 +154,15 @@ options: public_port: description: - A port or port ranges that will be forwarded to the host on the LAN. - type: str + type: int local_port: description: - A port or port ranges that will receive the forwarded traffic from the WAN. - type: str + type: int allowed_ips: description: - List of ranges of WAN IP addresses that are allowed to make inbound connections on the specified ports or port ranges (or any). + type: list protocol: description: - Protocol to forward traffic for. @@ -491,9 +493,9 @@ def main(): net_name=dict(type='str', aliases=['name', 'network']), state=dict(type='str', choices=['present', 'query'], default='present'), subset=dict(type='list', choices=['1:1', '1:many', 'all', 'port_forwarding'], default='all'), - one_to_one=dict(type='list', element='dict', options=one_to_one_spec), - one_to_many=dict(type='list', element='dict', options=one_to_many_spec), - port_forwarding=dict(type='list', element='dict', options=port_forwarding_spec), + one_to_one=dict(type='list', elements='dict', options=one_to_one_spec), + one_to_many=dict(type='list', elements='dict', options=one_to_many_spec), + port_forwarding=dict(type='list', elements='dict', options=port_forwarding_spec), ) # the AnsibleModule object will be our abstraction working with Ansible diff --git a/lib/ansible/modules/network/meraki/meraki_snmp.py b/lib/ansible/modules/network/meraki/meraki_snmp.py index 4dcfe698f85..097d9704b72 100644 --- a/lib/ansible/modules/network/meraki/meraki_snmp.py +++ b/lib/ansible/modules/network/meraki/meraki_snmp.py @@ -26,6 +26,7 @@ options: - Specifies whether SNMP information should be queried or modified. choices: ['query', 'present'] default: present + type: str v2c_enabled: description: - Specifies whether SNMPv2c is enabled. @@ -38,21 +39,26 @@ options: description: - Sets authentication mode for SNMPv3. choices: ['MD5', 'SHA'] + type: str v3_auth_pass: description: - Authentication password for SNMPv3. - Must be at least 8 characters long. + type: str v3_priv_mode: description: - Specifies privacy mode for SNMPv3. choices: ['DES', 'AES128'] + type: str v3_priv_pass: description: - Privacy password for SNMPv3. - Must be at least 8 characters long. + type: str peer_ips: description: - Semi-colon delimited IP addresses which can perform SNMP queries. + type: str net_name: description: - Name of network. @@ -228,10 +234,7 @@ data: returned: success, when network specified ''' -import os -from ansible.module_utils.basic import AnsibleModule, json, env_fallback -from ansible.module_utils.urls import fetch_url -from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule, json from ansible.module_utils.common.dict_transformations import recursive_diff, snake_dict_to_camel_dict from ansible.module_utils.network.meraki.meraki import MerakiModule, meraki_argument_spec @@ -317,19 +320,11 @@ def main(): peer_ips=dict(type='str'), access=dict(type='str', choices=['none', 'community', 'users']), community_string=dict(type='str', no_log=True), - users=dict(type='list', default=None, element='str', options=user_arg_spec), + users=dict(type='list', default=None, elements='', options=user_arg_spec), net_name=dict(type='str'), net_id=dict(type='str'), ) - # seed the result dict in the object - # we primarily care about changed and state - # change is if this module effectively modified the target - # state will include any data that you want your module to pass back - # for consumption, for example, in a subsequent task - result = dict( - changed=False, - ) # the AnsibleModule object will be our abstraction working with Ansible # this includes instantiation, a couple of common attr would be the # args/params passed to the execution, as well as if the module diff --git a/lib/ansible/modules/network/meraki/meraki_ssid.py b/lib/ansible/modules/network/meraki/meraki_ssid.py index 0c3f1a62dca..7148feadcf5 100644 --- a/lib/ansible/modules/network/meraki/meraki_ssid.py +++ b/lib/ansible/modules/network/meraki/meraki_ssid.py @@ -158,7 +158,7 @@ options: description: - Default VLAN ID. - Requires C(ip_assignment_mode) to be C(Bridge mode) or C(Layer 3 roaming). - type: str + type: int vlan_id: description: - ID number of VLAN on SSID. @@ -343,10 +343,7 @@ data: sample: 0 ''' -import os -from ansible.module_utils.basic import AnsibleModule, json, env_fallback -from ansible.module_utils.urls import fetch_url -from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule, json from ansible.module_utils.network.meraki.meraki import MerakiModule, meraki_argument_spec @@ -415,7 +412,7 @@ def main(): port=dict(type='int'), secret=dict(type='str', no_log=True), ) - vlan_arg_spec = dict(tags=dict(type='list'), + vlan_arg_spec = dict(tags=dict(type='list', elements='str'), vlan_id=dict(type='int'), ) @@ -424,7 +421,7 @@ def main(): number=dict(type='int', aliases=['ssid_number']), name=dict(type='str'), org_name=dict(type='str', aliases=['organization']), - org_id=dict(type='int'), + org_id=dict(type='str'), net_name=dict(type='str'), net_id=dict(type='str'), enabled=dict(type='bool'), @@ -444,12 +441,12 @@ def main(): 'Facebook Wi-Fi', 'Google OAuth', 'Sponsored guest']), - radius_servers=dict(type='list', default=None, element='dict', options=radius_arg_spec), + radius_servers=dict(type='list', default=None, elements='dict', options=radius_arg_spec), radius_coa_enabled=dict(type='bool'), radius_failover_policy=dict(type='str', choices=['Deny access', 'Allow access']), radius_load_balancing_policy=dict(type='str', choices=['Strict priority order', 'Round robin']), radius_accounting_enabled=dict(type='bool'), - radius_accounting_servers=dict(type='list', element='dict', options=radius_arg_spec), + radius_accounting_servers=dict(type='list', elements='dict', options=radius_arg_spec), ip_assignment_mode=dict(type='str', choices=['NAT mode', 'Bridge mode', 'Layer 3 roaming', @@ -459,7 +456,7 @@ def main(): concentrator_network_id=dict(type='str'), vlan_id=dict(type='int'), default_vlan_id=dict(type='int'), - ap_tags_vlan_ids=dict(type='list', default=None, element='dict', options=vlan_arg_spec), + ap_tags_vlan_ids=dict(type='list', default=None, elements='dict', options=vlan_arg_spec), walled_garden_enabled=dict(type='bool'), walled_garden_ranges=dict(type='list'), min_bitrate=dict(type='float', choices=[1, 2, 5.5, 6, 9, 11, 12, 18, 24, 36, 48, 54]), @@ -559,6 +556,12 @@ def main(): del i['vlan_id'] except KeyError: pass + try: + tags = ','.join(i['tags']) + del i['tags'] + i['tags'] = tags + except KeyError: + pass ssids = get_ssids(meraki, net_id) number = meraki.params['number'] if number is None: diff --git a/lib/ansible/modules/network/meraki/meraki_syslog.py b/lib/ansible/modules/network/meraki/meraki_syslog.py index 633948160a3..43bba92eb6c 100644 --- a/lib/ansible/modules/network/meraki/meraki_syslog.py +++ b/lib/ansible/modules/network/meraki/meraki_syslog.py @@ -46,19 +46,22 @@ options: type: str servers: description: - - List of syslog server settings + - List of syslog server settings. + type: list suboptions: host: description: - IP address or hostname of Syslog server. + type: str port: description: - Port number Syslog server is listening on. default: "514" + type: int roles: description: - List of applicable Syslog server roles. - choices: ['Wireless event log', + choices: ['Wireless Event log', 'Appliance event log', 'Switch event log', 'Air Marshal events', @@ -66,6 +69,7 @@ options: 'URLs', 'IDS alerts', 'Security events'] + type: list author: - Kevin Breit (@kbreit) @@ -136,10 +140,7 @@ data: sample: "Wireless event log, URLs" ''' -import os -from ansible.module_utils.basic import AnsibleModule, json, env_fallback -from ansible.module_utils.urls import fetch_url -from ansible.module_utils._text import to_native +from ansible.module_utils.basic import AnsibleModule, json from ansible.module_utils.common.dict_transformations import recursive_diff from ansible.module_utils.network.meraki.meraki import MerakiModule, meraki_argument_spec @@ -164,7 +165,7 @@ def main(): argument_spec = meraki_argument_spec() argument_spec.update(net_id=dict(type='str'), - servers=dict(type='list', element='dict', options=server_arg_spec), + servers=dict(type='list', elements='dict', options=server_arg_spec), state=dict(type='str', choices=['present', 'query'], default='present'), net_name=dict(type='str', aliases=['name', 'network']), ) diff --git a/test/sanity/ignore.txt b/test/sanity/ignore.txt index c4538dd20cc..9f8a4322bb2 100644 --- a/test/sanity/ignore.txt +++ b/test/sanity/ignore.txt @@ -1105,7 +1105,6 @@ lib/ansible/modules/cloud/openstack/os_volume.py validate-modules:doc-missing-ty lib/ansible/modules/cloud/openstack/os_volume.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/cloud/openstack/os_volume.py validate-modules:undocumented-parameter lib/ansible/modules/cloud/openstack/os_volume_snapshot.py validate-modules:doc-missing-type -lib/ansible/modules/cloud/openstack/os_zone.py validate-modules:doc-choices-do-not-match-spec lib/ansible/modules/cloud/openstack/os_zone.py validate-modules:doc-missing-type lib/ansible/modules/cloud/openstack/os_zone.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/cloud/oracle/oci_vcn.py validate-modules:parameter-type-not-in-doc @@ -3942,17 +3941,11 @@ lib/ansible/modules/network/meraki/meraki_mx_l3_firewall.py validate-modules:par lib/ansible/modules/network/meraki/meraki_mx_l7_firewall.py validate-modules:nonexistent-parameter-documented lib/ansible/modules/network/meraki/meraki_mx_l7_firewall.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_mx_l7_firewall.py pylint:ansible-bad-function -lib/ansible/modules/network/meraki/meraki_nat.py validate-modules:doc-type-does-not-match-spec -lib/ansible/modules/network/meraki/meraki_nat.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_network.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_organization.py validate-modules:parameter-type-not-in-doc -lib/ansible/modules/network/meraki/meraki_snmp.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_ssid.py validate-modules:doc-required-mismatch -lib/ansible/modules/network/meraki/meraki_ssid.py validate-modules:doc-type-does-not-match-spec lib/ansible/modules/network/meraki/meraki_switchport.py validate-modules:doc-required-mismatch lib/ansible/modules/network/meraki/meraki_switchport.py validate-modules:parameter-type-not-in-doc -lib/ansible/modules/network/meraki/meraki_syslog.py validate-modules:doc-choices-do-not-match-spec -lib/ansible/modules/network/meraki/meraki_syslog.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_vlan.py validate-modules:missing-suboption-docs lib/ansible/modules/network/meraki/meraki_vlan.py validate-modules:parameter-type-not-in-doc lib/ansible/modules/network/meraki/meraki_vlan.py validate-modules:undocumented-parameter