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:
parent
ce3d1c6ba0
commit
a37c5e53e6
3 changed files with 51 additions and 8 deletions
|
@ -139,6 +139,7 @@ commands:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import json
|
||||||
|
|
||||||
from functools import partial
|
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)
|
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):
|
def map_obj_to_commands(updates, module):
|
||||||
commands = list()
|
commands = list()
|
||||||
state = module.params['state']
|
state = module.params['state']
|
||||||
|
@ -168,7 +177,7 @@ def map_obj_to_commands(updates, module):
|
||||||
want, have = update
|
want, have = update
|
||||||
|
|
||||||
if want['state'] == 'absent':
|
if want['state'] == 'absent':
|
||||||
commands.append('no username %s' % want['name'])
|
commands.append(user_del_cmd(want['name']))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if needs_update(want, have, 'view'):
|
if needs_update(want, have, 'view'):
|
||||||
|
@ -185,7 +194,7 @@ def map_obj_to_commands(updates, module):
|
||||||
if want['nopassword']:
|
if want['nopassword']:
|
||||||
add(commands, want, 'nopassword')
|
add(commands, want, 'nopassword')
|
||||||
else:
|
else:
|
||||||
add(commands, want, 'no username %s nopassword' % want['name'])
|
add(commands, want, user_del_cmd(want['name']))
|
||||||
|
|
||||||
return commands
|
return commands
|
||||||
|
|
||||||
|
@ -336,14 +345,15 @@ def main():
|
||||||
have_users = [x['name'] for x in have]
|
have_users = [x['name'] for x in have]
|
||||||
for item in set(have_users).difference(want_users):
|
for item in set(have_users).difference(want_users):
|
||||||
if item != 'admin':
|
if item != 'admin':
|
||||||
commands.append('no username %s' % item)
|
commands.append(user_del_cmd(item))
|
||||||
|
|
||||||
result['commands'] = commands
|
result['commands'] = commands
|
||||||
|
|
||||||
# the ios cli prevents this by rule so capture it and display
|
# the ios cli prevents this by rule so capture it and display
|
||||||
# a nice failure message
|
# a nice failure message
|
||||||
if 'no username admin' in commands:
|
for cmd in commands:
|
||||||
module.fail_json(msg='cannot delete the `admin` account')
|
if 'no username admin' in cmd:
|
||||||
|
module.fail_json(msg='cannot delete the `admin` account')
|
||||||
|
|
||||||
if commands:
|
if commands:
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
|
|
|
@ -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)
|
- name: Create user (SetUp)
|
||||||
ios_user:
|
ios_user:
|
||||||
name: ansibletest1
|
name: ansibletest1
|
||||||
|
@ -75,4 +86,6 @@
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- 'result.changed == true'
|
- '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]'
|
||||||
|
|
|
@ -53,7 +53,17 @@ class TestIosUserModule(TestIosModule):
|
||||||
def test_ios_user_delete(self):
|
def test_ios_user_delete(self):
|
||||||
set_module_args(dict(name='ansible', state='absent'))
|
set_module_args(dict(name='ansible', state='absent'))
|
||||||
result = self.execute_module(changed=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_password(self):
|
def test_ios_user_password(self):
|
||||||
set_module_args(dict(name='ansible', password='test'))
|
set_module_args(dict(name='ansible', password='test'))
|
||||||
|
@ -72,7 +82,17 @@ class TestIosUserModule(TestIosModule):
|
||||||
def test_ios_user_purge(self):
|
def test_ios_user_purge(self):
|
||||||
set_module_args(dict(purge=True))
|
set_module_args(dict(purge=True))
|
||||||
result = self.execute_module(changed=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):
|
def test_ios_user_view(self):
|
||||||
set_module_args(dict(name='ansible', view='test'))
|
set_module_args(dict(name='ansible', view='test'))
|
||||||
|
|
Loading…
Reference in a new issue