Sorry, this formatted, poorly. Find attached,
# --- BEGIN COPYRIGHT BLOCK --- # Copyright (C) 2019 William Brown <william@xxxxxxxxxxxxxxxx> # All rights reserved. # # License: GPL (version 3 or any later version). # See LICENSE for details. # --- END COPYRIGHT BLOCK --- # from lib389._constants import DEFAULT_SUFFIX from lib389.topologies import topology_st from lib389.idm.group import Groups from lib389.idm.user import nsUserAccounts from lib389.idm.organizationalunit import OrganizationalUnit as OrganisationalUnit from lib389.plugins import AutoMembershipPlugin, ReferentialIntegrityPlugin, AutoMembershipDefinitions def test_rename_large_subtree(topology_st): """ A report stated that the following configuration would lead to an operation failure: ou=int,ou=account,dc=... ou=s1,ou=int,ou=account,dc=... ou=s2,ou=int,ou=account,dc=... rename ou=s1 to re-parent to ou=account, leaving: ou=int,ou=account,dc=... ou=s1,ou=account,dc=... ou=s2,ou=account,dc=... The ou=s1 if it has < 100 entries below, is able to be reparented. If ou=s1 has > 400 entries, it fails. Other conditions was the presence of referential integrity - so one would assume that all users under s1 are a member of some group external to this. :id: 5915c38d-b3c2-4b7c-af76-8a1e002e27f7 :setup: standalone instance :steps: 1. Enable automember plugin 2. Add < 500 users, and ensure they are members of a group. 3. Enable refer-int plugin 4. Move ou=s1 to a new parent :expectedresults: 1. The plugin is enabled 2. The users are members of the group 3. The plugin is enabled 4. The rename operation of ou=s1 succeeds """ st = topology_st.standalone # Create a default group gps = Groups(st, DEFAULT_SUFFIX) # Keep the group so we can get it's DN out. group = gps.create(properties={ 'cn': 'default_group' }) # Enable automember amp = AutoMembershipPlugin(st) amp.enable() # Create the automember definition automembers = AutoMembershipDefinitions(st) automember = automembers.create(properties={ 'cn': 'testgroup_definition', 'autoMemberScope': DEFAULT_SUFFIX, 'autoMemberFilter': 'objectclass=nsAccount', 'autoMemberDefaultGroup': group.dn, 'autoMemberGroupingAttr': 'member:dn', }) # Enable referint rip = ReferentialIntegrityPlugin(st) # We only need to enable the plugin, the default configuration is sane and # correctly coveres member as an enforced attribute. rip.enable() # Restart to make sure it's enabled and good to go. st.restart() # Now unlike normal, we bypass the plural-create method, because we need control # over the exact DN of the OU to create. # Create the ou=account # We don't need to set a DN here because ... ou_account = OrganisationalUnit(st) # It's set in the .create step. ou_account.create( basedn = DEFAULT_SUFFIX, properties={ 'ou': 'account' }) # create the ou=int,ou=account ou_int = OrganisationalUnit(st) ou_int.create( basedn = ou_account.dn, properties={ 'ou': 'int' }) # Create the ou=s1,ou=int,ou=account ou_s1 = OrganisationalUnit(st) ou_s1.create( basedn = ou_int.dn, properties={ 'ou': 's1' }) # Create the users 1 -> 1000 in ou=s1 nsu = nsUserAccounts(st, basedn=ou_s1.dn, rdn=None) for i in range(1000, 2000): nsu.create_test_user(uid=i) # Assert they are in the group as we expect members = group.get_attr_vals_utf8('member') assert len(members) == 1000 # Move ou=s1 to ou=account as parent. We have to provide the rdn, # even though it's not changing. ou_s1.rename('ou=s1', newsuperior=ou_account.dn) members = group.get_attr_vals_utf8('member') assert len(members) == 1000 # Check that we really did refer-int properly, and ou=int is not in the members. for member in members: assert 'ou=int' not in member
> On 21 Feb 2019, at 14:17, William Brown <wbrown@xxxxxxx> wrote: > > > >> On 21 Feb 2019, at 13:12, William Brown <wbrown@xxxxxxx> wrote: >> >> >> >>> On 21 Feb 2019, at 08:57, Olivier JUDITH <gnulux@xxxxxxxxx> wrote: >>> >>> Hi, >>> >>> I'm moving many ou to one level up >>> ou=SITE1,ou=BU,ou=Account,dc=... >>> ou=SITE2,ou=BU,ou=Account,dc=... >>> to >>> ou=SITE1,ou=Account,dc=...... >>> ou=SITE2,ou=Account,dc=... >>> >>> Don't want OU=BU anymore. >>> >>> ou=SITE1,ou=Account,dc=... has less than 100 entries it works fine >>> ou=SITE2,ou=Account,dc=... has more than 400 entries , works randomly. Today i succeeded to move it (after instance restart) . So i tried another OU with more than 1000 entries and i got the >>> same error. >> >> I am going to attempt to reproduce this, and I will report the results to you tomorrow :) > > Hey there, > > I can’t reproduce this. A likely explanation could be that it affects versions less than 1.4.x (which is what I was testing against). > Here is the test case. Can you check that it matches your expectations? It may look a bit foreign as it’s based on our python lib389 suite: > > # --- BEGIN COPYRIGHT BLOCK --- > # Copyright (C) 2019 William Brown <william@xxxxxxxxxxxxxxxx> > # All rights reserved. > # > # License: GPL (version 3 or any later version). > # See LICENSE for details. > # --- END COPYRIGHT BLOCK --- > # > > > from lib389._constants import DEFAULT_SUFFIX > from lib389.topologies import topology_st > > from lib389.idm.group import Groups > from lib389.idm.user import nsUserAccounts > from lib389.idm.organizationalunit import OrganizationalUnit as OrganisationalUnit > > from lib389.plugins import AutoMembershipPlugin, ReferentialIntegrityPlugin, AutoMembershipDefinitions > > > def test_rename_large_subtree(topology_st): > """ > A report stated that the following configuration would lead > to an operation failure: > > ou=int,ou=account,dc=... > ou=s1,ou=int,ou=account,dc=... > ou=s2,ou=int,ou=account,dc=... > > rename ou=s1 to re-parent to ou=account, leaving: > > ou=int,ou=account,dc=... > ou=s1,ou=account,dc=... > ou=s2,ou=account,dc=... > > The ou=s1 if it has < 100 entries below, is able to be reparented. > > If ou=s1 has > 400 entries, it fails. > > Other conditions was the presence of referential integrity - so one would > assume that all users under s1 are a member of some group external to this. > > :id: 5915c38d-b3c2-4b7c-af76-8a1e002e27f7 > > :setup: standalone instance > > :steps: 1. Enable automember plugin > 2. Add < 500 users, and ensure they are members of a group. > 3. Enable refer-int plugin > 4. Move ou=s1 to a new parent > > :expectedresults: > 1. The plugin is enabled > 2. The users are members of the group > 3. The plugin is enabled > 4. The rename operation of ou=s1 succeeds > """ > > st = topology_st.standalone > > # Create a default group > gps = Groups(st, DEFAULT_SUFFIX) > # Keep the group so we can get it's DN out. > group = gps.create(properties={ > 'cn': 'default_group' > }) > > # Enable automember > amp = AutoMembershipPlugin(st) > amp.enable() > > # Create the automember definition > automembers = AutoMembershipDefinitions(st) > > automember = automembers.create(properties={ > 'cn': 'testgroup_definition', > 'autoMemberScope': DEFAULT_SUFFIX, > 'autoMemberFilter': 'objectclass=nsAccount', > 'autoMemberDefaultGroup': group.dn, > 'autoMemberGroupingAttr': 'member:dn', > }) > > # Enable referint > rip = ReferentialIntegrityPlugin(st) > # We only need to enable the plugin, the default configuration is sane and > # correctly coveres member as an enforced attribute. > rip.enable() > > # Restart to make sure it's enabled and good to go. > st.restart() > > # Now unlike normal, we bypass the plural-create method, because we need control > # over the exact DN of the OU to create. > # Create the ou=account > > # We don't need to set a DN here because ... > ou_account = OrganisationalUnit(st) > > # It's set in the .create step. > ou_account.create( > basedn = DEFAULT_SUFFIX, > properties={ > 'ou': 'account' > }) > # create the ou=int,ou=account > ou_int = OrganisationalUnit(st) > ou_int.create( > basedn = ou_account.dn, > properties={ > 'ou': 'int' > }) > # Create the ou=s1,ou=int,ou=account > ou_s1 = OrganisationalUnit(st) > ou_s1.create( > basedn = ou_int.dn, > properties={ > 'ou': 's1' > }) > > # Create the users 1 -> 1000 in ou=s1 > nsu = nsUserAccounts(st, basedn=ou_s1.dn, rdn=None) > for i in range(1000, 2000): > nsu.create_test_user(uid=i) > > # Assert they are in the group as we expect > members = group.get_attr_vals_utf8('member') > assert len(members) == 1000 > > # Move ou=s1 to ou=account as parent. We have to provide the rdn, > # even though it's not changing. > ou_s1.rename('ou=s1', newsuperior=ou_account.dn) > > members = group.get_attr_vals_utf8('member') > assert len(members) == 1000 > # Check that we really did refer-int properly, and ou=int is not in the members. > for member in members: > assert 'ou=int' not in member > > > > >> >>> >>> Regards >>> >>> Le mer. 20 févr. 2019 à 23:44, William Brown <wbrown@xxxxxxx> a écrit : >>> We would need to test this scenario, but it could very likely be a bug in the server. >>> >>> To be sure the conditions you have here are: >>> >>> ou=start,dc=… >>> ou=destination,dc=… >>> >>> In ou=start you have 800+ entries. >>> >>> Then you are doing a modrdn of ou=start to ou=start,ou=destination,dc=…, and the error condition occurs? >>> >>> Is this correct? >>> >>>> On 21 Feb 2019, at 02:49, Olivier JUDITH <gnulux@xxxxxxxxx> wrote: >>>> >>>> Hi, >>>> >>>> I have activated Referential Integrity plugin on my instance in order to move several OU to a new parent subtree. Also to update automatically uniqueMember attribute defined in group member . >>>> It works fine with few user entries under some OU but fails when the OU contains more than 400 entries or somtime more than 800. >>>> The error from the 389-console is : >>>> ou=UNITA, OU=Accounts,dc=mydomain,dc=com: netscape.ldap.LDAPException: error result (1); Operations error. >>>> In error file >>>> [20/Feb/2019:17:37:59.123749991 +0100] - ERR - ldbm_back_modrdn - SLAPI_PLUGIN_BE_TXN_POST_MODRDN_FN plugin returned error but did not set SLAPI_RESULT_CODE >>>> >>>> After this error the OU : UNITA, OU=Accounts,dc=mydomain,dc=com is not visible from 389-console . I have to restart the instance in order to recover the OU. >>>> >>>> Did i miss something in my configuration or do i have to set a specific parameter to support big entries ? >>>> >>>> My installation : 389DS 1.3.6 . >>>> _______________________________________________ >>>> 389-users mailing list -- 389-users@xxxxxxxxxxxxxxxxxxxxxxx >>>> To unsubscribe send an email to 389-users-leave@xxxxxxxxxxxxxxxxxxxxxxx >>>> Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html >>>> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines >>>> List Archives: https://lists.fedoraproject.org/archives/list/389-users@xxxxxxxxxxxxxxxxxxxxxxx >>> >>> — >>> Sincerely, >>> >>> William Brown >>> Software Engineer, 389 Directory Server >>> SUSE Labs >>> _______________________________________________ >>> 389-users mailing list -- 389-users@xxxxxxxxxxxxxxxxxxxxxxx >>> To unsubscribe send an email to 389-users-leave@xxxxxxxxxxxxxxxxxxxxxxx >>> Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html >>> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines >>> List Archives: https://lists.fedoraproject.org/archives/list/389-users@xxxxxxxxxxxxxxxxxxxxxxx >>> _______________________________________________ >>> 389-users mailing list -- 389-users@xxxxxxxxxxxxxxxxxxxxxxx >>> To unsubscribe send an email to 389-users-leave@xxxxxxxxxxxxxxxxxxxxxxx >>> Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html >>> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines >>> List Archives: https://lists.fedoraproject.org/archives/list/389-users@xxxxxxxxxxxxxxxxxxxxxxx >> >> — >> Sincerely, >> >> William Brown >> Software Engineer, 389 Directory Server >> SUSE Labs >> > > — > Sincerely, > > William Brown > Software Engineer, 389 Directory Server > SUSE Labs > _______________________________________________ > 389-users mailing list -- 389-users@xxxxxxxxxxxxxxxxxxxxxxx > To unsubscribe send an email to 389-users-leave@xxxxxxxxxxxxxxxxxxxxxxx > Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html > List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines > List Archives: https://lists.fedoraproject.org/archives/list/389-users@xxxxxxxxxxxxxxxxxxxxxxx — Sincerely, William Brown Software Engineer, 389 Directory Server SUSE Labs
_______________________________________________ 389-users mailing list -- 389-users@xxxxxxxxxxxxxxxxxxxxxxx To unsubscribe send an email to 389-users-leave@xxxxxxxxxxxxxxxxxxxxxxx Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/389-users@xxxxxxxxxxxxxxxxxxxxxxx