From b831e4f22ecab35ac05aab361556e2d325df44a5 Mon Sep 17 00:00:00 2001 From: Amita Sharma Date: Mon, 8 Jan 2018 19:22:36 +0530 Subject: [PATCH] Ticket 48118 - Add CI test case Description: Add a test case to suites/memberof_plugin/regression_test.py Test that replication does not break, after DS stop-start, due to changelog reset, while using member_of plugin https://pagure.io/389-ds-base/issue/48118 Reviewed by: ??? --- .../suites/memberof_plugin/regression_test.py | 121 ++++++++++++++++++++- 1 file changed, 118 insertions(+), 3 deletions(-) diff --git a/dirsrvtests/tests/suites/memberof_plugin/regression_test.py b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py index 6ba4217..9dcf11c 100644 --- a/dirsrvtests/tests/suites/memberof_plugin/regression_test.py +++ b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py @@ -1,22 +1,26 @@ import logging +from random import sample import pytest import os import time import ldap import subprocess -from lib389.utils import ds_is_older +from lib389.utils import ds_is_older, ensure_list_bytes, ensure_bytes from lib389.topologies import topology_m1h1c1 as topo from lib389._constants import * from lib389.plugins import MemberOfPlugin -from lib389 import agreement +from lib389 import agreement, Entry from lib389.idm.user import UserAccount, UserAccounts, TEST_USER_PROPERTIES from lib389.idm.group import Groups, Group +from lib389.topologies import topology_m2 as topo_m2 +from lib389.replica import Replicas # Skip on older versions pytestmark = pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented") USER_CN='user_' GROUP_CN='group_' +TEST_USER_PWD = 'password' DEBUGGING = os.getenv("DEBUGGING", default=False) if DEBUGGING: @@ -149,7 +153,7 @@ def test_memberof_with_repl(topo): test_groups.append(testgroup) # Step 4 - #Now start testing by adding differnt user to differn group + #Now start testing by adding different user to different group if not ds_is_older('1.3.7'): test_groups[0].remove('objectClass', 'nsMemberOf') @@ -232,6 +236,117 @@ def test_memberof_with_repl(topo): _find_memberof(i, member_dn, grp0_dn) +@pytest.fixture(scope="module") +def test_user(topo_m2, request): + """User for binding operation""" + log.info('Adding test user') + users = UserAccounts(topo_m2.ms["master1"], DEFAULT_SUFFIX) + user = users.create(properties={ + 'uid': 'memberof_test', + 'cn': 'memberof_test', + 'sn': 'memberof_test', + 'uidNumber': '1234', + 'gidNumber': '1234', + 'homeDirectory': '/home/memberof_test', + 'userPassword': TEST_USER_PWD, + }) + + def fin(): + log.info('Deleting users') + user.delete() + request.addfinalizer(fin) + return user + + +def add_users(topo_m2, users_num, suffix): + """Add users to the default suffix + Return the list of added user DNs. + """ + users_list = [] + users = UserAccounts(topo_m2.ms["master1"], suffix, rdn=None) + log.info('Adding %d users' % users_num) + for num in sample(range(1000), users_num): + num_ran = int(round(num)) + USER_NAME = 'test%05d' % num_ran + user = users.create(properties={ + 'uid': USER_NAME, + 'sn': USER_NAME, + 'cn': USER_NAME, + 'uidNumber': '%s' % num_ran, + 'gidNumber': '%s' % num_ran, + 'homeDirectory': '/home/%s' % USER_NAME, + 'mail': '%s@redhat.com' % USER_NAME, + 'userpassword': 'pass%s' % num_ran, + }) + users_list.append(user) + return users_list + + +@pytest.mark.bz1192099 +def test_memberof_with_changelog_reset(topo_m2, test_user): + """Test that replication does not break, after DS stop-start, due to changelog reset + + :id: 60c11636-55a1-4704-9e09-2c6bcc828de4 + :setup: 2 Masters + :steps: + 1. On M1 and M2, Enable memberof + 2. On M1, add 999 entries allowing memberof + 3. On M1, add a group with these 999 entries as members + 4. Stop step 3 in between, + when add the group memerof is called and before it is finished the add , + so step 4 should be executed after memberof has started and before the add has finished + 5. Check that replication is working fine + :expectedresults: + 1. memberof should be enabled + 2. Entries should be added + 3. Add operation should start + 4. Step 3 should be stopped on time + 5. Replication should be working fine + """ + m1 = topo_m2.ms["master1"] + m2 = topo_m2.ms["master2"] + + log.info("Configure memberof on M1 and M2") + memberof = MemberOfPlugin(m1) + memberof.enable() + memberof.set_autoaddoc('nsMemberOf') + m1.restart() + + memberof = MemberOfPlugin(m2) + memberof.enable() + memberof.set_autoaddoc('nsMemberOf') + m2.restart() + + log.info("On M1, add 999 test entries allowing memberof") + users_list = add_users(topo_m2, 999, DEFAULT_SUFFIX) + + log.info("On M1, add a group with these 999 entries as members") + dic_of_attributes = {'cn': ensure_bytes('testgroup'), + 'objectclass': ensure_list_bytes(['top', 'groupOfNames'])} + + for user in users_list: + dic_of_attributes.setdefault('member',[]) + dic_of_attributes['member'].append(user.dn) + + log.info('Set user bind') + conn = test_user.bind(TEST_USER_PWD) + + groupdn = 'cn=testgroup,%s' % DEFAULT_SUFFIX + msgid = conn.add(Entry((groupdn, dic_of_attributes))) + + log.info("Abandon the group add operation in between") + conn.abandon(msgid) + + log.info("Check the log messages for error") + error_msg = "ERR - NSMMReplicationPlugin - ruv_compare_ruv" + assert not m1.ds_error_log.match(error_msg) + + log.info("Check that the replication is working fine both ways, M1 <-> M2") + replicas_m1 = Replicas(m1) + replicas_m2 = Replicas(m2) + replicas_m1.test(DEFAULT_SUFFIX, m2) + replicas_m2.test(DEFAULT_SUFFIX, m1) + if __name__ == '__main__': # Run isolated # -s for DEBUG mode -- 2.9.5