diff --git a/plugins/modules/ipagroup.py b/plugins/modules/ipagroup.py index 55855f446e407f43a9590a8b9d05e1f6ea0a1d9a..98204219394524783db7ee40c320a6cb211809b0 100644 --- a/plugins/modules/ipagroup.py +++ b/plugins/modules/ipagroup.py @@ -376,6 +376,13 @@ def main(): # Make sure group exists res_find = find_group(ansible_module, name) + user_add, user_del = [], [] + group_add, group_del = [], [] + service_add, service_del = [], [] + externalmember_add, externalmember_del = [], [] + membermanager_user_add, membermanager_user_del = [], [] + membermanager_group_add, membermanager_group_del = [], [] + # Create command if state == "present": # Can't change an existing posix group @@ -440,45 +447,6 @@ def main(): externalmember_del) = gen_add_del_lists( externalmember, res_find.get("member_external")) - # setup member args for add/remove members. - add_member_args = { - "user": user_add, - "group": group_add, - } - del_member_args = { - "user": user_del, - "group": group_del, - } - if has_add_member_service: - add_member_args["service"] = service_add - del_member_args["service"] = service_del - - if is_external_group(res_find): - add_member_args["ipaexternalmember"] = \ - externalmember_add - del_member_args["ipaexternalmember"] = \ - externalmember_del - elif externalmember or external: - ansible_module.fail_json( - msg="Cannot add external members to a " - "non-external group." - ) - - # Add members - add_members = any([user_add, group_add, - service_add, externalmember_add]) - if add_members: - commands.append( - [name, "group_add_member", add_member_args] - ) - # Remove members - remove_members = any([user_del, group_del, - service_del, externalmember_del]) - if remove_members: - commands.append( - [name, "group_remove_member", del_member_args] - ) - membermanager_user_add, membermanager_user_del = \ gen_add_del_lists( membermanager_user, @@ -491,93 +459,30 @@ def main(): res_find.get("membermanager_group") ) - if has_add_membermanager: - # Add membermanager users and groups - if len(membermanager_user_add) > 0 or \ - len(membermanager_group_add) > 0: - commands.append( - [name, "group_add_member_manager", - { - "user": membermanager_user_add, - "group": membermanager_group_add, - }] - ) - # Remove member manager - if len(membermanager_user_del) > 0 or \ - len(membermanager_group_del) > 0: - commands.append( - [name, "group_remove_member_manager", - { - "user": membermanager_user_del, - "group": membermanager_group_del, - }] - ) - elif action == "member": if res_find is None: ansible_module.fail_json(msg="No group '%s'" % name) - add_member_args = { - "user": user, - "group": group, - } - if has_add_member_service: - add_member_args["service"] = service - if is_external_group(res_find): - add_member_args["ipaexternalmember"] = externalmember - elif externalmember: - ansible_module.fail_json( - msg="Cannot add external members to a " - "non-external group." - ) - # Reduce add lists for member_user, member_group, # member_service and member_external to new entries # only that are not in res_find. - if user is not None and "member_user" in res_find: - user = gen_add_list( - user, res_find["member_user"]) - if group is not None and "member_group" in res_find: - group = gen_add_list( - group, res_find["member_group"]) - if service is not None and "member_service" in res_find: - service = gen_add_list( - service, res_find["member_service"]) - if externalmember is not None \ - and "member_external" in res_find: - externalmember = gen_add_list( - externalmember, res_find["member_external"]) - - if any([user, group, service, externalmember]): - commands.append( - [name, "group_add_member", add_member_args] - ) - - if has_add_membermanager: - # Reduce add list for membermanager_user and - # membermanager_group to new entries only that are - # not in res_find. - if membermanager_user is not None \ - and "membermanager_user" in res_find: - membermanager_user = gen_add_list( - membermanager_user, - res_find["membermanager_user"]) - if membermanager_group is not None \ - and "membermanager_group" in res_find: - membermanager_group = gen_add_list( - membermanager_group, - res_find["membermanager_group"]) - - # Add membermanager users and groups - if membermanager_user is not None or \ - membermanager_group is not None: - commands.append( - [name, "group_add_member_manager", - { - "user": membermanager_user, - "group": membermanager_group, - }] - ) + user_add = gen_add_list( + user, res_find.get("member_user")) + group_add = gen_add_list( + group, res_find.get("member_group")) + service_add = gen_add_list( + service, res_find.get("member_service")) + externalmember_add = gen_add_list( + externalmember, res_find.get("member_external")) + + membermanager_user_add = gen_add_list( + membermanager_user, + res_find.get("membermanager_user") + ) + membermanager_group_add = gen_add_list( + membermanager_group, + res_find.get("membermanager_group") + ) elif state == "absent": if action == "group": @@ -588,70 +493,91 @@ def main(): if res_find is None: ansible_module.fail_json(msg="No group '%s'" % name) - del_member_args = { - "user": user, - "group": group, - } - if has_add_member_service: - del_member_args["service"] = service - if is_external_group(res_find): - del_member_args["ipaexternalmember"] = externalmember - elif externalmember: + if not is_external_group(res_find) and externalmember: ansible_module.fail_json( msg="Cannot add external members to a " "non-external group." ) - # Reduce del lists of member_user, member_group, - # member_service and member_external to the entries only - # that are in res_find. - if user is not None: - user = gen_intersection_list( - user, res_find.get("member_user")) - if group is not None: - group = gen_intersection_list( - group, res_find.get("member_group")) - if service is not None: - service = gen_intersection_list( - service, res_find.get("member_service")) - if externalmember is not None: - externalmember = gen_intersection_list( - externalmember, res_find.get("member_external")) - - if any([user, group, service, externalmember]): - commands.append( - [name, "group_remove_member", del_member_args] - ) - - if has_add_membermanager: - # Reduce del lists of membermanager_user and - # membermanager_group to the entries only that are - # in res_find. - if membermanager_user is not None: - membermanager_user = gen_intersection_list( - membermanager_user, - res_find.get("membermanager_user")) - if membermanager_group is not None: - membermanager_group = gen_intersection_list( - membermanager_group, - res_find.get("membermanager_group")) - - # Remove membermanager users and groups - if membermanager_user is not None or \ - membermanager_group is not None: - commands.append( - [name, "group_remove_member_manager", - { - "user": membermanager_user, - "group": membermanager_group, - }] - ) - + user_del = gen_intersection_list( + user, res_find.get("member_user")) + group_del = gen_intersection_list( + group, res_find.get("member_group")) + service_del = gen_intersection_list( + service, res_find.get("member_service")) + externalmember_del = gen_intersection_list( + externalmember, res_find.get("member_external")) + + membermanager_user_del = gen_intersection_list( + membermanager_user, res_find.get("membermanager_user")) + membermanager_group_del = gen_intersection_list( + membermanager_group, + res_find.get("membermanager_group") + ) else: ansible_module.fail_json(msg="Unkown state '%s'" % state) - # Execute commands + # manage members + # setup member args for add/remove members. + add_member_args = { + "user": user_add, + "group": group_add, + } + del_member_args = { + "user": user_del, + "group": group_del, + } + if has_add_member_service: + add_member_args["service"] = service_add + del_member_args["service"] = service_del + + if is_external_group(res_find): + add_member_args["ipaexternalmember"] = \ + externalmember_add + del_member_args["ipaexternalmember"] = \ + externalmember_del + elif externalmember or external: + ansible_module.fail_json( + msg="Cannot add external members to a " + "non-external group." + ) + # Add members + add_members = any([user_add, group_add, + service_add, externalmember_add]) + if add_members: + commands.append( + [name, "group_add_member", add_member_args] + ) + # Remove members + remove_members = any([user_del, group_del, + service_del, externalmember_del]) + if remove_members: + commands.append( + [name, "group_remove_member", del_member_args] + ) + + # manage membermanager members + if has_add_membermanager: + # Add membermanager users and groups + if any([membermanager_user_add, membermanager_group_add]): + commands.append( + [name, "group_add_member_manager", + { + "user": membermanager_user_add, + "group": membermanager_group_add, + }] + ) + # Remove member manager + if any([membermanager_user_del, membermanager_group_del]): + commands.append( + [name, "group_remove_member_manager", + { + "user": membermanager_user_del, + "group": membermanager_group_del, + }] + ) + # Execute commands changed = ansible_module.execute_ipa_commands( commands, fail_on_member_errors=True) diff --git a/tests/group/test_group.yml b/tests/group/test_group.yml index 74b170c5bcbefcd159a5ade037c2cce9aa9b53b7..eaf484f54e4f6061883fef7e1493bbf942d84b03 100644 --- a/tests/group/test_group.yml +++ b/tests/group/test_group.yml @@ -174,6 +174,129 @@ register: result failed_when: result.changed or result.failed + - name: Ensure groups group3, group2, and group1 are absent + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group3,group2,group1 + state: absent + register: result + failed_when: not result.changed or result.failed + + - name: Ensure group group1 is present + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + register: result + failed_when: not result.changed or result.failed + + - name: Ensure users user1, user2 are present in group group1 + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + action: member + register: result + failed_when: not result.changed or result.failed + + - name: Ensure users user1, user2 and user3 are present in group group1 + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + - user3 + action: member + register: result + failed_when: not result.changed or result.failed + + - name: Ensure users user1, user2 are present in group group1, again + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + action: member + register: result + failed_when: result.changed or result.failed + + - name: Ensure users user1, user2 and user3 are present in group group1, again + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + - user3 + action: member + register: result + failed_when: result.changed or result.failed + + - name: Ensure group group1 is absent + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + state: absent + register: result + failed_when: not result.changed or result.failed + + - name: Ensure group group1 with users user1, user2 is present + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + register: result + failed_when: not result.changed or result.failed + + - name: Ensure group group1 with users user1, user2 and user3 is present + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + - user3 + register: result + failed_when: not result.changed or result.failed + + - name: Ensure group group1 with users user1, user2 and user3 is present, again + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + - user3 + action: member + register: result + failed_when: result.changed or result.failed + + - name: Ensure only users user1, user2 are present in group group1 + ipagroup: + ipaadmin_password: SomeADMINpassword + ipaapi_context: "{{ ipa_context | default(omit) }}" + name: group1 + user: + - user1 + - user2 + register: result + failed_when: not result.changed or result.failed + - name: Ensure group group3, group2 and group1 are absent ipagroup: ipaadmin_password: SomeADMINpassword