From 14ae3ba8c0d8233e7e1f38c94c49acdbbd68d841 Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Tue, 21 Jan 2020 11:37:38 +0530 Subject: [PATCH] Fixed argument spec for multiple modules - Part II (#65497) This change contains fixes for argument spec and respective datatypes. Created separate PR since these changes might alter the behavior of these modules. Will need shipit from individual module owner(s). Signed-off-by: Abhijeet Kasurde --- changelogs/fragments/additional_spec_fix.yml | 2 ++ .../cloud/google/gce_instance_template.py | 5 ++-- .../modules/cloud/openstack/os_subnet.py | 4 ++-- .../modules/cloud/openstack/os_zone.py | 2 +- .../modules/network/cnos/cnos_static_route.py | 2 +- .../modules/network/ios/ios_static_route.py | 2 +- .../meraki/meraki_firewalled_services.py | 9 +++----- .../modules/network/meraki/meraki_nat.py | 12 ++++++---- .../modules/network/meraki/meraki_snmp.py | 21 +++++++---------- .../modules/network/meraki/meraki_ssid.py | 23 +++++++++++-------- .../modules/network/meraki/meraki_syslog.py | 15 ++++++------ test/sanity/ignore.txt | 7 ------ 12 files changed, 49 insertions(+), 55 deletions(-) create mode 100644 changelogs/fragments/additional_spec_fix.yml 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