fix prompt error when deleting ios user (#28175)

* fix prompt error when deleting ios user

* placate pep8

* wrap delete user command in function

* fix python 3 unit tests
This commit is contained in:
David Newswanger 2017-08-16 05:45:41 -04:00 committed by Trishna Guha
parent ce3d1c6ba0
commit a37c5e53e6
3 changed files with 51 additions and 8 deletions

View file

@ -139,6 +139,7 @@ commands:
"""
import re
import json
from functools import partial
@ -153,6 +154,14 @@ def validate_privilege(value, module):
module.fail_json(msg='privilege must be between 1 and 15, got %s' % value)
def user_del_cmd(username):
return json.dumps({
'command': 'no username %s' % username,
'prompt': 'This operation will remove all username related configurations with same name',
'answer': 'y'
})
def map_obj_to_commands(updates, module):
commands = list()
state = module.params['state']
@ -168,7 +177,7 @@ def map_obj_to_commands(updates, module):
want, have = update
if want['state'] == 'absent':
commands.append('no username %s' % want['name'])
commands.append(user_del_cmd(want['name']))
continue
if needs_update(want, have, 'view'):
@ -185,7 +194,7 @@ def map_obj_to_commands(updates, module):
if want['nopassword']:
add(commands, want, 'nopassword')
else:
add(commands, want, 'no username %s nopassword' % want['name'])
add(commands, want, user_del_cmd(want['name']))
return commands
@ -336,14 +345,15 @@ def main():
have_users = [x['name'] for x in have]
for item in set(have_users).difference(want_users):
if item != 'admin':
commands.append('no username %s' % item)
commands.append(user_del_cmd(item))
result['commands'] = commands
# the ios cli prevents this by rule so capture it and display
# a nice failure message
if 'no username admin' in commands:
module.fail_json(msg='cannot delete the `admin` account')
for cmd in commands:
if 'no username admin' in cmd:
module.fail_json(msg='cannot delete the `admin` account')
if commands:
if not module.check_mode:

View file

@ -1,4 +1,15 @@
---
- name: tear down old users if they exist (Setup)
ios_user:
aggregate:
- name: ansibletest1
- name: ansibletest2
- name: ansibletest3
state: absent
authorize: yes
provider: "{{ cli }}"
register: result
- name: Create user (SetUp)
ios_user:
name: ansibletest1
@ -75,4 +86,6 @@
- assert:
that:
- 'result.changed == true'
- 'result.commands == ["no username ansibletest1", "no username ansibletest2", "no username ansibletest3"]'
- '"no username ansibletest1" in result.commands[0]'
- '"no username ansibletest2" in result.commands[1]'
- '"no username ansibletest3" in result.commands[2]'

View file

@ -53,7 +53,17 @@ class TestIosUserModule(TestIosModule):
def test_ios_user_delete(self):
set_module_args(dict(name='ansible', state='absent'))
result = self.execute_module(changed=True)
self.assertEqual(result['commands'], ['no username ansible'])
cmd = json.loads(
'{"answer": "y", ' +
'"prompt": "This operation will remove all username related ' +
'configurations with same name", "command": "no username ansible"}'
)
result_cmd = []
for i in result['commands']:
result_cmd.append(json.loads(i))
self.assertEqual(result_cmd, [cmd])
def test_ios_user_password(self):
set_module_args(dict(name='ansible', password='test'))
@ -72,7 +82,17 @@ class TestIosUserModule(TestIosModule):
def test_ios_user_purge(self):
set_module_args(dict(purge=True))
result = self.execute_module(changed=True)
self.assertEqual(result['commands'], ['no username ansible'])
cmd = json.loads(
'{"answer": "y", ' +
'"prompt": "This operation will remove all username related ' +
'configurations with same name", "command": "no username ansible"}'
)
result_cmd = []
for i in result['commands']:
result_cmd.append(json.loads(i))
self.assertEqual(result_cmd, [cmd])
def test_ios_user_view(self):
set_module_args(dict(name='ansible', view='test'))