diff --git a/lib/ansible/modules/network/vyos/vyos_user.py b/lib/ansible/modules/network/vyos/vyos_user.py index 45872e43c10..cd017b7ed41 100644 --- a/lib/ansible/modules/network/vyos/vyos_user.py +++ b/lib/ansible/modules/network/vyos/vyos_user.py @@ -159,7 +159,10 @@ def spec_to_commands(updates, module): continue if needs_update(want, have, 'level'): - add(commands, want, 'level %s' % want['level']) + add(commands, want, "level %s" % want['level']) + + if needs_update(want, have, 'full_name'): + add(commands, want, "full-name %s" % want['full_name']) if needs_update(want, have, 'password'): if update_password == 'always' or not have: @@ -168,24 +171,41 @@ def spec_to_commands(updates, module): return commands -def config_to_dict(module): - data = get_config(module) - instances = [] +def parse_level(data): + match = re.search(r'level (\S+)', data, re.M) + if match: + level = match.group(1)[1:-1] + return level + - config = {'name': [], 'level': [], 'full_name': [], 'password': None, 'state': 'present'} +def parse_full_name(data): + match = re.search(r'full-name (\S+)', data, re.M) + if match: + full_name = match.group(1)[1:-1] + return full_name - for line in data.split('\n'): - if line.startswith('set system login user'): - match = re.findall(r'user (\S+)', line, re.M) - config['name'].extend(match) - if 'level' in line: - match = re.findall(r'level (\S+)', line, re.M) - config['level'].extend(match) - if 'full-name' in line: - match = re.findall(r'full-name (\S+)', line, re.M) - config['full_name'].extend(match) - instances = [config] +def config_to_dict(module): + data = get_config(module) + + match = re.findall(r'^set system login user (\S+)', data, re.M) + if not match: + return list() + + instances = list() + + for user in set(match): + regex = r' %s .+$' % user + cfg = re.findall(regex, data, re.M) + cfg = '\n'.join(cfg) + obj = { + 'name': user, + 'state': 'present', + 'password': None, + 'level': parse_level(cfg), + 'full_name': parse_full_name(cfg) + } + instances.append(obj) return instances @@ -234,6 +254,7 @@ def map_params_to_obj(module): for item in collection: get_value = partial(get_param_value, item=item, module=module) item['password'] = get_value('password') + item['full_name'] = get_value('full_name') item['level'] = get_value('level') item['state'] = get_value('state') objects.append(item) @@ -243,7 +264,6 @@ def map_params_to_obj(module): def update_objects(want, have): updates = list() - for entry in want: item = next((i for i in have if i['name'] == entry['name']), None) if item is None: @@ -292,8 +312,7 @@ def main(): if module.params['purge']: want_users = [x['name'] for x in want] - for x in have: - have_users = x['name'] + have_users = [x['name'] for x in have] for item in set(have_users).difference(want_users): commands.append('delete system login user %s' % item) diff --git a/test/integration/targets/vyos_user/tests/cli/basic.yaml b/test/integration/targets/vyos_user/tests/cli/basic.yaml index e2d0716309b..3a4fcbbfb8b 100644 --- a/test/integration/targets/vyos_user/tests/cli/basic.yaml +++ b/test/integration/targets/vyos_user/tests/cli/basic.yaml @@ -33,6 +33,7 @@ name: ansibletest1 password: test state: present + update_password: on_create provider: "{{ cli }}" register: result diff --git a/test/units/modules/network/vyos/test_vyos_user.py b/test/units/modules/network/vyos/test_vyos_user.py index 15628eb5088..e8403adf9b2 100644 --- a/test/units/modules/network/vyos/test_vyos_user.py +++ b/test/units/modules/network/vyos/test_vyos_user.py @@ -77,8 +77,7 @@ class TestVyosUserModule(TestVyosModule): def test_vyos_user_update_password_on_create_ok(self): set_module_args(dict(name='ansible', password='test', update_password='on_create')) - result = self.execute_module(changed=True) - self.assertEqual(result['commands'], ['set system login user ansible authentication plaintext-password test']) + self.execute_module() def test_vyos_user_update_password_always(self): set_module_args(dict(name='ansible', password='test', update_password='always'))