diff --git a/lib/ansible/modules/network/nxos/nxos_pim_interface.py b/lib/ansible/modules/network/nxos/nxos_pim_interface.py index 4290f8f5f4..02bd5c8349 100644 --- a/lib/ansible/modules/network/nxos/nxos_pim_interface.py +++ b/lib/ansible/modules/network/nxos/nxos_pim_interface.py @@ -28,96 +28,93 @@ extends_documentation_fragment: nxos version_added: "2.2" short_description: Manages PIM interface configuration. description: - - Manages PIM interface configuration settings. + - Manages PIM interface configuration settings. author: - - Jason Edelman (@jedelman8) + - Jason Edelman (@jedelman8) notes: - - When C(state=default), supported params will be reset to a default state. - These include C(dr_prio), C(hello_auth_key), C(hello_interval), C(jp_policy_out), - C(jp_policy_in), C(jp_type_in), C(jp_type_out), C(border), C(neighbor_policy), - C(neighbor_type). - - The C(hello_auth_key) param is not idempotent. - - C(hello_auth_key) only supports clear text passwords. - - When C(state=absent), pim interface configuration will be set to defaults and pim-sm - will be disabled on the interface. - - PIM must be enabled on the device to use this module. - - This module is for Layer 3 interfaces. + - When C(state=default), supported params will be reset to a default state. + These include C(dr_prio), C(hello_auth_key), C(hello_interval), C(jp_policy_out), + C(jp_policy_in), C(jp_type_in), C(jp_type_out), C(border), C(neighbor_policy), + C(neighbor_type). + - The C(hello_auth_key) param is not idempotent. + - C(hello_auth_key) only supports clear text passwords. + - When C(state=absent), pim interface configuration will be set to defaults and pim-sm + will be disabled on the interface. + - PIM must be enabled on the device to use this module. + - This module is for Layer 3 interfaces. options: - interface: - description: - - Full name of the interface such as Ethernet1/33. - required: true - sparse: - description: - - Enable/disable sparse-mode on the interface. - required: false - default: true - choices: ['true', 'false'] - hello_auth_key: - description: - - Authentication for hellos on this interface. - required: false - default: null - hello_interval: - description: - - Hello interval in milliseconds for this interface. - required: false - default: null - choices: ['true', 'false'] - jp_policy_out: - description: - - Policy for join-prune messages (outbound). - required: true - default: null - jp_policy_in: - description: - - Policy for join-prune messages (inbound). - required: false - default: null - jp_type_out: - description: - - Type of policy mapped to C(jp_policy_out). - required: false - default: null - choices: ['prefix', 'routemap'] - jp_type_in: - description: - - Type of policy mapped to C(jp_policy_in). - required: false - default: null - choices: ['prefix', 'routemap'] - border: - description: - - Configures interface to be a boundary of a PIM domain. - required: false - default: null - choices: ['true', 'false'] - neighbor_policy: - description: - - Configures a neighbor policy for filtering adjacencies. - required: false - default: null - neighbor_type: - description: - - Type of policy mapped to neighbor_policy. - required: false - default: null - choices: ['prefix', 'routemap'] - state: - description: - - Manages desired state of the resource. - required: false - default: present - choices: ['present', 'default'] + interface: + description: + - Full name of the interface such as Ethernet1/33. + required: true + sparse: + description: + - Enable/disable sparse-mode on the interface. + required: false + default: true + choices: ['true', 'false'] + hello_auth_key: + description: + - Authentication for hellos on this interface. + required: false + default: null + hello_interval: + description: + - Hello interval in milliseconds for this interface. + required: false + default: null + choices: ['true', 'false'] + jp_policy_out: + description: + - Policy for join-prune messages (outbound). + required: true + default: null + jp_policy_in: + description: + - Policy for join-prune messages (inbound). + required: false + default: null + jp_type_out: + description: + - Type of policy mapped to C(jp_policy_out). + required: false + default: null + choices: ['prefix', 'routemap'] + jp_type_in: + description: + - Type of policy mapped to C(jp_policy_in). + required: false + default: null + choices: ['prefix', 'routemap'] + border: + description: + - Configures interface to be a boundary of a PIM domain. + required: false + default: null + choices: ['true', 'false'] + neighbor_policy: + description: + - Configures a neighbor policy for filtering adjacencies. + required: false + default: null + neighbor_type: + description: + - Type of policy mapped to neighbor_policy. + required: false + default: null + choices: ['prefix', 'routemap'] + state: + description: + - Manages desired state of the resource. + required: false + default: present + choices: ['present', 'default'] ''' EXAMPLES = ''' # ensure PIM is not running on the interface - nxos_pim_interface: interface: eth1/33 state: absent - host: "{{ inventory_hostname }}" - username: "{{ un }}" - password: "{{ pwd }}" # ensure the interface has pim-sm enabled with the appropriate priority and hello interval - nxos_pim_interface: @@ -125,9 +122,6 @@ EXAMPLES = ''' dr_prio: 10 hello_interval: 40 state: present - host: "{{ inventory_hostname }}" - username: "{{ un }}" - password: "{{ pwd }}" # ensure join-prune policies exist - nxos_pim_interface: @@ -136,56 +130,20 @@ EXAMPLES = ''' jp_policy_out: JPOUT jp_type_in: routemap jp_type_out: routemap - host: "{{ inventory_hostname }}" - username: "{{ un }}" - password: "{{ pwd }}" # ensure defaults are in place - nxos_pim_interface: interface: eth1/33 state: default - host: "{{ inventory_hostname }}" - username: "{{ un }}" - password: "{{ pwd }}" ''' RETURN = ''' -proposed: - description: k/v pairs of parameters passed into module - returned: always - type: dict - sample: {"interface": "eth1/33", "neighbor_policy": "test", - "neighbor_type": "routemap", "sparse": true} -existing: - description: - - k/v pairs of existing configuration - returned: always - type: dict - sample: {"border": false, "dr_prio": "1", "hello_interval": "30000", - "isauth": false, "jp_bidir": false, "jp_policy_in": "JPIN", - "jp_policy_out": "1", "jp_type_in": "routemap", - "jp_type_out": null, "neighbor_policy": "test1", - "neighbor_type": "prefix", "sparse": true} -end_state: - description: k/v pairs of configuration after module execution - returned: always - type: dict - sample: {"border": false, "dr_prio": "1", "hello_interval": "30000", - "isauth": false, "jp_bidir": false, "jp_policy_in": "JPIN", - "jp_policy_out": "1", "jp_type_in": "routemap", - "jp_type_out": null, "neighbor_policy": "test", - "neighbor_type": "routemap", "sparse": true} -updates: +commands: description: command sent to the device returned: always type: list sample: ["interface eth1/33", "ip pim neighbor-policy test", "ip pim neighbor-policy test"] -changed: - description: check to see if a change was made on the device - returned: always - type: boolean - sample: true ''' @@ -193,23 +151,29 @@ from ansible.module_utils.nxos import get_config, load_config, run_commands from ansible.module_utils.nxos import nxos_argument_spec, check_args from ansible.module_utils.basic import AnsibleModule -import time -import re -import re +PARAM_TO_COMMAND_KEYMAP = { + 'interface': '', + 'sparse': 'ip pim sparse-mode', + 'dr_prio': 'ip pim dr-priority {0}', + 'hello_interval': 'ip pim hello-interval {0}', + 'hello_auth_key': 'ip pim hello-authentication ah-md5 {0}', + 'border': 'ip pim border', + 'jp_policy_out': 'ip pim jp-policy prefix-list {0} out', + 'jp_policy_in': 'ip pim jp-policy prefix-list {0} in', + 'jp_type_in': '', + 'jp_type_out': '', + 'neighbor_policy': 'ip pim neighbor-policy prefix-list {0}', + 'neighbor_type': '', +} -def execute_show_command(command, module, command_type='cli_show', text=False): - if module.params['transport'] == 'cli': - if 'show run' not in command and text is False: - command += ' | json' - cmds = [command] - body = run_commands(module, cmds) - elif module.params['transport'] == 'nxapi': - cmds = [command] - body = run_commands(module, cmds) +def execute_show_command(command, module, text=False): + if text is False: + command += ' | json' - return body + cmds = [command] + return run_commands(module, cmds) def flatten_list(command_lists): @@ -254,10 +218,9 @@ def get_interface_type(interface): def get_interface_mode(interface, intf_type, module): - command = 'show interface {0}'.format(interface) + command = 'show interface {0} | json'.format(interface) mode = 'unknown' - interface_table = {} - body = execute_show_command(command, module) + body = run_commands(module, [command]) try: interface_table = body[0]['TABLE_interface']['ROW_interface'] @@ -279,8 +242,7 @@ def get_pim_interface(module, interface): pim_interface = {} command = 'show ip pim interface {0}'.format(interface) - body = execute_show_command(command, module, - command_type='cli_show_ascii', text=True) + body = execute_show_command(command, module, text=True) if body: if 'not running' not in body[0]: @@ -297,7 +259,7 @@ def get_pim_interface(module, interface): hello_interval = get_data.get('hello-interval-sec') if hello_interval: - hello_interval_msec = int(get_data.get('hello-interval-sec'))*1000 + hello_interval_msec = int(get_data.get('hello-interval-sec')) * 1000 pim_interface['hello_interval'] = str(hello_interval_msec) border = get_data.get('is-border') @@ -334,9 +296,7 @@ def get_pim_interface(module, interface): except (KeyError, AttributeError, TypeError, IndexError): return {} - command = 'show run interface {0}'.format(interface) - - body = execute_show_command(command, module, command_type='cli_show_ascii') + body = get_config(module, flags=['interface {0}'.format(interface)]) jp_configs = [] neigh = None @@ -417,30 +377,12 @@ def config_pim_interface(delta, existing, jp_bidir, isauth): delta = fix_delta(delta, existing) - CMDS = { - 'sparse': 'ip pim sparse-mode', - 'dr_prio': 'ip pim dr-priority {0}', - 'hello_interval': 'ip pim hello-interval {0}', - 'hello_auth_key': 'ip pim hello-authentication ah-md5 {0}', - 'border': 'ip pim border', - 'jp_policy_out': 'ip pim jp-policy prefix-list {0} out', - 'jp_policy_in': 'ip pim jp-policy prefix-list {0} in', - 'jp_type_in': '', - 'jp_type_out': '', - 'neighbor_policy': 'ip pim neighbor-policy prefix-list {0}', - 'neighbor_type': '' - } - if jp_bidir: if delta.get('jp_policy_in') or delta.get('jp_policy_out'): if existing.get('jp_type_in') == 'prefix': - command = 'no ip pim jp-policy prefix-list {0}'.format( - existing.get('jp_policy_in') - ) + command = 'no ip pim jp-policy prefix-list {0}'.format(existing.get('jp_policy_in')) else: - command = 'no ip pim jp-policy {0}'.format( - existing.get('jp_policy_in') - ) + command = 'no ip pim jp-policy {0}'.format(existing.get('jp_policy_in')) if command: commands.append(command) @@ -448,12 +390,12 @@ def config_pim_interface(delta, existing, jp_bidir, isauth): if k in ['dr_prio', 'hello_interval', 'hello_auth_key', 'border', 'sparse']: if v: - command = CMDS.get(k).format(v) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(v) elif k == 'hello_auth_key': if isauth: command = 'no ip pim hello-authentication ah-md5' else: - command = 'no ' + CMDS.get(k).format(v) + command = 'no ' + PARAM_TO_COMMAND_KEYMAP.get(k).format(v) if command: commands.append(command) @@ -463,33 +405,33 @@ def config_pim_interface(delta, existing, jp_bidir, isauth): temp = delta.get('neighbor_policy') or existing.get( 'neighbor_policy') if delta.get('neighbor_type') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif delta.get('neighbor_type') == 'routemap': command = 'ip pim neighbor-policy {0}'.format(temp) elif existing.get('neighbor_type') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif existing.get('neighbor_type') == 'routemap': command = 'ip pim neighbor-policy {0}'.format(temp) elif k in ['jp_policy_in', 'jp_type_in']: temp = delta.get('jp_policy_in') or existing.get( 'jp_policy_in') if delta.get('jp_type_in') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif delta.get('jp_type_in') == 'routemap': command = 'ip pim jp-policy {0} in'.format(temp) elif existing.get('jp_type_in') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif existing.get('jp_type_in') == 'routemap': command = 'ip pim jp-policy {0} in'.format(temp) elif k in ['jp_policy_out', 'jp_type_out']: temp = delta.get('jp_policy_out') or existing.get( 'jp_policy_out') if delta.get('jp_type_out') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif delta.get('jp_type_out') == 'routemap': command = 'ip pim jp-policy {0} out'.format(temp) elif existing.get('jp_type_out') == 'prefix': - command = CMDS.get(k).format(temp) + command = PARAM_TO_COMMAND_KEYMAP.get(k).format(temp) elif existing.get('jp_type_out') == 'routemap': command = 'ip pim jp-policy {0} out'.format(temp) if command: @@ -521,35 +463,33 @@ def default_pim_interface_policies(existing, jp_bidir): if jp_bidir: if existing.get('jp_policy_in') or existing.get('jp_policy_out'): if existing.get('jp_type_in') == 'prefix': - command = 'no ip pim jp-policy prefix-list {0}'.format( - existing.get('jp_policy_in') - ) + command = 'no ip pim jp-policy prefix-list {0}'.format(existing.get('jp_policy_in')) if command: commands.append(command) elif not jp_bidir: command = None - for k, v in existing.items(): + for k in existing: if k == 'jp_policy_in': if existing.get('jp_policy_in'): if existing.get('jp_type_in') == 'prefix': command = 'no ip pim jp-policy prefix-list {0} in'.format( existing.get('jp_policy_in') - ) + ) else: command = 'no ip pim jp-policy {0} in'.format( existing.get('jp_policy_in') - ) + ) elif k == 'jp_policy_out': if existing.get('jp_policy_out'): if existing.get('jp_type_out') == 'prefix': command = 'no ip pim jp-policy prefix-list {0} out'.format( existing.get('jp_policy_out') - ) + ) else: command = 'no ip pim jp-policy {0} out'.format( existing.get('jp_policy_out') - ) + ) if command: commands.append(command) command = None @@ -581,7 +521,7 @@ def config_pim_interface_defaults(existing, jp_bidir, isauth): def main(): - argument_spec=dict( + argument_spec = dict( interface=dict(required=True), sparse=dict(type='bool', default=True), dr_prio=dict(type='str'), @@ -594,22 +534,17 @@ def main(): border=dict(type='bool'), neighbor_policy=dict(type='str'), neighbor_type=dict(choices=['prefix', 'routemap']), - state=dict(choices=['present', 'absent', 'default'], - default='present'), + state=dict(choices=['present', 'absent', 'default'], default='present'), ) - argument_spec.update(nxos_argument_spec) - module = AnsibleModule(argument_spec=argument_spec, - supports_check_mode=True) + module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) warnings = list() check_args(module, warnings) - + results = {'changed': False, 'commands': [], 'warnings': warnings} state = module.params['state'] - - sparse = module.params['sparse'] interface = module.params['interface'] jp_type_in = module.params['jp_type_in'] jp_type_out = module.params['jp_type_out'] @@ -628,49 +563,24 @@ def main(): module.fail_json(msg='jp_type_in required when using jp_policy_in.') if jp_policy_out: if not jp_type_out: - module.fail_json(msg='jp_type_out required when using ' - ' jp_policy_out.') + module.fail_json(msg='jp_type_out required when using jp_policy_out.') if neighbor_policy: if not neighbor_type: - module.fail_json(msg='neighbor_type required when using ' - 'neighbor_policy.') + module.fail_json(msg='neighbor_type required when using neighbor_policy.') get_existing = get_pim_interface(module, interface) existing, jp_bidir, isauth = local_existing(get_existing) - end_state = existing - changed = False - commands = [] - - args = [ - 'interface', - 'sparse', - 'dr_prio', - 'hello_auth_key', - 'hello_interval', - 'jp_policy_out', - 'jp_type_out', - 'jp_type_in', - 'jp_policy_in', - 'border', - 'neighbor_type', - 'neighbor_policy' - ] + args = PARAM_TO_COMMAND_KEYMAP.keys() proposed = dict((k, v) for k, v in module.params.items() if v is not None and k in args) - ''' - CANNOT_ABSENT = ['dr_prio', 'hello_interval', - 'hello_auth_key', 'jp_policy_out', 'jp_policy_in', - 'jp_type_out', 'jp_type_in', 'border', 'neighbor_type', - 'neighbor_policy'] - ''' - if hello_interval: proposed['hello_interval'] = str(proposed['hello_interval'] * 1000) delta = dict(set(proposed.items()).difference(existing.items())) + commands = [] if state == 'present': if delta: command = config_pim_interface(delta, existing, jp_bidir, isauth) @@ -696,29 +606,17 @@ def main(): commands.insert(0, ['interface {0}'.format(interface)]) cmds = flatten_list(commands) - results = {} if cmds: - if module.check_mode: - module.exit_json(changed=True, commands=cmds) - else: - changed = True + results['changed'] = True + if not module.check_mode: load_config(module, cmds) - time.sleep(1) - get_existing = get_pim_interface(module, interface) - end_state, jp_bidir, isauth = local_existing(get_existing) - if 'configure' in cmds: - cmds.pop(0) + if 'configure' in cmds: + cmds.pop(0) - results['proposed'] = proposed - results['existing'] = existing - results['updates'] = cmds - results['changed'] = changed - results['warnings'] = warnings - results['end_state'] = end_state + results['commands'] = cmds module.exit_json(**results) if __name__ == '__main__': main() - diff --git a/test/sanity/pep8/legacy-files.txt b/test/sanity/pep8/legacy-files.txt index 48169e7bb2..6ce250daf3 100644 --- a/test/sanity/pep8/legacy-files.txt +++ b/test/sanity/pep8/legacy-files.txt @@ -363,7 +363,6 @@ lib/ansible/modules/network/nxos/nxos_ntp_auth.py lib/ansible/modules/network/nxos/nxos_ntp_options.py lib/ansible/modules/network/nxos/nxos_nxapi.py lib/ansible/modules/network/nxos/nxos_overlay_global.py -lib/ansible/modules/network/nxos/nxos_pim_interface.py lib/ansible/modules/network/nxos/nxos_ping.py lib/ansible/modules/network/nxos/nxos_smu.py lib/ansible/modules/network/nxos/nxos_snapshot.py diff --git a/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 b/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 new file mode 100644 index 0000000000..f478350f0d --- /dev/null +++ b/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_interface_eth2_1 @@ -0,0 +1,96 @@ +{ + "TABLE_interface": { + "ROW_interface": { + "interface": "Ethernet2/1", + "state": "up", + "admin_state": "up", + "share_state": "Dedicated", + "eth_hw_desc": "Ethernet", + "eth_hw_addr": "fa16.3e00.0001", + "eth_bia_addr": "fa16.3e27.f279", + "desc": "to nxos03", + "eth_ip_addr": "10.0.0.45", + "eth_ip_mask": 30, + "eth_ip_prefix": "10.0.0.44", + "eth_mtu": "1500", + "eth_bw": 1000000, + "eth_dly": 10, + "eth_reliability": "255", + "eth_txload": "1", + "eth_rxload": "1", + "medium": "broadcast", + "eth_mode": "routed", + "eth_duplex": "full", + "eth_speed": "1000 Mb/s", + "eth_beacon": "off", + "eth_autoneg": "off", + "eth_in_flowctrl": "off", + "eth_out_flowctrl": "off", + "eth_mdix": "off", + "eth_swt_monitor": "off", + "eth_ethertype": "0x8100", + "eth_eee_state": "n/a", + "eth_link_flapped": "14week(s) 0day(s)", + "eth_clear_counters": "never", + "eth_reset_cntr": 1, + "eth_load_interval1_rx": 0, + "eth_inrate1_bits": 0, + "eth_inrate1_pkts": 0, + "eth_load_interval1_tx": 0, + "eth_outrate1_bits": 0, + "eth_outrate1_pkts": 0, + "eth_inrate1_summary_bits": "0 bps", + "eth_inrate1_summary_pkts": "0 pps", + "eth_outrate1_summary_bits": "0 bps", + "eth_outrate1_summary_pkts": "0 pps", + "eth_load_interval2_rx": 0, + "eth_inrate2_bits": 0, + "eth_inrate2_pkts": 0, + "eth_load_interval2_tx": 0, + "eth_outrate2_bits": 0, + "eth_outrate2_pkts": 0, + "eth_inrate2_summary_bits": "0 bps", + "eth_inrate2_summary_pkts": "0 pps", + "eth_outrate2_summary_bits": "0 bps", + "eth_outrate2_summary_pkts": "0 pps", + "eth_inucast": 0, + "eth_inmcast": 0, + "eth_inbcast": 0, + "eth_inpkts": 0, + "eth_inbytes": 0, + "eth_jumbo_inpkts": 0, + "eth_storm_supp": 0, + "eth_runts": 0, + "eth_giants": 0, + "eth_crc": 0, + "eth_nobuf": 0, + "eth_inerr": 0, + "eth_frame": 0, + "eth_overrun": 0, + "eth_underrun": 0, + "eth_ignored": 0, + "eth_watchdog": 0, + "eth_bad_eth": 0, + "eth_bad_proto": 0, + "eth_in_ifdown_drops": 0, + "eth_dribble": 0, + "eth_indiscard": 0, + "eth_inpause": 0, + "eth_outucast": 0, + "eth_outmcast": 0, + "eth_outbcast": 0, + "eth_outpkts": 0, + "eth_outbytes": 0, + "eth_jumbo_outpkts": 0, + "eth_outerr": 0, + "eth_coll": 0, + "eth_deferred": 0, + "eth_latecoll": 0, + "eth_lostcarrier": 0, + "eth_nocarrier": 0, + "eth_babbles": 0, + "eth_outdiscard": 0, + "eth_outpause": 0 + } + } +} diff --git a/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 b/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 new file mode 100644 index 0000000000..dc851bec72 --- /dev/null +++ b/test/units/modules/network/nxos/fixtures/nxos_pim_interface/show_ip_pim_interface_eth2_1 @@ -0,0 +1,70 @@ +{ + "TABLE_vrf": { + "ROW_vrf": { + "vrf-name": "default", + "TABLE_iod": { + "ROW_iod": { + "if-name": "Ethernet2/1", + "if-status": "protocol-up/link-up/admin-up", + "if-addr-summary": "IP address: 10.0.0.45, IP subnet: 10.0.0.44/30", + "pim-dr-address": "10.0.0.45", + "dr-priority": 1, + "nbr-cnt": 0, + "hello-interval-sec": 30, + "hello-timer": "PT3S", + "holdtime-sec": 105, + "if-conf-dr-priority": 1, + "if-conf-delay": 3, + "is-border": "false", + "genid": "38c4b959", + "isauth-config": "false", + "nbr-policy-name": "none configured", + "jp-in-policy-name": "JPIN", + "jp-out-policy-name": "JPOUT", + "jp-interval": 1, + "jp-next-send": 1, + "pim-bfd-enabled": "no", + "is-passive": "false", + "is-pim-vpc-svi": "no", + "is-auto-enabled": "no", + "last-cleared": "PT0S", + "hello-sent": 23, + "hello-rcvd": 0, + "hello-early-sent": 0, + "jp-sent": 0, + "jp-rcvd": 0, + "assert-sent": 0, + "assert-rcvd": 0, + "graft-sent": 0, + "graft-rcvd": 0, + "graft-ack-sent": 0, + "graft-ack-rcvd": 0, + "df-offer-sent": 0, + "df-offer-rcvd": 0, + "df-winner-sent": 0, + "df-winner-rcvd": 0, + "df-backoff-sent": 0, + "df-backoff-rcvd": 0, + "pass-sent": 0, + "pass-rcvd": 0, + "cksum-errors": 0, + "invalid-errors": 0, + "invalid-df-errors": 0, + "auth-failed": 0, + "pak-len-errors": 0, + "ver-errors": 0, + "pkts-self": 0, + "pkts-non-nbr": 0, + "pkts-on-passive": 0, + "jp-rcvd-on-rpf": 0, + "jp-rcvd-no-rp": 0, + "jp-rcvd-wrong-rp": 0, + "jp-rcvd-for-ssm": 0, + "jp-rcvd-for-bidir": 0, + "jp-in-policy-filter": 0, + "jp-out-policy-filter": 0 + } + } + } + } +} diff --git a/test/units/modules/network/nxos/test_nxos_pim_interface.py b/test/units/modules/network/nxos/test_nxos_pim_interface.py new file mode 100644 index 0000000000..e3ad7b45b9 --- /dev/null +++ b/test/units/modules/network/nxos/test_nxos_pim_interface.py @@ -0,0 +1,86 @@ +# (c) 2016 Red Hat Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible.compat.tests.mock import patch +from ansible.modules.network.nxos import nxos_pim_interface +from .nxos_module import TestNxosModule, load_fixture, set_module_args + + +class TestNxosIPInterfaceModule(TestNxosModule): + + module = nxos_pim_interface + + def setUp(self): + self.mock_load_config = patch('ansible.modules.network.nxos.nxos_pim_interface.load_config') + self.load_config = self.mock_load_config.start() + + self.mock_run_commands = patch('ansible.modules.network.nxos.nxos_pim_interface.run_commands') + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + self.mock_load_config.stop() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None, device=''): + module_name = self.module.__name__.rsplit('.', 1)[1] + + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for command in commands: + filename = str(command).split(' | ')[0].replace(' ', '_').replace('/', '_') + output.append(load_fixture(module_name, filename)) + return output + + self.load_config.return_value = None + self.run_commands.side_effect = load_from_file + + def test_nxos_pim_interface_present(self): + set_module_args(dict(interface='eth2/1', dr_prio=10, hello_interval=40)) + self.execute_module( + changed=True, + commands=['interface eth2/1', 'ip pim dr-priority 10', + 'ip pim hello-interval 40000', 'ip pim sparse-mode'] + ) + + def test_nxos_pim_interface_jp(self): + set_module_args(dict( + interface='eth2/1', jp_policy_in='JPIN', jp_policy_out='JPOUT', + jp_type_in='routemap', jp_type_out='routemap', + )) + self.execute_module( + changed=True, + commands=['interface eth2/1', 'ip pim jp-policy JPOUT out', + 'ip pim jp-policy JPIN in', 'ip pim sparse-mode'] + ) + + def test_nxos_pim_interface_default(self): + set_module_args(dict(interface='eth2/1', state='default')) + self.execute_module( + changed=True, + commands=['interface eth2/1', 'ip pim dr-priority 1', + 'no ip pim border', 'ip pim hello-interval 30000'] + ) + + def test_nxos_pim_interface_ip_absent(self): + set_module_args(dict(interface='eth2/1', state='absent')) + self.execute_module(changed=False, commands=[])