From 86d88abcc78897c51e8fee935708628a05906bd4 Mon Sep 17 00:00:00 2001 From: Amita Sharma Date: Thu, 9 Nov 2017 18:41:05 +0530 Subject: [PATCH] Ticket - lib389 - Python 3 support for memberof plugin test suit Bug Description: ticket49064_test.py tests did not support python 3 Fix Description: Move the test file from tickets to suits/memberof_plugin/regression_test.py, fix config_memberof and other methods to use DSLdapObject, create test users and test groups using DSLdapObject in test case, fix some docstrings and add more comments. Remove add_user, add_group, update_member and memberof_fixup_task methods. Remove ticket49064_test.py from dirsrvtests/tests/tickets/ https://pagure.io/lib389/issue/3 Reviewed by: William Brown (Huge Thanks!) --- .../suites/memberof_plugin/regression_test.py | 241 +++++++++++++++++++ dirsrvtests/tests/tickets/ticket49064_test.py | 261 --------------------- 2 files changed, 241 insertions(+), 261 deletions(-) create mode 100644 dirsrvtests/tests/suites/memberof_plugin/regression_test.py delete mode 100644 dirsrvtests/tests/tickets/ticket49064_test.py diff --git a/dirsrvtests/tests/suites/memberof_plugin/regression_test.py b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py new file mode 100644 index 0000000..6ba4217 --- /dev/null +++ b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py @@ -0,0 +1,241 @@ +import logging +import pytest +import os +import time +import ldap +import subprocess +from lib389.utils import ds_is_older +from lib389.topologies import topology_m1h1c1 as topo +from lib389._constants import * +from lib389.plugins import MemberOfPlugin +from lib389 import agreement +from lib389.idm.user import UserAccount, UserAccounts, TEST_USER_PROPERTIES +from lib389.idm.group import Groups, Group + +# Skip on older versions +pytestmark = pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented") + +USER_CN='user_' +GROUP_CN='group_' + +DEBUGGING = os.getenv("DEBUGGING", default=False) +if DEBUGGING: + logging.getLogger(__name__).setLevel(logging.DEBUG) +else: + logging.getLogger(__name__).setLevel(logging.INFO) +log = logging.getLogger(__name__) + + +def config_memberof(server): + # Configure fractional to prevent total init to send memberof + memberof = MemberOfPlugin(server) + memberof.enable() + memberof.set_autoaddoc('nsMemberOf') + server.restart() + ents = server.agreement.list(suffix=DEFAULT_SUFFIX) + for ent in ents: + log.info('update %s to add nsDS5ReplicatedAttributeListTotal' % ent.dn) + server.agreement.setProperties(agmnt_dn=ents[0].dn, + properties={RA_FRAC_EXCLUDE:'(objectclass=*) $ EXCLUDE memberOf', + RA_FRAC_EXCLUDE_TOTAL_UPDATE:'(objectclass=*) $ EXCLUDE '}) + + +def send_updates_now(server): + ents = server.agreement.list(suffix=DEFAULT_SUFFIX) + for ent in ents: + server.agreement.pause(ent.dn) + server.agreement.resume(ent.dn) + + +def _find_memberof(server, member_dn, group_dn): + #To get the specific server's (M1, C1 and H1) user and group + user = UserAccount(server, member_dn) + assert user.exists() + group = Group(server, group_dn) + assert group.exists() + + #test that the user entry should have memberof attribute with sepecified group dn value + assert group._dn in user.get_attr_vals_utf8('memberOf') + + +@pytest.mark.bz1352121 +def test_memberof_with_repl(topo): + """Test that we allowed to enable MemberOf plugin in dedicated consumer + + :id: 60c11636-55a1-4704-9e09-2c6bcc828de4 + :setup: 1 Master - 1 Hub - 1 Consumer + :steps: + 1. Configure replication to EXCLUDE memberof + 2. Enable memberof plugin + 3. Create users/groups + 4. Make user_0 member of group_0 + 5. Checks that user_0 is memberof group_0 on M,H,C + 6. Make group_0 member of group_1 (nest group) + 7. Checks that user_0 is memberof group_0 and group_1 on M,H,C + 8. Check group_0 is memberof group_1 on M,H,C + 9. Remove group_0 from group_1 + 10. Check group_0 and user_0 are NOT memberof group_1 on M,H,C + 11. Remove user_0 from group_0 + 12. Check user_0 is not memberof group_0 and group_1 on M,H,C + 13. Disable memberof on C + 14. make user_0 member of group_1 + 15. Checks that user_0 is memberof group_0 on M,H but not on C + 16. Enable memberof on C + 17. Checks that user_0 is memberof group_0 on M,H but not on C + 18. Run memberof fixup task + 19. Checks that user_0 is memberof group_0 on M,H,C + :expectedresults: + 1. Configuration should be successful + 2. Plugin should be enabled + 3. Users and groups should be created + 4. user_0 should be member of group_0 + 5. user_0 should be memberof group_0 on M,H,C + 6. group_0 should be member of group_1 + 7. user_0 should be memberof group_0 and group_1 on M,H,C + 8. group_0 should be memberof group_1 on M,H,C + 9. group_0 from group_1 removal should be successful + 10. group_0 and user_0 should not be memberof group_1 on M,H,C + 11. user_0 from group_0 remove should be successful + 12. user_0 should not be memberof group_0 and group_1 on M,H,C + 13. memberof should be disabled on C + 14. user_0 should be member of group_1 + 15. user_0 should be memberof group_0 on M,H and should not on C + 16. Enable memberof on C should be successful + 17. user_0 should be memberof group_0 on M,H should not on C + 18. memberof fixup task should be successful + 19. user_0 should be memberof group_0 on M,H,C + """ + + M1 = topo.ms["master1"] + H1 = topo.hs["hub1"] + C1 = topo.cs["consumer1"] + + # Step 1 & 2 + M1.config.enable_log('audit') + config_memberof(M1) + M1.restart() + + H1.config.enable_log('audit') + config_memberof(H1) + H1.restart() + + C1.config.enable_log('audit') + config_memberof(C1) + C1.restart() + + #Declare lists of users and groups + test_users = [] + test_groups = [] + + # Step 3 + #In for loop create users and add them in the user list + #it creates user_0 to user_9 (range is fun) + for i in range(10): + CN = '%s%d' % (USER_CN, i) + users = UserAccounts(M1, SUFFIX) + user_props = TEST_USER_PROPERTIES.copy() + user_props.update({'uid': CN, 'cn': CN, 'sn': '_%s' % CN}) + testuser = users.create(properties=user_props) + time.sleep(2) + test_users.append(testuser) + + #In for loop create groups and add them to the group list + #it creates group_0 to group_2 (range is fun) + for i in range(3): + CN = '%s%d' % (GROUP_CN, i) + groups = Groups(M1, SUFFIX) + testgroup = groups.create(properties={'cn' : CN}) + time.sleep(2) + test_groups.append(testgroup) + + # Step 4 + #Now start testing by adding differnt user to differn group + if not ds_is_older('1.3.7'): + test_groups[0].remove('objectClass', 'nsMemberOf') + + member_dn = test_users[0].dn + grp0_dn = test_groups[0].dn + grp1_dn = test_groups[1].dn + + test_groups[0].add_member(member_dn) + time.sleep(5) + + # Step 5 + for i in [M1, H1, C1]: + _find_memberof(i, member_dn, grp0_dn) + + # Step 6 + test_groups[1].add_member(test_groups[0].dn) + time.sleep(5) + + # Step 7 + for i in [grp0_dn, grp1_dn]: + for inst in [M1, H1, C1]: + _find_memberof(inst, member_dn, i) + + # Step 8 + for i in [M1, H1, C1]: + _find_memberof(i, grp0_dn, grp1_dn) + + # Step 9 + test_groups[1].remove_member(test_groups[0].dn) + time.sleep(5) + + # Step 10 + # For negative testcase, we are using assertionerror + for inst in [M1, H1, C1]: + for i in [grp0_dn, member_dn]: + with pytest.raises(AssertionError): + _find_memberof(inst, i, grp1_dn) + + # Step 11 + test_groups[0].remove_member(member_dn) + time.sleep(5) + + # Step 12 + for inst in [M1, H1, C1]: + for grp in [grp0_dn, grp1_dn]: + with pytest.raises(AssertionError): + _find_memberof(inst, member_dn, grp) + + # Step 13 + C1.plugins.disable(name=PLUGIN_MEMBER_OF) + C1.restart() + + # Step 14 + test_groups[0].add_member(member_dn) + time.sleep(5) + + # Step 15 + for i in [M1, H1]: + _find_memberof(i, member_dn, grp0_dn) + with pytest.raises(AssertionError): + _find_memberof(C1, member_dn, grp0_dn) + + # Step 16 + memberof = MemberOfPlugin(C1) + memberof.enable() + C1.restart() + + # Step 17 + for i in [M1, H1]: + _find_memberof(i, member_dn, grp0_dn) + with pytest.raises(AssertionError): + _find_memberof(C1, member_dn, grp0_dn) + + # Step 18 + memberof.fixup(SUFFIX) + time.sleep(5) + + # Step 19 + for i in [M1, H1, C1]: + _find_memberof(i, member_dn, grp0_dn) + + +if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode + CURRENT_FILE = os.path.realpath(__file__) + pytest.main("-s %s" % CURRENT_FILE) + + diff --git a/dirsrvtests/tests/tickets/ticket49064_test.py b/dirsrvtests/tests/tickets/ticket49064_test.py deleted file mode 100644 index 772adb0..0000000 --- a/dirsrvtests/tests/tickets/ticket49064_test.py +++ /dev/null @@ -1,261 +0,0 @@ -import logging -import pytest -import os -import time -import ldap -import subprocess -from lib389.utils import ds_is_older -from lib389.topologies import topology_m1h1c1 as topo -from lib389._constants import * -from lib389 import Entry - -# Skip on older versions -pytestmark = pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented") - -USER_CN='user_' -GROUP_CN='group_' -FIXUP_FILTER = '(objectClass=*)' -FIXUP_CMD = 'fixup-memberof.pl' - -DEBUGGING = os.getenv("DEBUGGING", default=False) -if DEBUGGING: - logging.getLogger(__name__).setLevel(logging.DEBUG) -else: - logging.getLogger(__name__).setLevel(logging.INFO) -log = logging.getLogger(__name__) - -def memberof_fixup_task(server): - sbin_dir = server.get_sbin_dir() - memof_task = os.path.join(sbin_dir, FIXUP_CMD) - try: - output = subprocess.check_output( - [memof_task, '-D', DN_DM, '-w', PASSWORD, '-b', SUFFIX, '-Z', SERVERID_CONSUMER_1, '-f', FIXUP_FILTER]) - except subprocess.CalledProcessError as err: - output = err.output - log.info('output: {}'.format(output)) - expected = "Successfully added task entry" - assert expected in output - -def config_memberof(server): - - server.plugins.enable(name=PLUGIN_MEMBER_OF) - MEMBEROF_PLUGIN_DN = ('cn=' + PLUGIN_MEMBER_OF + ',cn=plugins,cn=config') - server.modify_s(MEMBEROF_PLUGIN_DN, [(ldap.MOD_REPLACE, - 'memberOfAllBackends', - 'on'), - (ldap.MOD_REPLACE, 'memberOfAutoAddOC', 'nsMemberOf')]) - # Configure fractional to prevent total init to send memberof - ents = server.agreement.list(suffix=DEFAULT_SUFFIX) - for ent in ents: - log.info('update %s to add nsDS5ReplicatedAttributeListTotal' % ent.dn) - server.modify_s(ent.dn, - [(ldap.MOD_REPLACE, - 'nsDS5ReplicatedAttributeListTotal', - '(objectclass=*) $ EXCLUDE '), - (ldap.MOD_REPLACE, - 'nsDS5ReplicatedAttributeList', - '(objectclass=*) $ EXCLUDE memberOf')]) - - -def send_updates_now(server): - - ents = server.agreement.list(suffix=DEFAULT_SUFFIX) - for ent in ents: - server.agreement.pause(ent.dn) - server.agreement.resume(ent.dn) - -def add_user(server, no, desc='dummy', sleep=True): - cn = '%s%d' % (USER_CN, no) - dn = 'cn=%s,ou=people,%s' % (cn, SUFFIX) - log.fatal('Adding user (%s): ' % dn) - server.add_s(Entry((dn, {'objectclass': ['top', 'person', 'inetuser'], - 'sn': ['_%s' % cn], - 'description': [desc]}))) - if sleep: - time.sleep(2) - -def add_group(server, nr, sleep=True): - cn = '%s%d' % (GROUP_CN, nr) - dn = 'cn=%s,ou=groups,%s' % (cn, SUFFIX) - server.add_s(Entry((dn, {'objectclass': ['top', 'groupofnames'], - 'description': 'group %d' % nr}))) - if sleep: - time.sleep(2) - -def update_member(server, member_dn, group_dn, op, sleep=True): - mod = [(op, 'member', member_dn)] - server.modify_s(group_dn, mod) - if sleep: - time.sleep(2) - -def _find_memberof(server, member_dn, group_dn, find_result=True): - ent = server.getEntry(member_dn, ldap.SCOPE_BASE, "(objectclass=*)", ['memberof']) - found = False - if ent.hasAttr('memberof'): - - for val in ent.getValues('memberof'): - server.log.info("!!!!!!! %s: memberof->%s" % (member_dn, val)) - server.log.info("!!!!!!! %s" % (val)) - server.log.info("!!!!!!! %s" % (group_dn)) - if val.lower() == group_dn.lower(): - found = True - break - - if find_result: - assert (found) - else: - assert (not found) - - -def test_ticket49064(topo): - """Specify a test case purpose or name here - - :id: 60c11636-55a1-4704-9e09-2c6bcc828de4 - :setup: 1 Master - 1 Hub - 1 Consumer - :steps: - 1. Configure replication to EXCLUDE memberof - 2. Enable memberof plugin - 3. Create users/groups - 4. make user_1 member of group_1 - 5. Checks that user_1 is memberof group_1 on M,H,C - 6. make group_1 member of group_2 (nest group) - 7. Checks that user_1 is memberof group_1 and group_2 on M,H,C - 8. Check group_1 is memberof group_2 on M,H,C - 9. remove group_1 from group_2 - 10. Check group_1 and user_1 are NOT memberof group_2 on M,H,C - 11. remove user_1 from group_1 - 12. Check user_1 is NOT memberof group_1 and group_2 on M,H,C - 13. Disable memberof on C1 - 14. make user_1 member of group_1 - 15. Checks that user is memberof group_1 on M,H but not on C - 16. Enable memberof on C1 - 17. Checks that user is memberof group_1 on M,H but not on C - 18. Run memberof fixup task - 19. Checks that user is memberof group_1 on M,H,C - - - :expectedresults: - no assert for membership check - """ - - - M1 = topo.ms["master1"] - H1 = topo.hs["hub1"] - C1 = topo.cs["consumer1"] - - # Step 1 & 2 - M1.config.enable_log('audit') - config_memberof(M1) - M1.restart() - - H1.config.enable_log('audit') - config_memberof(H1) - H1.restart() - - C1.config.enable_log('audit') - config_memberof(C1) - C1.restart() - - # Step 3 - for i in range(10): - add_user(M1, i, desc='add on m1') - for i in range(3): - add_group(M1, i) - - # Step 4 - member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN, 1, SUFFIX) - group_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX) - update_member(M1, member_dn, group_dn, ldap.MOD_ADD, sleep=True) - - # Step 5 - for i in [M1, H1, C1]: - _find_memberof(i, member_dn, group_dn, find_result=True) - - - # Step 6 - user_dn = 'cn=%s%d,ou=people,%s' % (USER_CN, 1, SUFFIX) - grp1_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX) - grp2_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 2, SUFFIX) - update_member(M1, grp1_dn, grp2_dn, ldap.MOD_ADD, sleep=True) - - # Step 7 - for i in [grp1_dn, grp2_dn]: - for inst in [M1, H1, C1]: - _find_memberof(inst, user_dn, i, find_result=True) - - # Step 8 - for i in [M1, H1, C1]: - _find_memberof(i, grp1_dn, grp2_dn, find_result=True) - - # Step 9 - user_dn = 'cn=%s%d,ou=people,%s' % (USER_CN, 1, SUFFIX) - grp1_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX) - grp2_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 2, SUFFIX) - update_member(M1, grp1_dn, grp2_dn, ldap.MOD_DELETE, sleep=True) - - # Step 10 - for inst in [M1, H1, C1]: - for i in [grp1_dn, user_dn]: - _find_memberof(inst, i, grp2_dn, find_result=False) - - # Step 11 - member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN, 1, SUFFIX) - group_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX) - update_member(M1, member_dn, group_dn, ldap.MOD_DELETE, sleep=True) - - # Step 12 - for inst in [M1, H1, C1]: - for grp in [grp1_dn, grp2_dn]: - _find_memberof(inst, member_dn, grp, find_result=False) - - # Step 13 - C1.plugins.disable(name=PLUGIN_MEMBER_OF) - C1.restart() - - # Step 14 - member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN, 1, SUFFIX) - group_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX) - update_member(M1, member_dn, group_dn, ldap.MOD_ADD, sleep=True) - # to give time to the update to go up to the C1 - time.sleep(10) - - # Step 15 - for i in [M1, H1]: - _find_memberof(i, member_dn, group_dn, find_result=True) - _find_memberof(C1, member_dn, group_dn, find_result=False) - - # Step 16 - C1.plugins.enable(name=PLUGIN_MEMBER_OF) - C1.restart() - - # Step 17 - for i in [M1, H1]: - _find_memberof(i, member_dn, group_dn, find_result=True) - _find_memberof(C1, member_dn, group_dn, find_result=False) - - # Step 18 - memberof_fixup_task(C1) - time.sleep(5) - - # Step 19 - for i in [M1, H1, C1]: - _find_memberof(i, member_dn, group_dn, find_result=True) - - # If you need any test suite initialization, - # please, write additional fixture for that (including finalizer). - # Topology for suites are predefined in lib389/topologies.py. - - # If you need host, port or any other data about instance, - # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid) - - if DEBUGGING: - # Add debugging steps(if any)... - pass - - -if __name__ == '__main__': - # Run isolated - # -s for DEBUG mode - CURRENT_FILE = os.path.realpath(__file__) - pytest.main("-s %s" % CURRENT_FILE) - -- 2.9.5