diff --git a/lib/ansible/modules/network/nxos/nxos_vrrp.py b/lib/ansible/modules/network/nxos/nxos_vrrp.py index 18ff5a2637e..733c1dd4923 100644 --- a/lib/ansible/modules/network/nxos/nxos_vrrp.py +++ b/lib/ansible/modules/network/nxos/nxos_vrrp.py @@ -49,31 +49,38 @@ options: description: - Full name of interface that is being managed for VRRP. required: true + interval: + description: + - Time interval between advertisement or 'default' keyword + required: false + default: 1 + version_added: 2.6 priority: description: - - VRRP priority. + - VRRP priority or 'default' keyword required: false - default: null + default: 100 preempt: description: - Enable/Disable preempt. choices: ['True', 'False'] + default: True vip: description: - - VRRP virtual IP address. + - VRRP virtual IP address or 'default' keyword required: false default: null authentication: description: - - Clear text authentication string. + - Clear text authentication string or 'default' keyword required: false default: null admin_state: description: - Used to enable or disable the VRRP process. required: false - choices: ['shutdown', 'no shutdown'] - default: no shutdown + choices: ['shutdown', 'no shutdown', 'default'] + default: shutdown state: description: - Specify desired state of the resource. @@ -121,6 +128,14 @@ from ansible.module_utils.network.nxos.nxos import get_capabilities, nxos_argume from ansible.module_utils.basic import AnsibleModule +PARAM_TO_DEFAULT_KEYMAP = { + 'priority': '100', + 'interval': '1', + 'vip': '0.0.0.0', + 'admin_state': 'shutdown', +} + + def execute_show_command(command, module): if 'show run' not in command: output = 'json' @@ -253,12 +268,12 @@ def get_existing_vrrp(interface, group, module, name): if parsed_vrrp['group'] == group: parsed_vrrp['admin_state'] = get_vrr_status(group, module, name) - return parsed_vrrp + return vrrp -def get_commands_config_vrrp(delta, group): +def get_commands_config_vrrp(delta, existing, group): commands = [] CMDS = { @@ -266,32 +281,34 @@ def get_commands_config_vrrp(delta, group): 'preempt': 'preempt', 'vip': 'address {0}', 'interval': 'advertisement-interval {0}', - 'auth': 'authentication text {0}' + 'auth': 'authentication text {0}', + 'admin_state': '{0}', } - vip = delta.get('vip') - priority = delta.get('priority') + for arg in ['vip', 'priority', 'interval', 'admin_state']: + val = delta.get(arg) + if val == 'default': + val = PARAM_TO_DEFAULT_KEYMAP.get(arg) + if val != existing.get(arg): + commands.append((CMDS.get(arg)).format(val)) + elif val: + commands.append((CMDS.get(arg)).format(val)) + preempt = delta.get('preempt') - interval = delta.get('interval') auth = delta.get('authentication') - admin_state = delta.get('admin_state') - if vip: - commands.append((CMDS.get('vip')).format(vip)) - if priority: - commands.append((CMDS.get('priority')).format(priority)) if preempt: commands.append(CMDS.get('preempt')) elif preempt is False: commands.append('no ' + CMDS.get('preempt')) - if interval: - commands.append((CMDS.get('interval')).format(interval)) if auth: - commands.append((CMDS.get('auth')).format(auth)) - if admin_state: - commands.append(admin_state) + if auth != 'default': + commands.append((CMDS.get('auth')).format(auth)) + elif existing.get('authentication'): + commands.append('no authentication') - commands.insert(0, 'vrrp {0}'.format(group)) + if commands: + commands.insert(0, 'vrrp {0}'.format(group)) return commands @@ -329,12 +346,13 @@ def main(): argument_spec = dict( group=dict(required=True, type='str'), interface=dict(required=True), + interval=dict(required=False, type='str'), priority=dict(required=False, type='str'), preempt=dict(required=False, type='bool'), vip=dict(required=False, type='str'), admin_state=dict(required=False, type='str', - choices=['shutdown', 'no shutdown'], - default='no shutdown'), + choices=['shutdown', 'no shutdown', 'default'], + default='shutdown'), authentication=dict(required=False, type='str'), state=dict(choices=['absent', 'present'], required=False, default='present') ) @@ -349,6 +367,7 @@ def main(): interface = module.params['interface'].lower() group = module.params['group'] priority = module.params['priority'] + interval = module.params['interval'] preempt = module.params['preempt'] vip = module.params['vip'] authentication = module.params['authentication'] @@ -375,7 +394,7 @@ def main(): 'a layer 3 port first.', interface=interface) args = dict(group=group, priority=priority, preempt=preempt, - vip=vip, authentication=authentication, + vip=vip, authentication=authentication, interval=interval, admin_state=admin_state) proposed = dict((k, v) for k, v in args.items() if v is not None) @@ -389,8 +408,9 @@ def main(): delta = dict( set(proposed.items()).difference(existing.items())) if delta: - command = get_commands_config_vrrp(delta, group) - commands.append(command) + command = get_commands_config_vrrp(delta, existing, group) + if command: + commands.append(command) elif state == 'absent': if existing: commands.append(['no vrrp {0}'.format(group)]) diff --git a/test/integration/targets/nxos_vrrp/tests/common/sanity.yaml b/test/integration/targets/nxos_vrrp/tests/common/sanity.yaml index ae915ff5734..67b7b2acd94 100644 --- a/test/integration/targets/nxos_vrrp/tests/common/sanity.yaml +++ b/test/integration/targets/nxos_vrrp/tests/common/sanity.yaml @@ -26,7 +26,7 @@ interface: vlan10 group: 100 vip: 10.1.100.1 - admin_state: shutdown + admin_state: 'no shutdown' provider: "{{ connection }}" register: result @@ -42,13 +42,27 @@ that: - "result.changed == false" + - name: Ensure vrrp group 100 is default + nxos_vrrp: &configure_def + interface: vlan10 + group: 100 + vip: default + admin_state: default + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "Conf Idempotence" + nxos_vrrp: *configure_def + register: result + + - assert: *false + - name: Ensure removal of the vrrp group config - # vip is required to ensure the user knows what they are removing nxos_vrrp: &remove interface: vlan10 group: 100 - vip: 10.1.100.1 - admin_state: shutdown state: absent provider: "{{ connection }}" register: result @@ -72,7 +86,8 @@ interface: vlan10 group: 100 vip: 10.1.100.1 - preempt: false + preempt: False + interval: 10 priority: 130 authentication: AUTHKEY provider: "{{ connection }}" @@ -86,6 +101,26 @@ - assert: *false + - name: Re-config with defaults + nxos_vrrp: &reconfig_def + interface: vlan10 + group: 100 + vip: default + preempt: True + interval: default + priority: default + authentication: default + provider: "{{ connection }}" + register: result + + - assert: *true + + - name: "Reconfig Idempotence" + nxos_vrrp: *reconfig_def + register: result + + - assert: *false + always: - name: remove vrrp nxos_vrrp: *remove