ticket49658_test.py 182 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266
  1. import logging
  2. import pytest
  3. import os
  4. import ldap
  5. import time
  6. import sys
  7. print(sys.path)
  8. from lib389 import Entry
  9. from lib389._constants import DEFAULT_SUFFIX
  10. from lib389.idm.user import UserAccounts, TEST_USER_PROPERTIES
  11. from lib389.topologies import topology_m3 as topo
  12. pytestmark = pytest.mark.tier2
  13. DEBUGGING = os.getenv("DEBUGGING", default=False)
  14. if DEBUGGING:
  15. logging.getLogger(__name__).setLevel(logging.DEBUG)
  16. else:
  17. logging.getLogger(__name__).setLevel(logging.INFO)
  18. log = logging.getLogger(__name__)
  19. MAX_EMPLOYEENUMBER_USER = 20
  20. MAX_STANDARD_USER = 100
  21. MAX_USER = MAX_STANDARD_USER + MAX_EMPLOYEENUMBER_USER
  22. EMPLOYEENUMBER_RDN_START = 0
  23. USER_UID='user_'
  24. BASE_DISTINGUISHED = 'ou=distinguished,ou=people,%s' % (DEFAULT_SUFFIX)
  25. BASE_REGULAR = 'ou=regular,ou=people,%s' % (DEFAULT_SUFFIX)
  26. def _user_get_dn(no):
  27. uid = '%s%d' % (USER_UID, no)
  28. dn = 'uid=%s,%s' % (uid, BASE_REGULAR)
  29. return (uid, dn)
  30. def add_user(server, no, init_val):
  31. (uid, dn) = _user_get_dn(no)
  32. log.fatal('Adding user (%s): ' % dn)
  33. server.add_s(Entry((dn, {'objectclass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
  34. 'uid': [uid],
  35. 'sn' : [uid],
  36. 'cn' : [uid],
  37. 'employeeNumber': init_val})))
  38. return dn
  39. def _employeenumber_user_get_dn(no):
  40. employeeNumber = str(no)
  41. dn = 'employeeNumber=%s,%s' % (employeeNumber, BASE_DISTINGUISHED)
  42. return (employeeNumber, dn)
  43. def add_employeenumber_user(server, no):
  44. (uid, dn) = _employeenumber_user_get_dn(EMPLOYEENUMBER_RDN_START + no)
  45. log.fatal('Adding user (%s): ' % dn)
  46. server.add_s(Entry((dn, {'objectclass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
  47. 'uid': [uid],
  48. 'sn' : [uid],
  49. 'cn' : [uid],
  50. 'employeeNumber': str(EMPLOYEENUMBER_RDN_START + no)})))
  51. return dn
  52. def save_stuff():
  53. M1 = topo.ms["master1"]
  54. M2 = topo.ms["master2"]
  55. M3 = topo.ms["master3"]
  56. value_11 = '11'.encode()
  57. value_1000 = '1000'.encode()
  58. value_13 = '13'.encode()
  59. value_14 = '14'.encode()
  60. # Step 2
  61. test_user_dn= add_user(M3, 0, value_11)
  62. log.info('Adding %s on M3' % test_user_dn)
  63. M3.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_11), (ldap.MOD_ADD, 'employeeNumber', value_1000)])
  64. ents = M3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  65. assert len(ents) == 1
  66. # Step 3
  67. # Check the entry is replicated on M1
  68. for j in range(30):
  69. try:
  70. ent = M1.getEntry(test_user_dn, ldap.SCOPE_BASE,)
  71. if not ent.hasAttr('employeeNumber'):
  72. # wait for the MOD
  73. log.info('M1 waiting for employeeNumber')
  74. time.sleep(1)
  75. continue;
  76. break;
  77. except ldap.NO_SUCH_OBJECT:
  78. time.sleep(1)
  79. pass
  80. time.sleep(1)
  81. ents = M1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  82. assert len(ents) == 1
  83. # Check the entry is replicated on M2
  84. for j in range(30):
  85. try:
  86. ent = M2.getEntry(test_user_dn, ldap.SCOPE_BASE,)
  87. if not ent.hasAttr('employeeNumber'):
  88. # wait for the MOD
  89. log.info('M2 waiting for employeeNumber')
  90. time.sleep(1)
  91. continue;
  92. break;
  93. except ldap.NO_SUCH_OBJECT:
  94. time.sleep(1)
  95. pass
  96. time.sleep(1)
  97. ents = M2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  98. assert len(ents) == 1
  99. def test_ticket49658_init(topo):
  100. """Specify a test case purpose or name here
  101. :id: f8d43cef-c385-46a2-b32b-fdde2114b45e
  102. :setup: 3 Master Instances
  103. :steps:
  104. 1. Create 3 suppliers
  105. 2. Create on M3 MAX_USER test entries having a single-value attribute employeeNumber=11
  106. and update it MOD_DEL 11 + MOD_ADD 1000
  107. 3. Check they are replicated on M1 and M2
  108. :expectedresults:
  109. 1. Fill in the result that is expected
  110. 2. For each test step
  111. """
  112. # If you need any test suite initialization,
  113. # please, write additional fixture for that (including finalizer).
  114. # Topology for suites are predefined in lib389/topologies.py.
  115. # If you need host, port or any other data about instance,
  116. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  117. if DEBUGGING:
  118. # Add debugging steps(if any)...
  119. pass
  120. M1 = topo.ms["master1"]
  121. M2 = topo.ms["master2"]
  122. M3 = topo.ms["master3"]
  123. value_11 = '11'.encode()
  124. value_1000 = '1000'.encode()
  125. # Step 2
  126. M3.add_s(Entry((BASE_DISTINGUISHED, {'objectclass': ['top', 'organizationalUnit'],
  127. 'ou': ['distinguished']})))
  128. for i in range(MAX_EMPLOYEENUMBER_USER):
  129. test_user_dn= add_employeenumber_user(M3, i)
  130. log.info('Adding %s on M3' % test_user_dn)
  131. ents = M3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  132. assert len(ents) == (i + 1)
  133. M3.add_s(Entry((BASE_REGULAR, {'objectclass': ['top', 'organizationalUnit'],
  134. 'ou': ['regular']})))
  135. for i in range(MAX_STANDARD_USER):
  136. test_user_dn= add_user(M3, i, value_11)
  137. log.info('Adding %s on M3' % test_user_dn)
  138. M3.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_11), (ldap.MOD_ADD, 'employeeNumber', value_1000)])
  139. ents = M3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  140. assert len(ents) == (MAX_EMPLOYEENUMBER_USER + i + 1)
  141. # Step 3
  142. # Check the last entry is replicated on M1
  143. (uid, test_user_dn) = _user_get_dn(MAX_STANDARD_USER - 1)
  144. for j in range(30):
  145. try:
  146. ent = M1.getEntry(test_user_dn, ldap.SCOPE_BASE,)
  147. if not ent.hasAttr('employeeNumber'):
  148. # wait for the MOD
  149. log.info('M1 waiting for employeeNumber')
  150. time.sleep(1)
  151. continue;
  152. break;
  153. except ldap.NO_SUCH_OBJECT:
  154. time.sleep(1)
  155. pass
  156. time.sleep(1)
  157. ents = M1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  158. assert len(ents) == MAX_USER
  159. # Check the last entry is replicated on M2
  160. for j in range(30):
  161. try:
  162. ent = M2.getEntry(test_user_dn, ldap.SCOPE_BASE,)
  163. if not ent.hasAttr('employeeNumber'):
  164. # wait for the MOD
  165. log.info('M2 waiting for employeeNumber')
  166. time.sleep(1)
  167. continue;
  168. break;
  169. except ldap.NO_SUCH_OBJECT:
  170. time.sleep(1)
  171. pass
  172. time.sleep(1)
  173. ents = M2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  174. assert len(ents) == MAX_USER
  175. def test_ticket49658_0(topo):
  176. """Do MOD(DEL+ADD) and replicate MOST RECENT first
  177. M1: MOD(DEL+ADD) -> V1
  178. M2: MOD(DEL+ADD) -> V1
  179. expected: V1
  180. :id: 5360b304-9b33-4d37-935f-ab73e0baa1aa
  181. :setup: 3 Master Instances
  182. 1. using user_0 where employNumber=1000
  183. :steps:
  184. 1. Create 3 suppliers
  185. 2. Isolate M1 and M2 by pausing the replication agreements
  186. 3. On M1 do MOD_DEL 1000 + MOD_ADD_13
  187. 4. On M2 do MOD_DEL 1000 + MOD_ADD_13
  188. 5. Enable replication agreement M2 -> M3, so that update step 6 is replicated first
  189. 6. Enable replication agreement M1 -> M3, so that update step 5 is replicated second
  190. 7. Check that the employeeNumber is 13 on all servers
  191. :expectedresults:
  192. 1. Fill in the result that is expected
  193. 2. For each test step
  194. """
  195. # If you need any test suite initialization,
  196. # please, write additional fixture for that (including finalizer).
  197. # Topology for suites are predefined in lib389/topologies.py.
  198. # If you need host, port or any other data about instance,
  199. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  200. if DEBUGGING:
  201. # Add debugging steps(if any)...
  202. pass
  203. M1 = topo.ms["master1"]
  204. M2 = topo.ms["master2"]
  205. M3 = topo.ms["master3"]
  206. value_1000 = '1000'.encode()
  207. last = '0'
  208. value_end = last.encode()
  209. theFilter = '(employeeNumber=%s)' % last
  210. (uid, test_user_dn) = _user_get_dn(int(last))
  211. #
  212. # Step 2
  213. #
  214. # disable all RA from M1 and M2
  215. # only M3 can replicate the update
  216. #
  217. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  218. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  219. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  220. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  221. M1.agreement.pause(agreement_m1_m2[0].dn)
  222. M1.agreement.pause(agreement_m1_m3[0].dn)
  223. M2.agreement.pause(agreement_m2_m1[0].dn)
  224. M2.agreement.pause(agreement_m2_m3[0].dn)
  225. # Step 3
  226. # Oldest update
  227. # check that the entry on M1 contains employeeNumber=<value_end>
  228. M1.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_1000), (ldap.MOD_ADD, 'employeeNumber', value_end)])
  229. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  230. assert len(ents) == 1
  231. time.sleep(1)
  232. # Step 4
  233. # More recent update
  234. # check that the entry on M2 contains employeeNumber=<value_end>
  235. M2.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_1000), (ldap.MOD_ADD, 'employeeNumber', value_end)])
  236. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  237. assert len(ents) == 1
  238. #time.sleep(60)
  239. # Step 7
  240. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  241. for ra in agreement_m2_m1, agreement_m2_m3:
  242. M2.agreement.resume(ra[0].dn)
  243. # Step 8
  244. # Renable M1 so that on M3 oldest update is now replicated
  245. time.sleep(4)
  246. for ra in agreement_m1_m2, agreement_m1_m3:
  247. M1.agreement.resume(ra[0].dn)
  248. # Step 9
  249. # Check that M1 still contains employeeNumber=<value_end>
  250. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  251. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  252. assert len(ents) == 1
  253. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  254. # Check that M2 still contains employeeNumber=<value_end>
  255. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  256. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  257. assert len(ents) == 1
  258. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  259. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  260. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  261. assert len(ents) == MAX_STANDARD_USER
  262. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  263. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  264. assert len(ents) == 1
  265. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  266. def test_ticket49658_1(topo):
  267. """Do MOD(DEL+ADD) and replicate OLDEST first
  268. M2: MOD(DEL+ADD) -> V1
  269. M1: MOD(DEL+ADD) -> V1
  270. expected: V1
  271. :id: bc6620d9-eae1-48af-8a4f-bc14405ea6b6
  272. :setup: 3 Master Instances
  273. 1. using user_1 where employNumber=1000
  274. :steps:
  275. 1. Isolate M1 and M2 by pausing the replication agreements
  276. 2. On M2 do MOD_DEL 1000 + MOD_ADD_13
  277. 3. On M1 do MOD_DEL 1000 + MOD_ADD_13
  278. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  279. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  280. 6. Check that the employeeNumber is 13 on all servers
  281. :expectedresults:
  282. 1. Fill in the result that is expected
  283. 2. For each test step
  284. """
  285. # If you need any test suite initialization,
  286. # please, write additional fixture for that (including finalizer).
  287. # Topology for suites are predefined in lib389/topologies.py.
  288. # If you need host, port or any other data about instance,
  289. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  290. if DEBUGGING:
  291. # Add debugging steps(if any)...
  292. pass
  293. M1 = topo.ms["master1"]
  294. M2 = topo.ms["master2"]
  295. M3 = topo.ms["master3"]
  296. value_1000 = '1000'.encode()
  297. last = '1'
  298. value_end = last.encode()
  299. theFilter = '(employeeNumber=%s)' % last
  300. # This test takes the user_1
  301. (uid, test_user_dn) = _user_get_dn(int(1))
  302. #
  303. # Step 4
  304. #
  305. # disable all RA from M1 and M2
  306. # only M3 can replicate the update
  307. #
  308. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  309. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  310. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  311. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  312. M1.agreement.pause(agreement_m1_m2[0].dn)
  313. M1.agreement.pause(agreement_m1_m3[0].dn)
  314. M2.agreement.pause(agreement_m2_m1[0].dn)
  315. M2.agreement.pause(agreement_m2_m3[0].dn)
  316. # Step 5
  317. # Oldest update
  318. # check that the entry on M2 contains employeeNumber=<value_end>
  319. M2.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_1000), (ldap.MOD_ADD, 'employeeNumber', value_end)])
  320. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  321. assert len(ents) == 1
  322. time.sleep(1)
  323. # Step 6
  324. # More recent update
  325. # check that the entry on M2 contains employeeNumber=<value_end>
  326. M1.modify_s(test_user_dn, [(ldap.MOD_DELETE, 'employeeNumber', value_1000), (ldap.MOD_ADD, 'employeeNumber', value_end)])
  327. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  328. assert len(ents) == 1
  329. #time.sleep(60)
  330. # Step 7
  331. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  332. for ra in agreement_m2_m1, agreement_m2_m3:
  333. M2.agreement.resume(ra[0].dn)
  334. # Step 8
  335. # Renable M1 so that on M3 oldest update is now replicated
  336. time.sleep(4)
  337. for ra in agreement_m1_m2, agreement_m1_m3:
  338. M1.agreement.resume(ra[0].dn)
  339. # Step 9
  340. # Check that M1 still contains employeeNumber=<value_end>
  341. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  342. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  343. assert len(ents) == 1
  344. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  345. # Check that M2 still contains employeeNumber=<value_end>
  346. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  347. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  348. assert len(ents) == 1
  349. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  350. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  351. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  352. assert len(ents) == MAX_STANDARD_USER
  353. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  354. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  355. assert len(ents) == 1
  356. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  357. def test_ticket49658_2(topo):
  358. """Do MOD(ADD+DEL) and replicate OLDEST first
  359. M2: MOD(ADD+DEL) -> V1
  360. M1: MOD(ADD+DEL) -> V1
  361. expected: V1
  362. :id: 672ff689-5b76-4107-92be-fb95d08400b3
  363. :setup: 3 Master Instances
  364. 1. using user_2 where employNumber=1000
  365. :steps:
  366. 1. Isolate M1 and M2 by pausing the replication agreements
  367. 2. On M2 do MOD_DEL 1000 + MOD_ADD_13
  368. 3. On M1 do MOD_DEL 1000 + MOD_ADD_13
  369. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  370. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  371. 6. Check that the employeeNumber is 13 on all servers
  372. :expectedresults:
  373. 1. Fill in the result that is expected
  374. 2. For each test step
  375. """
  376. # If you need any test suite initialization,
  377. # please, write additional fixture for that (including finalizer).
  378. # Topology for suites are predefined in lib389/topologies.py.
  379. # If you need host, port or any other data about instance,
  380. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  381. if DEBUGGING:
  382. # Add debugging steps(if any)...
  383. pass
  384. M1 = topo.ms["master1"]
  385. M2 = topo.ms["master2"]
  386. M3 = topo.ms["master3"]
  387. value_1000 = '1000'.encode()
  388. last = '2'
  389. value_end = last.encode()
  390. theFilter = '(employeeNumber=%s)' % last
  391. # This test takes the user_1
  392. (uid, test_user_dn) = _user_get_dn(int(last))
  393. #
  394. # Step 4
  395. #
  396. # disable all RA from M1 and M2
  397. # only M3 can replicate the update
  398. #
  399. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  400. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  401. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  402. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  403. M1.agreement.pause(agreement_m1_m2[0].dn)
  404. M1.agreement.pause(agreement_m1_m3[0].dn)
  405. M2.agreement.pause(agreement_m2_m1[0].dn)
  406. M2.agreement.pause(agreement_m2_m3[0].dn)
  407. # Step 5
  408. # Oldest update
  409. # check that the entry on M2 contains employeeNumber=<value_end>
  410. M2.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end),(ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  411. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  412. assert len(ents) == 1
  413. time.sleep(1)
  414. # Step 6
  415. # More recent update
  416. # check that the entry on M2 contains employeeNumber=<value_end>
  417. M1.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end), (ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  418. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  419. assert len(ents) == 1
  420. #time.sleep(60)
  421. # Step 7
  422. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  423. for ra in agreement_m2_m1, agreement_m2_m3:
  424. M2.agreement.resume(ra[0].dn)
  425. # Step 8
  426. # Renable M1 so that on M3 oldest update is now replicated
  427. time.sleep(4)
  428. for ra in agreement_m1_m2, agreement_m1_m3:
  429. M1.agreement.resume(ra[0].dn)
  430. # Step 9
  431. # Check that M1 still contains employeeNumber=<value_end>
  432. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  433. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  434. assert len(ents) == 1
  435. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  436. # Check that M2 still contains employeeNumber=<value_end>
  437. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  438. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  439. assert len(ents) == 1
  440. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  441. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  442. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  443. assert len(ents) == MAX_STANDARD_USER
  444. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  445. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  446. assert len(ents) == 1
  447. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  448. def test_ticket49658_3(topo):
  449. """Do MOD(ADD+DEL) and replicate MOST RECENT first
  450. M1: MOD(ADD+DEL) -> V1
  451. M2: MOD(ADD+DEL) -> V1
  452. expected: V1
  453. :id: b25e508a-8bf2-4351-88f6-3b6c098ccc44
  454. :setup: 3 Master Instances
  455. 1. using user_2 where employNumber=1000
  456. :steps:
  457. 1. Isolate M1 and M2 by pausing the replication agreements
  458. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  459. 3. On M2 do MOD_DEL 1000 + MOD_ADD_13
  460. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  461. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  462. 6. Check that the employeeNumber is 13 on all servers
  463. :expectedresults:
  464. 1. Fill in the result that is expected
  465. 2. For each test step
  466. """
  467. # If you need any test suite initialization,
  468. # please, write additional fixture for that (including finalizer).
  469. # Topology for suites are predefined in lib389/topologies.py.
  470. # If you need host, port or any other data about instance,
  471. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  472. if DEBUGGING:
  473. # Add debugging steps(if any)...
  474. pass
  475. M1 = topo.ms["master1"]
  476. M2 = topo.ms["master2"]
  477. M3 = topo.ms["master3"]
  478. value_1000 = '1000'.encode()
  479. last = '3'
  480. value_end = last.encode()
  481. theFilter = '(employeeNumber=%s)' % last
  482. # This test takes the user_1
  483. (uid, test_user_dn) = _user_get_dn(int(last))
  484. #
  485. # Step 4
  486. #
  487. # disable all RA from M1 and M2
  488. # only M3 can replicate the update
  489. #
  490. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  491. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  492. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  493. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  494. M1.agreement.pause(agreement_m1_m2[0].dn)
  495. M1.agreement.pause(agreement_m1_m3[0].dn)
  496. M2.agreement.pause(agreement_m2_m1[0].dn)
  497. M2.agreement.pause(agreement_m2_m3[0].dn)
  498. # Step 5
  499. # Oldest update
  500. # check that the entry on M1 contains employeeNumber=<value_end>
  501. M1.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end),(ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  502. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  503. assert len(ents) == 1
  504. time.sleep(1)
  505. # Step 6
  506. # More recent update
  507. # check that the entry on M2 contains employeeNumber=<value_end>
  508. M2.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end), (ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  509. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  510. assert len(ents) == 1
  511. #time.sleep(60)
  512. # Step 7
  513. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  514. for ra in agreement_m2_m1, agreement_m2_m3:
  515. M2.agreement.resume(ra[0].dn)
  516. # Step 8
  517. # Renable M1 so that on M3 oldest update is now replicated
  518. time.sleep(4)
  519. for ra in agreement_m1_m2, agreement_m1_m3:
  520. M1.agreement.resume(ra[0].dn)
  521. # Step 9
  522. # Check that M1 still contains employeeNumber=<value_end>
  523. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  524. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  525. assert len(ents) == 1
  526. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  527. # Check that M2 still contains employeeNumber=<value_end>
  528. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  529. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  530. assert len(ents) == 1
  531. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  532. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  533. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  534. assert len(ents) == MAX_STANDARD_USER
  535. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  536. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  537. assert len(ents) == 1
  538. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  539. def test_ticket49658_4(topo):
  540. """Do MOD(ADD+DEL) MOD(REPL) and replicate MOST RECENT first
  541. M1: MOD(ADD+DEL) -> V1
  542. M2: MOD(REPL) -> V1
  543. expected: V1
  544. :id: 8f7ce9ff-e36f-48cd-b0ed-b7077a3e7341
  545. :setup: 3 Master Instances
  546. 1. using user_2 where employNumber=1000
  547. :steps:
  548. 1. Isolate M1 and M2 by pausing the replication agreements
  549. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  550. 3. On M2 do MOD_REPL _13
  551. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  552. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  553. 6. Check that the employeeNumber is 13 on all servers
  554. :expectedresults:
  555. 1. Fill in the result that is expected
  556. 2. For each test step
  557. """
  558. # If you need any test suite initialization,
  559. # please, write additional fixture for that (including finalizer).
  560. # Topology for suites are predefined in lib389/topologies.py.
  561. # If you need host, port or any other data about instance,
  562. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  563. if DEBUGGING:
  564. # Add debugging steps(if any)...
  565. pass
  566. M1 = topo.ms["master1"]
  567. M2 = topo.ms["master2"]
  568. M3 = topo.ms["master3"]
  569. value_1000 = '1000'.encode()
  570. last = '4'
  571. value_end = last.encode()
  572. theFilter = '(employeeNumber=%s)' % last
  573. # This test takes the user_1
  574. (uid, test_user_dn) = _user_get_dn(int(last))
  575. #
  576. # Step 4
  577. #
  578. # disable all RA from M1 and M2
  579. # only M3 can replicate the update
  580. #
  581. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  582. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  583. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  584. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  585. M1.agreement.pause(agreement_m1_m2[0].dn)
  586. M1.agreement.pause(agreement_m1_m3[0].dn)
  587. M2.agreement.pause(agreement_m2_m1[0].dn)
  588. M2.agreement.pause(agreement_m2_m3[0].dn)
  589. # Step 5
  590. # Oldest update
  591. # check that the entry on M1 contains employeeNumber=<value_end>
  592. M1.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end),(ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  593. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  594. assert len(ents) == 1
  595. time.sleep(1)
  596. # Step 6
  597. # More recent update
  598. # check that the entry on M2 contains employeeNumber=<value_end>
  599. M2.modify_s(test_user_dn, [(ldap.MOD_REPLACE, 'employeeNumber', value_end)])
  600. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  601. assert len(ents) == 1
  602. #time.sleep(60)
  603. # Step 7
  604. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  605. for ra in agreement_m2_m1, agreement_m2_m3:
  606. M2.agreement.resume(ra[0].dn)
  607. # Step 8
  608. # Renable M1 so that on M3 oldest update is now replicated
  609. time.sleep(4)
  610. for ra in agreement_m1_m2, agreement_m1_m3:
  611. M1.agreement.resume(ra[0].dn)
  612. # Step 9
  613. # Check that M1 still contains employeeNumber=<value_end>
  614. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  615. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  616. assert len(ents) == 1
  617. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  618. # Check that M2 still contains employeeNumber=<value_end>
  619. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  620. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  621. assert len(ents) == 1
  622. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  623. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  624. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  625. assert len(ents) == MAX_STANDARD_USER
  626. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  627. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  628. assert len(ents) == 1
  629. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  630. def test_ticket49658_5(topo):
  631. """Do MOD(REPL) MOD(ADD+DEL) and replicate MOST RECENT first
  632. M1: MOD(REPL) -> V1
  633. M2: MOD(ADD+DEL) -> V1
  634. expected: V1
  635. :id: d6b88e3c-a509-4d3e-8e5d-849237993f47
  636. :setup: 3 Master Instances
  637. 1. using user_2 where employNumber=1000
  638. :steps:
  639. 1. Isolate M1 and M2 by pausing the replication agreements
  640. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  641. 3. On M2 do MOD_REPL _13
  642. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  643. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  644. 6. Check that the employeeNumber is 13 on all servers
  645. :expectedresults:
  646. 1. Fill in the result that is expected
  647. 2. For each test step
  648. """
  649. # If you need any test suite initialization,
  650. # please, write additional fixture for that (including finalizer).
  651. # Topology for suites are predefined in lib389/topologies.py.
  652. # If you need host, port or any other data about instance,
  653. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  654. if DEBUGGING:
  655. # Add debugging steps(if any)...
  656. pass
  657. M1 = topo.ms["master1"]
  658. M2 = topo.ms["master2"]
  659. M3 = topo.ms["master3"]
  660. value_1000 = '1000'.encode()
  661. last = '5'
  662. value_end = last.encode()
  663. theFilter = '(employeeNumber=%s)' % last
  664. # This test takes the user_1
  665. (uid, test_user_dn) = _user_get_dn(int(last))
  666. #
  667. # Step 4
  668. #
  669. # disable all RA from M1 and M2
  670. # only M3 can replicate the update
  671. #
  672. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  673. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  674. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  675. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  676. M1.agreement.pause(agreement_m1_m2[0].dn)
  677. M1.agreement.pause(agreement_m1_m3[0].dn)
  678. M2.agreement.pause(agreement_m2_m1[0].dn)
  679. M2.agreement.pause(agreement_m2_m3[0].dn)
  680. # Step 5
  681. # Oldest update
  682. # check that the entry on M1 contains employeeNumber=<value_end>
  683. M1.modify_s(test_user_dn, [(ldap.MOD_REPLACE, 'employeeNumber', value_end)])
  684. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  685. assert len(ents) == 1
  686. time.sleep(1)
  687. # Step 6
  688. # More recent update
  689. # check that the entry on M2 contains employeeNumber=<value_end>
  690. M2.modify_s(test_user_dn, [(ldap.MOD_ADD, 'employeeNumber', value_end),(ldap.MOD_DELETE, 'employeeNumber', value_1000)])
  691. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  692. assert len(ents) == 1
  693. #time.sleep(60)
  694. # Step 7
  695. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  696. for ra in agreement_m2_m1, agreement_m2_m3:
  697. M2.agreement.resume(ra[0].dn)
  698. # Step 8
  699. # Renable M1 so that on M3 oldest update is now replicated
  700. time.sleep(4)
  701. for ra in agreement_m1_m2, agreement_m1_m3:
  702. M1.agreement.resume(ra[0].dn)
  703. # Step 9
  704. # Check that M1 still contains employeeNumber=<value_end>
  705. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  706. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  707. assert len(ents) == 1
  708. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  709. # Check that M2 still contains employeeNumber=<value_end>
  710. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  711. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  712. assert len(ents) == 1
  713. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  714. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  715. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  716. assert len(ents) == MAX_STANDARD_USER
  717. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, theFilter)
  718. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), value_end))
  719. assert len(ents) == 1
  720. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == value_end
  721. def test_ticket49658_6(topo):
  722. """Do
  723. M1: MOD(REPL) -> V1
  724. M2: MOD(ADD+DEL) -> V2
  725. expected: V2
  726. :id: 5eb67db1-2ff2-4c17-85af-e124b45aace3
  727. :setup: 3 Master Instances
  728. 1. using user_2 where employNumber=1000
  729. :steps:
  730. 1. Isolate M1 and M2 by pausing the replication agreements
  731. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  732. 3. On M2 do MOD_REPL _13
  733. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  734. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  735. 6. Check that the employeeNumber is 13 on all servers
  736. :expectedresults:
  737. 1. Fill in the result that is expected
  738. 2. For each test step
  739. """
  740. # If you need any test suite initialization,
  741. # please, write additional fixture for that (including finalizer).
  742. # Topology for suites are predefined in lib389/topologies.py.
  743. # If you need host, port or any other data about instance,
  744. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  745. if DEBUGGING:
  746. # Add debugging steps(if any)...
  747. pass
  748. M1 = topo.ms["master1"]
  749. M2 = topo.ms["master2"]
  750. M3 = topo.ms["master3"]
  751. value_1000 = '1000'
  752. last = '6'
  753. value_S1 = '6.1'
  754. value_S2 = '6.2'
  755. description = {
  756. "S1": M1,
  757. "S2": M2,
  758. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  759. "S2_MOD": [(ldap.MOD_ADD, 'employeeNumber', value_S2.encode()),(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode())],
  760. "expected": value_S2}
  761. # This test takes the user_1
  762. (uid, test_user_dn) = _user_get_dn(int(last))
  763. #
  764. # Step 4
  765. #
  766. # disable all RA from M1 and M2
  767. # only M3 can replicate the update
  768. #
  769. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  770. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  771. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  772. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  773. M1.agreement.pause(agreement_m1_m2[0].dn)
  774. M1.agreement.pause(agreement_m1_m3[0].dn)
  775. M2.agreement.pause(agreement_m2_m1[0].dn)
  776. M2.agreement.pause(agreement_m2_m3[0].dn)
  777. # Step 5
  778. # Oldest update
  779. # check that the entry on M1 contains employeeNumber=<value_end>
  780. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  781. ents = description["S1"].search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  782. assert len(ents) == 1
  783. time.sleep(1)
  784. # Step 6
  785. # More recent update
  786. # check that the entry on M2 contains employeeNumber=<value_end>
  787. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  788. ents = description["S2"].search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  789. assert len(ents) == 1
  790. #time.sleep(60)
  791. # Step 7
  792. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  793. for ra in agreement_m2_m1, agreement_m2_m3:
  794. M2.agreement.resume(ra[0].dn)
  795. # Step 8
  796. # Renable M1 so that on M3 oldest update is now replicated
  797. time.sleep(4)
  798. for ra in agreement_m1_m2, agreement_m1_m3:
  799. M1.agreement.resume(ra[0].dn)
  800. # Step 9
  801. # Check that M1 still contains employeeNumber=<value_end>
  802. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  803. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  804. assert len(ents) == 1
  805. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  806. # Check that M2 still contains employeeNumber=<value_end>
  807. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  808. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  809. assert len(ents) == 1
  810. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  811. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  812. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  813. assert len(ents) == MAX_STANDARD_USER
  814. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  815. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  816. assert len(ents) == 1
  817. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  818. def test_ticket49658_7(topo):
  819. """Do
  820. M1: MOD(ADD+DEL) -> V1
  821. M2: MOD(REPL) -> V2
  822. expected: V2
  823. :id: a79036ca-0e1b-453e-9524-fb44e1d7c929
  824. :setup: 3 Master Instances
  825. :steps:
  826. :expectedresults:
  827. 1. Fill in the result that is expected
  828. 2. For each test step
  829. """
  830. # If you need any test suite initialization,
  831. # please, write additional fixture for that (including finalizer).
  832. # Topology for suites are predefined in lib389/topologies.py.
  833. # If you need host, port or any other data about instance,
  834. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  835. if DEBUGGING:
  836. # Add debugging steps(if any)...
  837. pass
  838. M1 = topo.ms["master1"]
  839. M2 = topo.ms["master2"]
  840. M3 = topo.ms["master3"]
  841. value_1000 = '1000'
  842. last = '7'
  843. value_S1 = '7.1'
  844. value_S2 = '7.2'
  845. description = {
  846. "S1": M1,
  847. "S2": M2,
  848. "S1_MOD": [(ldap.MOD_ADD, 'employeeNumber', value_S1.encode()),(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode())],
  849. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  850. "expected": value_S2}
  851. # This test takes the user_1
  852. (uid, test_user_dn) = _user_get_dn(int(last))
  853. #
  854. # Step 4
  855. #
  856. # disable all RA from M1 and M2
  857. # only M3 can replicate the update
  858. #
  859. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  860. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  861. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  862. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  863. M1.agreement.pause(agreement_m1_m2[0].dn)
  864. M1.agreement.pause(agreement_m1_m3[0].dn)
  865. M2.agreement.pause(agreement_m2_m1[0].dn)
  866. M2.agreement.pause(agreement_m2_m3[0].dn)
  867. # Step 5
  868. # Oldest update
  869. # check that the entry on M1 contains employeeNumber=<value_end>
  870. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  871. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  872. assert len(ents) == 1
  873. time.sleep(1)
  874. # Step 6
  875. # More recent update
  876. # check that the entry on M2 contains employeeNumber=<value_end>
  877. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  878. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  879. assert len(ents) == 1
  880. #time.sleep(60)
  881. # Step 7
  882. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  883. for ra in agreement_m2_m1, agreement_m2_m3:
  884. M2.agreement.resume(ra[0].dn)
  885. # Step 8
  886. # Renable M1 so that on M3 oldest update is now replicated
  887. time.sleep(4)
  888. for ra in agreement_m1_m2, agreement_m1_m3:
  889. M1.agreement.resume(ra[0].dn)
  890. # Step 9
  891. # Check that M1 still contains employeeNumber=<value_end>
  892. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  893. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  894. assert len(ents) == 1
  895. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  896. # Check that M2 still contains employeeNumber=<value_end>
  897. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  898. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  899. assert len(ents) == 1
  900. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  901. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  902. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  903. assert len(ents) == MAX_STANDARD_USER
  904. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  905. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  906. assert len(ents) == 1
  907. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  908. def test_ticket49658_8(topo):
  909. """Do
  910. M1: MOD(DEL+ADD) -> V1
  911. M2: MOD(REPL) -> V2
  912. expected: V2
  913. :id: 06acb988-b735-424a-9886-b0557ee12a9a
  914. :setup: 3 Master Instances
  915. :steps:
  916. :expectedresults:
  917. 1. Fill in the result that is expected
  918. 2. For each test step
  919. """
  920. # If you need any test suite initialization,
  921. # please, write additional fixture for that (including finalizer).
  922. # Topology for suites are predefined in lib389/topologies.py.
  923. # If you need host, port or any other data about instance,
  924. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  925. if DEBUGGING:
  926. # Add debugging steps(if any)...
  927. pass
  928. M1 = topo.ms["master1"]
  929. M2 = topo.ms["master2"]
  930. M3 = topo.ms["master3"]
  931. value_1000 = '1000'
  932. last = '8'
  933. value_S1 = '8.1'
  934. value_S2 = '8.2'
  935. description = {
  936. "S1": M1,
  937. "S2": M2,
  938. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  939. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  940. "expected": value_S2}
  941. # This test takes the user_1
  942. (uid, test_user_dn) = _user_get_dn(int(last))
  943. #
  944. # Step 4
  945. #
  946. # disable all RA from M1 and M2
  947. # only M3 can replicate the update
  948. #
  949. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  950. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  951. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  952. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  953. M1.agreement.pause(agreement_m1_m2[0].dn)
  954. M1.agreement.pause(agreement_m1_m3[0].dn)
  955. M2.agreement.pause(agreement_m2_m1[0].dn)
  956. M2.agreement.pause(agreement_m2_m3[0].dn)
  957. # Step 5
  958. # Oldest update
  959. # check that the entry on M1 contains employeeNumber=<value_end>
  960. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  961. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  962. assert len(ents) == 1
  963. time.sleep(1)
  964. # Step 6
  965. # More recent update
  966. # check that the entry on M2 contains employeeNumber=<value_end>
  967. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  968. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  969. assert len(ents) == 1
  970. #time.sleep(60)
  971. # Step 7
  972. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  973. for ra in agreement_m2_m1, agreement_m2_m3:
  974. M2.agreement.resume(ra[0].dn)
  975. # Step 8
  976. # Renable M1 so that on M3 oldest update is now replicated
  977. time.sleep(4)
  978. for ra in agreement_m1_m2, agreement_m1_m3:
  979. M1.agreement.resume(ra[0].dn)
  980. # Step 9
  981. # Check that M1 still contains employeeNumber=<value_end>
  982. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  983. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  984. assert len(ents) == 1
  985. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  986. # Check that M2 still contains employeeNumber=<value_end>
  987. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  988. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  989. assert len(ents) == 1
  990. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  991. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  992. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  993. assert len(ents) == MAX_STANDARD_USER
  994. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  995. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  996. assert len(ents) == 1
  997. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  998. def test_ticket49658_9(topo):
  999. """Do
  1000. M1: MOD(REPL) -> V1
  1001. M2: MOD(DEL+ADD) -> V2
  1002. expected: V2
  1003. :id: 3a4c1be3-e3b9-44fe-aa5a-72a3b1a8985c
  1004. :setup: 3 Master Instances
  1005. :steps:
  1006. :expectedresults:
  1007. 1. Fill in the result that is expected
  1008. 2. For each test step
  1009. """
  1010. # If you need any test suite initialization,
  1011. # please, write additional fixture for that (including finalizer).
  1012. # Topology for suites are predefined in lib389/topologies.py.
  1013. # If you need host, port or any other data about instance,
  1014. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1015. if DEBUGGING:
  1016. # Add debugging steps(if any)...
  1017. pass
  1018. M1 = topo.ms["master1"]
  1019. M2 = topo.ms["master2"]
  1020. M3 = topo.ms["master3"]
  1021. value_1000 = '1000'
  1022. last = '9'
  1023. value_S1 = '9.1'
  1024. value_S2 = '9.2'
  1025. description = {
  1026. "S1": M1,
  1027. "S2": M2,
  1028. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1029. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  1030. "expected": value_S2}
  1031. # This test takes the user_1
  1032. (uid, test_user_dn) = _user_get_dn(int(last))
  1033. #
  1034. # Step 4
  1035. #
  1036. # disable all RA from M1 and M2
  1037. # only M3 can replicate the update
  1038. #
  1039. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1040. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1041. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1042. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1043. M1.agreement.pause(agreement_m1_m2[0].dn)
  1044. M1.agreement.pause(agreement_m1_m3[0].dn)
  1045. M2.agreement.pause(agreement_m2_m1[0].dn)
  1046. M2.agreement.pause(agreement_m2_m3[0].dn)
  1047. # Step 5
  1048. # Oldest update
  1049. # check that the entry on M1 contains employeeNumber=<value_end>
  1050. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1051. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1052. assert len(ents) == 1
  1053. time.sleep(1)
  1054. # Step 6
  1055. # More recent update
  1056. # check that the entry on M2 contains employeeNumber=<value_end>
  1057. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1058. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1059. assert len(ents) == 1
  1060. #time.sleep(60)
  1061. # Step 7
  1062. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1063. for ra in agreement_m2_m1, agreement_m2_m3:
  1064. M2.agreement.resume(ra[0].dn)
  1065. # Step 8
  1066. # Renable M1 so that on M3 oldest update is now replicated
  1067. time.sleep(4)
  1068. for ra in agreement_m1_m2, agreement_m1_m3:
  1069. M1.agreement.resume(ra[0].dn)
  1070. # Step 9
  1071. # Check that M1 still contains employeeNumber=<value_end>
  1072. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1073. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1074. assert len(ents) == 1
  1075. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1076. # Check that M2 still contains employeeNumber=<value_end>
  1077. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1078. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1079. assert len(ents) == 1
  1080. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1081. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1082. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1083. assert len(ents) == MAX_STANDARD_USER
  1084. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1085. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1086. assert len(ents) == 1
  1087. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1088. def test_ticket49658_10(topo):
  1089. """Do
  1090. M1: MOD(REPL) -> V1
  1091. M2: MOD(REPL) -> V2
  1092. expected: V2
  1093. :id: 1413341a-45e6-422a-b6cc-9fde6fc9bb15
  1094. :setup: 3 Master Instances
  1095. :steps:
  1096. :expectedresults:
  1097. 1. Fill in the result that is expected
  1098. 2. For each test step
  1099. """
  1100. # If you need any test suite initialization,
  1101. # please, write additional fixture for that (including finalizer).
  1102. # Topology for suites are predefined in lib389/topologies.py.
  1103. # If you need host, port or any other data about instance,
  1104. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1105. if DEBUGGING:
  1106. # Add debugging steps(if any)...
  1107. pass
  1108. M1 = topo.ms["master1"]
  1109. M2 = topo.ms["master2"]
  1110. M3 = topo.ms["master3"]
  1111. value_1000 = '1000'
  1112. last = '10'
  1113. value_S1 = '10.1'
  1114. value_S2 = '10.2'
  1115. description = {
  1116. "S1": M1,
  1117. "S2": M2,
  1118. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1119. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  1120. "expected": value_S2}
  1121. # This test takes the user_1
  1122. (uid, test_user_dn) = _user_get_dn(int(last))
  1123. #
  1124. # Step 4
  1125. #
  1126. # disable all RA from M1 and M2
  1127. # only M3 can replicate the update
  1128. #
  1129. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1130. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1131. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1132. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1133. M1.agreement.pause(agreement_m1_m2[0].dn)
  1134. M1.agreement.pause(agreement_m1_m3[0].dn)
  1135. M2.agreement.pause(agreement_m2_m1[0].dn)
  1136. M2.agreement.pause(agreement_m2_m3[0].dn)
  1137. # Step 5
  1138. # Oldest update
  1139. # check that the entry on M1 contains employeeNumber=<value_end>
  1140. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1141. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1142. assert len(ents) == 1
  1143. time.sleep(1)
  1144. # Step 6
  1145. # More recent update
  1146. # check that the entry on M2 contains employeeNumber=<value_end>
  1147. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1148. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1149. assert len(ents) == 1
  1150. #time.sleep(60)
  1151. # Step 7
  1152. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1153. for ra in agreement_m2_m1, agreement_m2_m3:
  1154. M2.agreement.resume(ra[0].dn)
  1155. # Step 8
  1156. # Renable M1 so that on M3 oldest update is now replicated
  1157. time.sleep(4)
  1158. for ra in agreement_m1_m2, agreement_m1_m3:
  1159. M1.agreement.resume(ra[0].dn)
  1160. # Step 9
  1161. # Check that M1 still contains employeeNumber=<value_end>
  1162. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1163. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1164. assert len(ents) == 1
  1165. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1166. # Check that M2 still contains employeeNumber=<value_end>
  1167. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1168. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1169. assert len(ents) == 1
  1170. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1171. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1172. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1173. assert len(ents) == MAX_STANDARD_USER
  1174. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1175. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1176. assert len(ents) == 1
  1177. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1178. def test_ticket49658_11(topo):
  1179. """Do
  1180. M2: MOD(REPL) -> V2
  1181. M1: MOD(REPL) -> V1
  1182. expected: V1
  1183. :id: a2810403-418b-41d7-948c-6f8ca46e2f29
  1184. :setup: 3 Master Instances
  1185. :steps:
  1186. :expectedresults:
  1187. 1. Fill in the result that is expected
  1188. 2. For each test step
  1189. """
  1190. # If you need any test suite initialization,
  1191. # please, write additional fixture for that (including finalizer).
  1192. # Topology for suites are predefined in lib389/topologies.py.
  1193. # If you need host, port or any other data about instance,
  1194. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1195. if DEBUGGING:
  1196. # Add debugging steps(if any)...
  1197. pass
  1198. M1 = topo.ms["master1"]
  1199. M2 = topo.ms["master2"]
  1200. M3 = topo.ms["master3"]
  1201. value_1000 = '1000'
  1202. last = '11'
  1203. value_S1 = '11.1'
  1204. value_S2 = '11.2'
  1205. description = {
  1206. "S1": M1,
  1207. "S2": M2,
  1208. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1209. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  1210. "expected": value_S1}
  1211. # This test takes the user_1
  1212. (uid, test_user_dn) = _user_get_dn(int(last))
  1213. #
  1214. # Step 4
  1215. #
  1216. # disable all RA from M1 and M2
  1217. # only M3 can replicate the update
  1218. #
  1219. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1220. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1221. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1222. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1223. M1.agreement.pause(agreement_m1_m2[0].dn)
  1224. M1.agreement.pause(agreement_m1_m3[0].dn)
  1225. M2.agreement.pause(agreement_m2_m1[0].dn)
  1226. M2.agreement.pause(agreement_m2_m3[0].dn)
  1227. # Step 5
  1228. # Oldest update
  1229. # check that the entry on M1 contains employeeNumber=<value_end>
  1230. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1231. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1232. assert len(ents) == 1
  1233. time.sleep(1)
  1234. # Step 6
  1235. # More recent update
  1236. # check that the entry on M2 contains employeeNumber=<value_end>
  1237. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1238. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1239. assert len(ents) == 1
  1240. #time.sleep(60)
  1241. # Step 7
  1242. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1243. for ra in agreement_m2_m1, agreement_m2_m3:
  1244. M2.agreement.resume(ra[0].dn)
  1245. # Step 8
  1246. # Renable M1 so that on M3 oldest update is now replicated
  1247. time.sleep(4)
  1248. for ra in agreement_m1_m2, agreement_m1_m3:
  1249. M1.agreement.resume(ra[0].dn)
  1250. # Step 9
  1251. # Check that M1 still contains employeeNumber=<value_end>
  1252. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1253. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1254. assert len(ents) == 1
  1255. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1256. # Check that M2 still contains employeeNumber=<value_end>
  1257. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1258. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1259. assert len(ents) == 1
  1260. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1261. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1262. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1263. assert len(ents) == MAX_STANDARD_USER
  1264. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1265. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1266. assert len(ents) == 1
  1267. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1268. def test_ticket49658_12(topo):
  1269. """Do
  1270. M2: MOD(ADD+DEL) -> V2
  1271. M1: MOD(REPL) -> V1
  1272. expected: V1
  1273. :id: daba6f3c-e060-4d3f-8f9c-25ea4c1bca48
  1274. :setup: 3 Master Instances
  1275. 1. using user_2 where employNumber=1000
  1276. :steps:
  1277. 1. Isolate M1 and M2 by pausing the replication agreements
  1278. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  1279. 3. On M2 do MOD_REPL _13
  1280. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1281. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1282. 6. Check that the employeeNumber is 13 on all servers
  1283. :expectedresults:
  1284. 1. Fill in the result that is expected
  1285. 2. For each test step
  1286. """
  1287. # If you need any test suite initialization,
  1288. # please, write additional fixture for that (including finalizer).
  1289. # Topology for suites are predefined in lib389/topologies.py.
  1290. # If you need host, port or any other data about instance,
  1291. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1292. if DEBUGGING:
  1293. # Add debugging steps(if any)...
  1294. pass
  1295. M1 = topo.ms["master1"]
  1296. M2 = topo.ms["master2"]
  1297. M3 = topo.ms["master3"]
  1298. value_1000 = '1000'
  1299. last = '12'
  1300. value_S1 = '12.1'
  1301. value_S2 = '12.2'
  1302. description = {
  1303. "S1": M1,
  1304. "S2": M2,
  1305. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1306. "S2_MOD": [(ldap.MOD_ADD, 'employeeNumber', value_S2.encode()),(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode())],
  1307. "expected": value_S1}
  1308. # This test takes the user_1
  1309. (uid, test_user_dn) = _user_get_dn(int(last))
  1310. #
  1311. # Step 4
  1312. #
  1313. # disable all RA from M1 and M2
  1314. # only M3 can replicate the update
  1315. #
  1316. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1317. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1318. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1319. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1320. M1.agreement.pause(agreement_m1_m2[0].dn)
  1321. M1.agreement.pause(agreement_m1_m3[0].dn)
  1322. M2.agreement.pause(agreement_m2_m1[0].dn)
  1323. M2.agreement.pause(agreement_m2_m3[0].dn)
  1324. # Step 5
  1325. # Oldest update
  1326. # check that the entry on M1 contains employeeNumber=<value_end>
  1327. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1328. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1329. assert len(ents) == 1
  1330. time.sleep(1)
  1331. # Step 6
  1332. # More recent update
  1333. # check that the entry on M2 contains employeeNumber=<value_end>
  1334. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1335. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1336. assert len(ents) == 1
  1337. #time.sleep(60)
  1338. # Step 7
  1339. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1340. for ra in agreement_m2_m1, agreement_m2_m3:
  1341. M2.agreement.resume(ra[0].dn)
  1342. # Step 8
  1343. # Renable M1 so that on M3 oldest update is now replicated
  1344. time.sleep(4)
  1345. for ra in agreement_m1_m2, agreement_m1_m3:
  1346. M1.agreement.resume(ra[0].dn)
  1347. # Step 9
  1348. # Check that M1 still contains employeeNumber=<value_end>
  1349. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1350. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1351. assert len(ents) == 1
  1352. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1353. # Check that M2 still contains employeeNumber=<value_end>
  1354. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1355. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1356. assert len(ents) == 1
  1357. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1358. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1359. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1360. assert len(ents) == MAX_STANDARD_USER
  1361. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1362. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1363. assert len(ents) == 1
  1364. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1365. def test_ticket49658_13(topo):
  1366. """Do
  1367. M2: MOD(DEL+ADD) -> V2
  1368. M1: MOD(REPL) -> V1
  1369. expected: V1
  1370. :id: 50006b1f-d17c-47a1-86a5-4d78b2a6eab1
  1371. :setup: 3 Master Instances
  1372. 1. using user_2 where employNumber=1000
  1373. :steps:
  1374. 1. Isolate M1 and M2 by pausing the replication agreements
  1375. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  1376. 3. On M2 do MOD_REPL _13
  1377. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1378. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1379. 6. Check that the employeeNumber is 13 on all servers
  1380. :expectedresults:
  1381. 1. Fill in the result that is expected
  1382. 2. For each test step
  1383. """
  1384. # If you need any test suite initialization,
  1385. # please, write additional fixture for that (including finalizer).
  1386. # Topology for suites are predefined in lib389/topologies.py.
  1387. # If you need host, port or any other data about instance,
  1388. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1389. if DEBUGGING:
  1390. # Add debugging steps(if any)...
  1391. pass
  1392. M1 = topo.ms["master1"]
  1393. M2 = topo.ms["master2"]
  1394. M3 = topo.ms["master3"]
  1395. value_1000 = '1000'
  1396. last = '13'
  1397. value_S1 = '13.1'
  1398. value_S2 = '13.2'
  1399. description = {
  1400. "S1": M1,
  1401. "S2": M2,
  1402. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1403. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  1404. "expected": value_S1}
  1405. # This test takes the user_1
  1406. (uid, test_user_dn) = _user_get_dn(int(last))
  1407. #
  1408. # Step 4
  1409. #
  1410. # disable all RA from M1 and M2
  1411. # only M3 can replicate the update
  1412. #
  1413. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1414. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1415. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1416. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1417. M1.agreement.pause(agreement_m1_m2[0].dn)
  1418. M1.agreement.pause(agreement_m1_m3[0].dn)
  1419. M2.agreement.pause(agreement_m2_m1[0].dn)
  1420. M2.agreement.pause(agreement_m2_m3[0].dn)
  1421. # Step 5
  1422. # Oldest update
  1423. # check that the entry on M1 contains employeeNumber=<value_end>
  1424. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1425. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1426. assert len(ents) == 1
  1427. time.sleep(1)
  1428. # Step 6
  1429. # More recent update
  1430. # check that the entry on M2 contains employeeNumber=<value_end>
  1431. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1432. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1433. assert len(ents) == 1
  1434. #time.sleep(60)
  1435. # Step 7
  1436. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1437. for ra in agreement_m2_m1, agreement_m2_m3:
  1438. M2.agreement.resume(ra[0].dn)
  1439. # Step 8
  1440. # Renable M1 so that on M3 oldest update is now replicated
  1441. time.sleep(4)
  1442. for ra in agreement_m1_m2, agreement_m1_m3:
  1443. M1.agreement.resume(ra[0].dn)
  1444. # Step 9
  1445. # Check that M1 still contains employeeNumber=<value_end>
  1446. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1447. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1448. assert len(ents) == 1
  1449. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1450. # Check that M2 still contains employeeNumber=<value_end>
  1451. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1452. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1453. assert len(ents) == 1
  1454. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1455. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1456. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1457. assert len(ents) == MAX_STANDARD_USER
  1458. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1459. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1460. assert len(ents) == 1
  1461. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1462. def test_ticket49658_14(topo):
  1463. """Do
  1464. M2: MOD(DEL+ADD) -> V2
  1465. M1: MOD(DEL+ADD) -> V1
  1466. expected: V1
  1467. :id: d45c58f1-c95e-4314-9cdd-53a2dd391218
  1468. :setup: 3 Master Instances
  1469. 1. using user_2 where employNumber=1000
  1470. :steps:
  1471. 1. Isolate M1 and M2 by pausing the replication agreements
  1472. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  1473. 3. On M2 do MOD_REPL _13
  1474. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1475. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1476. 6. Check that the employeeNumber is 13 on all servers
  1477. :expectedresults:
  1478. 1. Fill in the result that is expected
  1479. 2. For each test step
  1480. """
  1481. # If you need any test suite initialization,
  1482. # please, write additional fixture for that (including finalizer).
  1483. # Topology for suites are predefined in lib389/topologies.py.
  1484. # If you need host, port or any other data about instance,
  1485. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1486. if DEBUGGING:
  1487. # Add debugging steps(if any)...
  1488. pass
  1489. M1 = topo.ms["master1"]
  1490. M2 = topo.ms["master2"]
  1491. M3 = topo.ms["master3"]
  1492. value_1000 = '1000'
  1493. last = '14'
  1494. value_S1 = '14.1'
  1495. value_S2 = '14.2'
  1496. description = {
  1497. "S1": M1,
  1498. "S2": M2,
  1499. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  1500. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  1501. "expected": value_S1}
  1502. # This test takes the user_1
  1503. (uid, test_user_dn) = _user_get_dn(int(last))
  1504. #
  1505. # Step 4
  1506. #
  1507. # disable all RA from M1 and M2
  1508. # only M3 can replicate the update
  1509. #
  1510. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1511. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1512. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1513. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1514. M1.agreement.pause(agreement_m1_m2[0].dn)
  1515. M1.agreement.pause(agreement_m1_m3[0].dn)
  1516. M2.agreement.pause(agreement_m2_m1[0].dn)
  1517. M2.agreement.pause(agreement_m2_m3[0].dn)
  1518. # Step 5
  1519. # Oldest update
  1520. # check that the entry on M1 contains employeeNumber=<value_end>
  1521. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1522. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1523. assert len(ents) == 1
  1524. time.sleep(1)
  1525. # Step 6
  1526. # More recent update
  1527. # check that the entry on M2 contains employeeNumber=<value_end>
  1528. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1529. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1530. assert len(ents) == 1
  1531. #time.sleep(60)
  1532. # Step 7
  1533. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1534. for ra in agreement_m2_m1, agreement_m2_m3:
  1535. M2.agreement.resume(ra[0].dn)
  1536. # Step 8
  1537. # Renable M1 so that on M3 oldest update is now replicated
  1538. time.sleep(4)
  1539. for ra in agreement_m1_m2, agreement_m1_m3:
  1540. M1.agreement.resume(ra[0].dn)
  1541. # Step 9
  1542. # Check that M1 still contains employeeNumber=<value_end>
  1543. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1544. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1545. assert len(ents) == 1
  1546. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1547. # Check that M2 still contains employeeNumber=<value_end>
  1548. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1549. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1550. assert len(ents) == 1
  1551. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1552. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1553. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1554. assert len(ents) == MAX_STANDARD_USER
  1555. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1556. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1557. assert len(ents) == 1
  1558. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1559. def test_ticket49658_15(topo):
  1560. """Do
  1561. M2: MOD(ADD+DEL) -> V2
  1562. M1: MOD(DEL+ADD) -> V1
  1563. expected: V1
  1564. :id: e077f312-e0af-497a-8a31-3395873512d8
  1565. :setup: 3 Master Instances
  1566. 1. using user_2 where employNumber=1000
  1567. :steps:
  1568. 1. Isolate M1 and M2 by pausing the replication agreements
  1569. 2. On M1 do MOD_DEL 1000 + MOD_ADD_13
  1570. 3. On M2 do MOD_REPL _13
  1571. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1572. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1573. 6. Check that the employeeNumber is 13 on all servers
  1574. :expectedresults:
  1575. 1. Fill in the result that is expected
  1576. 2. For each test step
  1577. """
  1578. # If you need any test suite initialization,
  1579. # please, write additional fixture for that (including finalizer).
  1580. # Topology for suites are predefined in lib389/topologies.py.
  1581. # If you need host, port or any other data about instance,
  1582. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1583. if DEBUGGING:
  1584. # Add debugging steps(if any)...
  1585. pass
  1586. M1 = topo.ms["master1"]
  1587. M2 = topo.ms["master2"]
  1588. M3 = topo.ms["master3"]
  1589. value_1000 = '1000'
  1590. last = '15'
  1591. value_S1 = '15.1'
  1592. value_S2 = '15.2'
  1593. description = {
  1594. "S1": M1,
  1595. "S2": M2,
  1596. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  1597. "S2_MOD": [(ldap.MOD_ADD, 'employeeNumber', value_S2.encode()),(ldap.MOD_DELETE, 'employeeNumber', value_1000.encode())],
  1598. "expected": value_S1}
  1599. # This test takes the user_1
  1600. (uid, test_user_dn) = _user_get_dn(int(last))
  1601. #
  1602. # Step 4
  1603. #
  1604. # disable all RA from M1 and M2
  1605. # only M3 can replicate the update
  1606. #
  1607. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1608. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1609. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1610. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1611. M1.agreement.pause(agreement_m1_m2[0].dn)
  1612. M1.agreement.pause(agreement_m1_m3[0].dn)
  1613. M2.agreement.pause(agreement_m2_m1[0].dn)
  1614. M2.agreement.pause(agreement_m2_m3[0].dn)
  1615. # Step 5
  1616. # Oldest update
  1617. # check that the entry on M1 contains employeeNumber=<value_end>
  1618. description["S2"].modify_s(test_user_dn, description["S2_MOD"])
  1619. ents = description["S2"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  1620. assert len(ents) == 1
  1621. time.sleep(1)
  1622. # Step 6
  1623. # More recent update
  1624. # check that the entry on M2 contains employeeNumber=<value_end>
  1625. description["S1"].modify_s(test_user_dn, description["S1_MOD"])
  1626. ents = description["S1"].search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  1627. assert len(ents) == 1
  1628. #time.sleep(60)
  1629. # Step 7
  1630. # Renable M2 before M1 so that on M3, the most recent update is replicated before
  1631. for ra in agreement_m2_m1, agreement_m2_m3:
  1632. M2.agreement.resume(ra[0].dn)
  1633. # Step 8
  1634. # Renable M1 so that on M3 oldest update is now replicated
  1635. time.sleep(4)
  1636. for ra in agreement_m1_m2, agreement_m1_m3:
  1637. M1.agreement.resume(ra[0].dn)
  1638. # Step 9
  1639. # Check that M1 still contains employeeNumber=<value_end>
  1640. ents = M1.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1641. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1642. assert len(ents) == 1
  1643. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1644. # Check that M2 still contains employeeNumber=<value_end>
  1645. ents = M2.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1646. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1647. assert len(ents) == 1
  1648. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1649. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1650. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1651. assert len(ents) == MAX_STANDARD_USER
  1652. ents = M3.search_s(BASE_REGULAR, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1653. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1654. assert len(ents) == 1
  1655. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1656. def _resume_ra_M1_then_M2(M1, M2, M3):
  1657. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1658. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1659. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1660. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1661. for ra in agreement_m1_m2, agreement_m1_m3:
  1662. M1.agreement.resume(ra[0].dn)
  1663. time.sleep(4)
  1664. for ra in agreement_m2_m1, agreement_m2_m3:
  1665. M2.agreement.resume(ra[0].dn)
  1666. time.sleep(4)
  1667. def _resume_ra_M2_then_M1(M1, M2, M3):
  1668. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1669. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1670. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1671. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1672. for ra in agreement_m2_m1, agreement_m2_m3:
  1673. M2.agreement.resume(ra[0].dn)
  1674. time.sleep(4)
  1675. for ra in agreement_m1_m2, agreement_m1_m3:
  1676. M1.agreement.resume(ra[0].dn)
  1677. time.sleep(4)
  1678. def test_ticket49658_16(topo):
  1679. """Do
  1680. M1: MODRDN -> V1
  1681. M2: MODRDN -> V1
  1682. expected: V1
  1683. resume order: M2, M1
  1684. :id: 131b4e4c-0a6d-45df-88aa-cb26a1cd6fa6
  1685. :setup: 3 Master Instances
  1686. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  1687. :steps:
  1688. 1. Isolate M1 and M2 by pausing the replication agreements
  1689. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  1690. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  1691. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1692. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1693. 6. Check that the employeeNumber is 13 on all servers
  1694. :expectedresults:
  1695. 1. Fill in the result that is expected
  1696. 2. For each test step
  1697. """
  1698. # If you need any test suite initialization,
  1699. # please, write additional fixture for that (including finalizer).
  1700. # Topology for suites are predefined in lib389/topologies.py.
  1701. # If you need host, port or any other data about instance,
  1702. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1703. if DEBUGGING:
  1704. # Add debugging steps(if any)...
  1705. pass
  1706. M1 = topo.ms["master1"]
  1707. M2 = topo.ms["master2"]
  1708. M3 = topo.ms["master3"]
  1709. value_init = '1'
  1710. last = '1'
  1711. value_S1 = '1.1'
  1712. value_S2 = value_S1
  1713. description = {
  1714. "S1": M1,
  1715. "S2": M2,
  1716. "S1_MODRDN": value_S1,
  1717. "S2_MODRDN": value_S2,
  1718. "expected": value_S1}
  1719. # This test takes the user_1
  1720. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  1721. #
  1722. # Step 4
  1723. #
  1724. # disable all RA from M1 and M2
  1725. # only M3 can replicate the update
  1726. #
  1727. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1728. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1729. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1730. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1731. M1.agreement.pause(agreement_m1_m2[0].dn)
  1732. M1.agreement.pause(agreement_m1_m3[0].dn)
  1733. M2.agreement.pause(agreement_m2_m1[0].dn)
  1734. M2.agreement.pause(agreement_m2_m3[0].dn)
  1735. # Step 5
  1736. # Oldest update
  1737. # check that the entry on M1 contains employeeNumber=<value_end>
  1738. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1739. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  1740. assert len(ents) == 1
  1741. time.sleep(1)
  1742. # Step 6
  1743. # More recent update
  1744. # check that the entry on M2 contains employeeNumber=<value_end>
  1745. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1746. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  1747. assert len(ents) == 1
  1748. _resume_ra_M2_then_M1(M1, M2, M3)
  1749. # Step 9
  1750. # Check that M1 still contains employeeNumber=<value_end>
  1751. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1752. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1753. assert len(ents) == 1
  1754. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1755. # Check that M2 still contains employeeNumber=<value_end>
  1756. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1757. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1758. assert len(ents) == 1
  1759. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1760. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1761. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1762. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  1763. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1764. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1765. assert len(ents) == 1
  1766. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1767. def test_ticket49658_17(topo):
  1768. """Do
  1769. M1: MODRDN -> V1
  1770. M2: MODRDN -> V2
  1771. expected: V2
  1772. resume order: M2 then M1
  1773. :id: 1d3423ec-a2f3-4c03-9765-ec0924f03cb2
  1774. :setup: 3 Master Instances
  1775. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  1776. :steps:
  1777. 1. Isolate M1 and M2 by pausing the replication agreements
  1778. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  1779. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  1780. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1781. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1782. 6. Check that the employeeNumber is 13 on all servers
  1783. :expectedresults:
  1784. 1. Fill in the result that is expected
  1785. 2. For each test step
  1786. """
  1787. # If you need any test suite initialization,
  1788. # please, write additional fixture for that (including finalizer).
  1789. # Topology for suites are predefined in lib389/topologies.py.
  1790. # If you need host, port or any other data about instance,
  1791. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1792. if DEBUGGING:
  1793. # Add debugging steps(if any)...
  1794. pass
  1795. M1 = topo.ms["master1"]
  1796. M2 = topo.ms["master2"]
  1797. M3 = topo.ms["master3"]
  1798. value_init = '2'
  1799. last = '2'
  1800. value_S1 = '2.1'
  1801. value_S2 = '2.2'
  1802. description = {
  1803. "S1": M1,
  1804. "S2": M2,
  1805. "S1_MODRDN": value_S1,
  1806. "S2_MODRDN": value_S2,
  1807. "expected": value_S2}
  1808. # This test takes the user_1
  1809. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  1810. #
  1811. # Step 4
  1812. #
  1813. # disable all RA from M1 and M2
  1814. # only M3 can replicate the update
  1815. #
  1816. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1817. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1818. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1819. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1820. M1.agreement.pause(agreement_m1_m2[0].dn)
  1821. M1.agreement.pause(agreement_m1_m3[0].dn)
  1822. M2.agreement.pause(agreement_m2_m1[0].dn)
  1823. M2.agreement.pause(agreement_m2_m3[0].dn)
  1824. # Step 5
  1825. # Oldest update
  1826. # check that the entry on M1 contains employeeNumber=<value_end>
  1827. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1828. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  1829. assert len(ents) == 1
  1830. time.sleep(1)
  1831. # Step 6
  1832. # More recent update
  1833. # check that the entry on M2 contains employeeNumber=<value_end>
  1834. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1835. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  1836. assert len(ents) == 1
  1837. _resume_ra_M2_then_M1(M1, M2, M3)
  1838. # Step 9
  1839. # Check that M1 still contains employeeNumber=<value_end>
  1840. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1841. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1842. assert len(ents) == 1
  1843. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1844. # Check that M2 still contains employeeNumber=<value_end>
  1845. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1846. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1847. assert len(ents) == 1
  1848. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1849. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1850. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1851. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  1852. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1853. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1854. assert len(ents) == 1
  1855. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1856. def test_ticket49658_18(topo):
  1857. """Do
  1858. M1: MODRDN -> V1
  1859. M2: MODRDN -> V2
  1860. expected: V2
  1861. resume order: M1 then M2
  1862. :id: c50ea634-ba35-4943-833b-0524a446214f
  1863. :setup: 3 Master Instances
  1864. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  1865. :steps:
  1866. 1. Isolate M1 and M2 by pausing the replication agreements
  1867. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  1868. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  1869. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1870. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1871. 6. Check that the employeeNumber is 13 on all servers
  1872. :expectedresults:
  1873. 1. Fill in the result that is expected
  1874. 2. For each test step
  1875. """
  1876. # If you need any test suite initialization,
  1877. # please, write additional fixture for that (including finalizer).
  1878. # Topology for suites are predefined in lib389/topologies.py.
  1879. # If you need host, port or any other data about instance,
  1880. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1881. if DEBUGGING:
  1882. # Add debugging steps(if any)...
  1883. pass
  1884. M1 = topo.ms["master1"]
  1885. M2 = topo.ms["master2"]
  1886. M3 = topo.ms["master3"]
  1887. value_init = '2'
  1888. last = '3'
  1889. value_S1 = '3.1'
  1890. value_S2 = '3.2'
  1891. description = {
  1892. "S1": M1,
  1893. "S2": M2,
  1894. "S1_MODRDN": value_S1,
  1895. "S2_MODRDN": value_S2,
  1896. "expected": value_S2}
  1897. # This test takes the user_1
  1898. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  1899. #
  1900. # Step 4
  1901. #
  1902. # disable all RA from M1 and M2
  1903. # only M3 can replicate the update
  1904. #
  1905. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1906. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1907. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1908. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1909. M1.agreement.pause(agreement_m1_m2[0].dn)
  1910. M1.agreement.pause(agreement_m1_m3[0].dn)
  1911. M2.agreement.pause(agreement_m2_m1[0].dn)
  1912. M2.agreement.pause(agreement_m2_m3[0].dn)
  1913. # Step 5
  1914. # Oldest update
  1915. # check that the entry on M1 contains employeeNumber=<value_end>
  1916. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1917. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  1918. assert len(ents) == 1
  1919. time.sleep(1)
  1920. # Step 6
  1921. # More recent update
  1922. # check that the entry on M2 contains employeeNumber=<value_end>
  1923. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  1924. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  1925. assert len(ents) == 1
  1926. _resume_ra_M1_then_M2(M1, M2, M3)
  1927. # Step 9
  1928. # Check that M1 still contains employeeNumber=<value_end>
  1929. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1930. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1931. assert len(ents) == 1
  1932. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1933. # Check that M2 still contains employeeNumber=<value_end>
  1934. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1935. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1936. assert len(ents) == 1
  1937. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1938. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  1939. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  1940. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  1941. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  1942. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  1943. assert len(ents) == 1
  1944. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  1945. def test_ticket49658_19(topo):
  1946. """Do
  1947. M1: MODRDN -> V1
  1948. M2: MODRDN -> V2
  1949. M1: MOD(REPL) -> V1
  1950. Replicate order: M2 then M1
  1951. expected: V1
  1952. :id: 787db943-fc95-4fbb-b066-5e8895cfd296
  1953. :setup: 3 Master Instances
  1954. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  1955. :steps:
  1956. 1. Isolate M1 and M2 by pausing the replication agreements
  1957. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  1958. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  1959. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  1960. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  1961. 6. Check that the employeeNumber is 13 on all servers
  1962. :expectedresults:
  1963. 1. Fill in the result that is expected
  1964. 2. For each test step
  1965. """
  1966. # If you need any test suite initialization,
  1967. # please, write additional fixture for that (including finalizer).
  1968. # Topology for suites are predefined in lib389/topologies.py.
  1969. # If you need host, port or any other data about instance,
  1970. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  1971. if DEBUGGING:
  1972. # Add debugging steps(if any)...
  1973. pass
  1974. M1 = topo.ms["master1"]
  1975. M2 = topo.ms["master2"]
  1976. M3 = topo.ms["master3"]
  1977. value_init = '3'
  1978. last = '4'
  1979. value_S1 = '4.1'
  1980. value_S2 = '4.2'
  1981. description = {
  1982. "S1": M1,
  1983. "S2": M2,
  1984. "S1_MODRDN": value_S1,
  1985. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  1986. "S2_MODRDN": value_S2,
  1987. "expected": value_S1}
  1988. # This test takes the user_1
  1989. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  1990. #
  1991. # Step 4
  1992. #
  1993. # disable all RA from M1 and M2
  1994. # only M3 can replicate the update
  1995. #
  1996. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  1997. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  1998. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  1999. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2000. M1.agreement.pause(agreement_m1_m2[0].dn)
  2001. M1.agreement.pause(agreement_m1_m3[0].dn)
  2002. M2.agreement.pause(agreement_m2_m1[0].dn)
  2003. M2.agreement.pause(agreement_m2_m3[0].dn)
  2004. # Step 5
  2005. # Oldest update
  2006. # check that the entry on M1 contains employeeNumber=<value_end>
  2007. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2008. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2009. assert len(ents) == 1
  2010. time.sleep(1)
  2011. # Step 6
  2012. # More recent update
  2013. # check that the entry on M2 contains employeeNumber=<value_end>
  2014. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2015. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2016. assert len(ents) == 1
  2017. time.sleep(1)
  2018. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2019. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2020. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2021. assert len(ents) == 1
  2022. _resume_ra_M2_then_M1(M1, M2, M3)
  2023. #time.sleep(3600)
  2024. # Step 9
  2025. # Check that M1 still contains employeeNumber=<value_end>
  2026. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2027. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2028. assert len(ents) == 1
  2029. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2030. # Check that M2 still contains employeeNumber=<value_end>
  2031. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2032. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2033. assert len(ents) == 1
  2034. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2035. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2036. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2037. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2038. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2039. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2040. assert len(ents) == 1
  2041. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2042. def test_ticket49658_20(topo):
  2043. """Do
  2044. M1: MODRDN -> V1
  2045. M2: MODRDN -> V2
  2046. M1: MOD(REPL) -> V1
  2047. Replicate order: M1 then M2
  2048. expected: V1
  2049. :id: a3df2f72-b8b1-4bb8-b0ca-ebd306539c8b
  2050. :setup: 3 Master Instances
  2051. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2052. :steps:
  2053. 1. Isolate M1 and M2 by pausing the replication agreements
  2054. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2055. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2056. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2057. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2058. 6. Check that the employeeNumber is 13 on all servers
  2059. :expectedresults:
  2060. 1. Fill in the result that is expected
  2061. 2. For each test step
  2062. """
  2063. # If you need any test suite initialization,
  2064. # please, write additional fixture for that (including finalizer).
  2065. # Topology for suites are predefined in lib389/topologies.py.
  2066. # If you need host, port or any other data about instance,
  2067. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2068. if DEBUGGING:
  2069. # Add debugging steps(if any)...
  2070. pass
  2071. M1 = topo.ms["master1"]
  2072. M2 = topo.ms["master2"]
  2073. M3 = topo.ms["master3"]
  2074. value_init = '3'
  2075. last = '5'
  2076. value_S1 = '5.1'
  2077. value_S2 = '5.2'
  2078. description = {
  2079. "S1": M1,
  2080. "S2": M2,
  2081. "S1_MODRDN": value_S1,
  2082. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  2083. "S2_MODRDN": value_S2,
  2084. "expected": value_S1}
  2085. # This test takes the user_1
  2086. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2087. #
  2088. # Step 4
  2089. #
  2090. # disable all RA from M1 and M2
  2091. # only M3 can replicate the update
  2092. #
  2093. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2094. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2095. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2096. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2097. M1.agreement.pause(agreement_m1_m2[0].dn)
  2098. M1.agreement.pause(agreement_m1_m3[0].dn)
  2099. M2.agreement.pause(agreement_m2_m1[0].dn)
  2100. M2.agreement.pause(agreement_m2_m3[0].dn)
  2101. # Step 5
  2102. # Oldest update
  2103. # check that the entry on M1 contains employeeNumber=<value_end>
  2104. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2105. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2106. assert len(ents) == 1
  2107. time.sleep(1)
  2108. # Step 6
  2109. # More recent update
  2110. # check that the entry on M2 contains employeeNumber=<value_end>
  2111. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2112. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2113. assert len(ents) == 1
  2114. time.sleep(1)
  2115. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2116. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2117. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2118. assert len(ents) == 1
  2119. _resume_ra_M1_then_M2(M1, M2, M3)
  2120. #time.sleep(3600)
  2121. # Step 9
  2122. # Check that M1 still contains employeeNumber=<value_end>
  2123. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2124. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2125. assert len(ents) == 1
  2126. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2127. # Check that M2 still contains employeeNumber=<value_end>
  2128. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2129. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2130. assert len(ents) == 1
  2131. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2132. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2133. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2134. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2135. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2136. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2137. assert len(ents) == 1
  2138. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2139. def test_ticket49658_21(topo):
  2140. """Do
  2141. M1: MODRDN -> V1
  2142. M2: MODRDN -> V2
  2143. M1: MOD(DEL/ADD) -> V1
  2144. Replicate order: M2 then M1
  2145. expected: V1
  2146. :id: f338188c-6877-4a2e-bbb1-14b81ac7668a
  2147. :setup: 3 Master Instances
  2148. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2149. :steps:
  2150. 1. Isolate M1 and M2 by pausing the replication agreements
  2151. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2152. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2153. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2154. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2155. 6. Check that the employeeNumber is 13 on all servers
  2156. :expectedresults:
  2157. 1. Fill in the result that is expected
  2158. 2. For each test step
  2159. """
  2160. # If you need any test suite initialization,
  2161. # please, write additional fixture for that (including finalizer).
  2162. # Topology for suites are predefined in lib389/topologies.py.
  2163. # If you need host, port or any other data about instance,
  2164. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2165. if DEBUGGING:
  2166. # Add debugging steps(if any)...
  2167. pass
  2168. M1 = topo.ms["master1"]
  2169. M2 = topo.ms["master2"]
  2170. M3 = topo.ms["master3"]
  2171. value_init = '3'
  2172. last = '6'
  2173. value_S1 = '6.1'
  2174. value_S2 = '6.2'
  2175. description = {
  2176. "S1": M1,
  2177. "S2": M2,
  2178. "S1_MODRDN": value_S1,
  2179. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  2180. "S2_MODRDN": value_S2,
  2181. "expected": value_S1}
  2182. # This test takes the user_1
  2183. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2184. #
  2185. # Step 4
  2186. #
  2187. # disable all RA from M1 and M2
  2188. # only M3 can replicate the update
  2189. #
  2190. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2191. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2192. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2193. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2194. M1.agreement.pause(agreement_m1_m2[0].dn)
  2195. M1.agreement.pause(agreement_m1_m3[0].dn)
  2196. M2.agreement.pause(agreement_m2_m1[0].dn)
  2197. M2.agreement.pause(agreement_m2_m3[0].dn)
  2198. # Step 5
  2199. # Oldest update
  2200. # check that the entry on M1 contains employeeNumber=<value_end>
  2201. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2202. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2203. assert len(ents) == 1
  2204. time.sleep(1)
  2205. # Step 6
  2206. # More recent update
  2207. # check that the entry on M2 contains employeeNumber=<value_end>
  2208. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2209. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2210. assert len(ents) == 1
  2211. time.sleep(1)
  2212. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2213. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2214. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2215. assert len(ents) == 1
  2216. _resume_ra_M2_then_M1(M1, M2, M3)
  2217. #time.sleep(3600)
  2218. # Step 9
  2219. # Check that M1 still contains employeeNumber=<value_end>
  2220. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2221. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2222. assert len(ents) == 1
  2223. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2224. # Check that M2 still contains employeeNumber=<value_end>
  2225. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2226. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2227. assert len(ents) == 1
  2228. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2229. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2230. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2231. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2232. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2233. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2234. assert len(ents) == 1
  2235. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2236. def test_ticket49658_22(topo):
  2237. """Do
  2238. M1: MODRDN -> V1
  2239. M2: MODRDN -> V2
  2240. M1: MOD(DEL/ADD) -> V1
  2241. Replicate: M1 then M2
  2242. expected: V1
  2243. :id: f3b33f52-d5c7-4b49-89cf-3cbe4b060674
  2244. :setup: 3 Master Instances
  2245. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2246. :steps:
  2247. 1. Isolate M1 and M2 by pausing the replication agreements
  2248. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2249. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2250. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2251. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2252. 6. Check that the employeeNumber is 13 on all servers
  2253. :expectedresults:
  2254. 1. Fill in the result that is expected
  2255. 2. For each test step
  2256. """
  2257. # If you need any test suite initialization,
  2258. # please, write additional fixture for that (including finalizer).
  2259. # Topology for suites are predefined in lib389/topologies.py.
  2260. # If you need host, port or any other data about instance,
  2261. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2262. if DEBUGGING:
  2263. # Add debugging steps(if any)...
  2264. pass
  2265. M1 = topo.ms["master1"]
  2266. M2 = topo.ms["master2"]
  2267. M3 = topo.ms["master3"]
  2268. value_init = '3'
  2269. last = '7'
  2270. value_S1 = '7.1'
  2271. value_S2 = '7.2'
  2272. description = {
  2273. "S1": M1,
  2274. "S2": M2,
  2275. "S1_MODRDN": value_S1,
  2276. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  2277. "S2_MODRDN": value_S2,
  2278. "expected": value_S1}
  2279. # This test takes the user_1
  2280. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2281. #
  2282. # Step 4
  2283. #
  2284. # disable all RA from M1 and M2
  2285. # only M3 can replicate the update
  2286. #
  2287. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2288. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2289. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2290. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2291. M1.agreement.pause(agreement_m1_m2[0].dn)
  2292. M1.agreement.pause(agreement_m1_m3[0].dn)
  2293. M2.agreement.pause(agreement_m2_m1[0].dn)
  2294. M2.agreement.pause(agreement_m2_m3[0].dn)
  2295. # Step 5
  2296. # Oldest update
  2297. # check that the entry on M1 contains employeeNumber=<value_end>
  2298. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2299. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2300. assert len(ents) == 1
  2301. time.sleep(1)
  2302. # Step 6
  2303. # More recent update
  2304. # check that the entry on M2 contains employeeNumber=<value_end>
  2305. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2306. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2307. assert len(ents) == 1
  2308. time.sleep(1)
  2309. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2310. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2311. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2312. assert len(ents) == 1
  2313. _resume_ra_M1_then_M2(M1, M2, M3)
  2314. #time.sleep(3600)
  2315. # Step 9
  2316. # Check that M1 still contains employeeNumber=<value_end>
  2317. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2318. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2319. assert len(ents) == 1
  2320. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2321. # Check that M2 still contains employeeNumber=<value_end>
  2322. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2323. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2324. assert len(ents) == 1
  2325. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2326. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2327. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2328. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2329. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2330. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2331. assert len(ents) == 1
  2332. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2333. def test_ticket49658_23(topo):
  2334. """Do
  2335. M1: MODRDN -> V1
  2336. M2: MODRDN -> V2
  2337. M1: MOD(REPL) -> V1
  2338. M2: MOD(REPL) -> V2
  2339. Replicate order: M2 then M1
  2340. expected: V2
  2341. :id: 2c550174-33a0-4666-8abf-f3362e19ae29
  2342. :setup: 3 Master Instances
  2343. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2344. :steps:
  2345. 1. Isolate M1 and M2 by pausing the replication agreements
  2346. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2347. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2348. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2349. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2350. 6. Check that the employeeNumber is 13 on all servers
  2351. :expectedresults:
  2352. 1. Fill in the result that is expected
  2353. 2. For each test step
  2354. """
  2355. # If you need any test suite initialization,
  2356. # please, write additional fixture for that (including finalizer).
  2357. # Topology for suites are predefined in lib389/topologies.py.
  2358. # If you need host, port or any other data about instance,
  2359. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2360. if DEBUGGING:
  2361. # Add debugging steps(if any)...
  2362. pass
  2363. M1 = topo.ms["master1"]
  2364. M2 = topo.ms["master2"]
  2365. M3 = topo.ms["master3"]
  2366. value_init = '7'
  2367. last = '8'
  2368. value_S1 = '8.1'
  2369. value_S2 = '8.2'
  2370. description = {
  2371. "S1": M1,
  2372. "S2": M2,
  2373. "S1_MODRDN": value_S1,
  2374. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  2375. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  2376. "S2_MODRDN": value_S2,
  2377. "expected": value_S2}
  2378. # This test takes the user_1
  2379. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2380. #
  2381. # Step 4
  2382. #
  2383. # disable all RA from M1 and M2
  2384. # only M3 can replicate the update
  2385. #
  2386. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2387. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2388. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2389. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2390. M1.agreement.pause(agreement_m1_m2[0].dn)
  2391. M1.agreement.pause(agreement_m1_m3[0].dn)
  2392. M2.agreement.pause(agreement_m2_m1[0].dn)
  2393. M2.agreement.pause(agreement_m2_m3[0].dn)
  2394. # Step 5
  2395. # Oldest update
  2396. # check that the entry on M1 contains employeeNumber=<value_end>
  2397. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2398. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2399. assert len(ents) == 1
  2400. time.sleep(1)
  2401. # Step 6
  2402. # More recent update
  2403. # check that the entry on M2 contains employeeNumber=<value_end>
  2404. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2405. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2406. assert len(ents) == 1
  2407. time.sleep(1)
  2408. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2409. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2410. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2411. assert len(ents) == 1
  2412. time.sleep(1)
  2413. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2414. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2415. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2416. assert len(ents) == 1
  2417. _resume_ra_M2_then_M1(M1, M2, M3)
  2418. #time.sleep(3600)
  2419. # Step 9
  2420. # Check that M1 still contains employeeNumber=<value_end>
  2421. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2422. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2423. assert len(ents) == 1
  2424. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2425. # Check that M2 still contains employeeNumber=<value_end>
  2426. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2427. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2428. assert len(ents) == 1
  2429. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2430. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2431. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2432. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2433. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2434. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2435. assert len(ents) == 1
  2436. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2437. def test_ticket49658_24(topo):
  2438. """Do
  2439. M1: MODRDN -> V1
  2440. M2: MODRDN -> V2
  2441. M1: MOD(REPL) -> V1
  2442. M2: MOD(REPL) -> V2
  2443. Replicate order: M1 then M2
  2444. expected: V2
  2445. :id: af6a472c-29e3-4833-a5dc-d96c684d33f9
  2446. :setup: 3 Master Instances
  2447. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2448. :steps:
  2449. 1. Isolate M1 and M2 by pausing the replication agreements
  2450. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2451. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2452. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2453. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2454. 6. Check that the employeeNumber is 13 on all servers
  2455. :expectedresults:
  2456. 1. Fill in the result that is expected
  2457. 2. For each test step
  2458. """
  2459. # If you need any test suite initialization,
  2460. # please, write additional fixture for that (including finalizer).
  2461. # Topology for suites are predefined in lib389/topologies.py.
  2462. # If you need host, port or any other data about instance,
  2463. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2464. if DEBUGGING:
  2465. # Add debugging steps(if any)...
  2466. pass
  2467. M1 = topo.ms["master1"]
  2468. M2 = topo.ms["master2"]
  2469. M3 = topo.ms["master3"]
  2470. value_init = '7'
  2471. last = '9'
  2472. value_S1 = '9.1'
  2473. value_S2 = '9.2'
  2474. description = {
  2475. "S1": M1,
  2476. "S2": M2,
  2477. "S1_MODRDN": value_S1,
  2478. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  2479. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  2480. "S2_MODRDN": value_S2,
  2481. "expected": value_S2}
  2482. # This test takes the user_1
  2483. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2484. #
  2485. # Step 4
  2486. #
  2487. # disable all RA from M1 and M2
  2488. # only M3 can replicate the update
  2489. #
  2490. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2491. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2492. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2493. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2494. M1.agreement.pause(agreement_m1_m2[0].dn)
  2495. M1.agreement.pause(agreement_m1_m3[0].dn)
  2496. M2.agreement.pause(agreement_m2_m1[0].dn)
  2497. M2.agreement.pause(agreement_m2_m3[0].dn)
  2498. # Step 5
  2499. # Oldest update
  2500. # check that the entry on M1 contains employeeNumber=<value_end>
  2501. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2502. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2503. assert len(ents) == 1
  2504. time.sleep(1)
  2505. # Step 6
  2506. # More recent update
  2507. # check that the entry on M2 contains employeeNumber=<value_end>
  2508. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2509. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2510. assert len(ents) == 1
  2511. time.sleep(1)
  2512. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2513. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2514. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2515. assert len(ents) == 1
  2516. time.sleep(1)
  2517. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2518. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2519. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2520. assert len(ents) == 1
  2521. _resume_ra_M1_then_M2(M1, M2, M3)
  2522. #time.sleep(3600)
  2523. # Step 9
  2524. # Check that M1 still contains employeeNumber=<value_end>
  2525. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2526. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2527. assert len(ents) == 1
  2528. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2529. # Check that M2 still contains employeeNumber=<value_end>
  2530. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2531. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2532. assert len(ents) == 1
  2533. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2534. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2535. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2536. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2537. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2538. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2539. assert len(ents) == 1
  2540. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2541. def test_ticket49658_25(topo):
  2542. """Do
  2543. M1: MODRDN -> V1
  2544. M2: MODRDN -> V2
  2545. M1: MOD(REPL) -> V1
  2546. M2: MOD(DEL/ADD) -> V2
  2547. Replicate order: M1 then M2
  2548. expected: V2
  2549. :id: df2cba7c-7afa-44b3-b1df-261e8bf0c9b4
  2550. :setup: 3 Master Instances
  2551. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2552. :steps:
  2553. 1. Isolate M1 and M2 by pausing the replication agreements
  2554. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2555. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2556. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2557. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2558. 6. Check that the employeeNumber is 13 on all servers
  2559. :expectedresults:
  2560. 1. Fill in the result that is expected
  2561. 2. For each test step
  2562. """
  2563. # If you need any test suite initialization,
  2564. # please, write additional fixture for that (including finalizer).
  2565. # Topology for suites are predefined in lib389/topologies.py.
  2566. # If you need host, port or any other data about instance,
  2567. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2568. if DEBUGGING:
  2569. # Add debugging steps(if any)...
  2570. pass
  2571. M1 = topo.ms["master1"]
  2572. M2 = topo.ms["master2"]
  2573. M3 = topo.ms["master3"]
  2574. value_init = '7'
  2575. last = '10'
  2576. value_S1 = '10.1'
  2577. value_S2 = '10.2'
  2578. description = {
  2579. "S1": M1,
  2580. "S2": M2,
  2581. "S1_MODRDN": value_S1,
  2582. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  2583. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S2.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  2584. "S2_MODRDN": value_S2,
  2585. "expected": value_S2}
  2586. # This test takes the user_1
  2587. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2588. #
  2589. # Step 4
  2590. #
  2591. # disable all RA from M1 and M2
  2592. # only M3 can replicate the update
  2593. #
  2594. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2595. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2596. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2597. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2598. M1.agreement.pause(agreement_m1_m2[0].dn)
  2599. M1.agreement.pause(agreement_m1_m3[0].dn)
  2600. M2.agreement.pause(agreement_m2_m1[0].dn)
  2601. M2.agreement.pause(agreement_m2_m3[0].dn)
  2602. # Step 5
  2603. # Oldest update
  2604. # check that the entry on M1 contains employeeNumber=<value_end>
  2605. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2606. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2607. assert len(ents) == 1
  2608. time.sleep(1)
  2609. # Step 6
  2610. # More recent update
  2611. # check that the entry on M2 contains employeeNumber=<value_end>
  2612. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2613. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2614. assert len(ents) == 1
  2615. time.sleep(1)
  2616. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2617. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2618. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2619. assert len(ents) == 1
  2620. time.sleep(1)
  2621. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2622. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2623. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2624. assert len(ents) == 1
  2625. _resume_ra_M1_then_M2(M1, M2, M3)
  2626. #time.sleep(3600)
  2627. # Step 9
  2628. # Check that M1 still contains employeeNumber=<value_end>
  2629. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2630. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2631. assert len(ents) == 1
  2632. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2633. # Check that M2 still contains employeeNumber=<value_end>
  2634. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2635. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2636. assert len(ents) == 1
  2637. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2638. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2639. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2640. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2641. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2642. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2643. assert len(ents) == 1
  2644. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2645. def test_ticket49658_26(topo):
  2646. """Do
  2647. M1: MODRDN -> V1
  2648. M2: MODRDN -> V2
  2649. M1: MOD(REPL) -> V1
  2650. M2: MOD(DEL/ADD) -> V2
  2651. Replicate order: M2 then M1
  2652. expected: V2
  2653. :id: 8e9f85d3-22cc-4a84-a828-cec29202821f
  2654. :setup: 3 Master Instances
  2655. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2656. :steps:
  2657. 1. Isolate M1 and M2 by pausing the replication agreements
  2658. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2659. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2660. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2661. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2662. 6. Check that the employeeNumber is 13 on all servers
  2663. :expectedresults:
  2664. 1. Fill in the result that is expected
  2665. 2. For each test step
  2666. """
  2667. # If you need any test suite initialization,
  2668. # please, write additional fixture for that (including finalizer).
  2669. # Topology for suites are predefined in lib389/topologies.py.
  2670. # If you need host, port or any other data about instance,
  2671. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2672. if DEBUGGING:
  2673. # Add debugging steps(if any)...
  2674. pass
  2675. M1 = topo.ms["master1"]
  2676. M2 = topo.ms["master2"]
  2677. M3 = topo.ms["master3"]
  2678. value_init = '7'
  2679. last = '11'
  2680. value_S1 = '11.1'
  2681. value_S2 = '11.2'
  2682. description = {
  2683. "S1": M1,
  2684. "S2": M2,
  2685. "S1_MODRDN": value_S1,
  2686. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  2687. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S2.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  2688. "S2_MODRDN": value_S2,
  2689. "expected": value_S2}
  2690. # This test takes the user_1
  2691. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2692. #
  2693. # Step 4
  2694. #
  2695. # disable all RA from M1 and M2
  2696. # only M3 can replicate the update
  2697. #
  2698. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2699. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2700. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2701. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2702. M1.agreement.pause(agreement_m1_m2[0].dn)
  2703. M1.agreement.pause(agreement_m1_m3[0].dn)
  2704. M2.agreement.pause(agreement_m2_m1[0].dn)
  2705. M2.agreement.pause(agreement_m2_m3[0].dn)
  2706. # Step 5
  2707. # Oldest update
  2708. # check that the entry on M1 contains employeeNumber=<value_end>
  2709. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2710. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2711. assert len(ents) == 1
  2712. time.sleep(1)
  2713. # Step 6
  2714. # More recent update
  2715. # check that the entry on M2 contains employeeNumber=<value_end>
  2716. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2717. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2718. assert len(ents) == 1
  2719. time.sleep(1)
  2720. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2721. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2722. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2723. assert len(ents) == 1
  2724. time.sleep(1)
  2725. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2726. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2727. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2728. assert len(ents) == 1
  2729. _resume_ra_M2_then_M1(M1, M2, M3)
  2730. #time.sleep(3600)
  2731. # Step 9
  2732. # Check that M1 still contains employeeNumber=<value_end>
  2733. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2734. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2735. assert len(ents) == 1
  2736. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2737. # Check that M2 still contains employeeNumber=<value_end>
  2738. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2739. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2740. assert len(ents) == 1
  2741. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2742. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2743. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2744. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2745. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2746. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2747. assert len(ents) == 1
  2748. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2749. def test_ticket49658_27(topo):
  2750. """Do
  2751. M1: MODRDN -> V1
  2752. M2: MODRDN -> V2
  2753. M1: MOD(DEL/ADD) -> V1
  2754. M2: MOD(REPL) -> V2
  2755. Replicate order: M1 then M2
  2756. expected: V2
  2757. :id: d85bd9ef-b257-4027-a29c-dfba87c0bf51
  2758. :setup: 3 Master Instances
  2759. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2760. :steps:
  2761. 1. Isolate M1 and M2 by pausing the replication agreements
  2762. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2763. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2764. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2765. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2766. 6. Check that the employeeNumber is 13 on all servers
  2767. :expectedresults:
  2768. 1. Fill in the result that is expected
  2769. 2. For each test step
  2770. """
  2771. # If you need any test suite initialization,
  2772. # please, write additional fixture for that (including finalizer).
  2773. # Topology for suites are predefined in lib389/topologies.py.
  2774. # If you need host, port or any other data about instance,
  2775. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2776. if DEBUGGING:
  2777. # Add debugging steps(if any)...
  2778. pass
  2779. M1 = topo.ms["master1"]
  2780. M2 = topo.ms["master2"]
  2781. M3 = topo.ms["master3"]
  2782. value_init = '7'
  2783. last = '12'
  2784. value_S1 = '12.1'
  2785. value_S2 = '12.2'
  2786. description = {
  2787. "S1": M1,
  2788. "S2": M2,
  2789. "S1_MODRDN": value_S1,
  2790. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  2791. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  2792. "S2_MODRDN": value_S2,
  2793. "expected": value_S2}
  2794. # This test takes the user_1
  2795. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2796. #
  2797. # Step 4
  2798. #
  2799. # disable all RA from M1 and M2
  2800. # only M3 can replicate the update
  2801. #
  2802. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2803. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2804. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2805. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2806. M1.agreement.pause(agreement_m1_m2[0].dn)
  2807. M1.agreement.pause(agreement_m1_m3[0].dn)
  2808. M2.agreement.pause(agreement_m2_m1[0].dn)
  2809. M2.agreement.pause(agreement_m2_m3[0].dn)
  2810. # Step 5
  2811. # Oldest update
  2812. # check that the entry on M1 contains employeeNumber=<value_end>
  2813. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2814. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2815. assert len(ents) == 1
  2816. time.sleep(1)
  2817. # Step 6
  2818. # More recent update
  2819. # check that the entry on M2 contains employeeNumber=<value_end>
  2820. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2821. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2822. assert len(ents) == 1
  2823. time.sleep(1)
  2824. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2825. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2826. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2827. assert len(ents) == 1
  2828. time.sleep(1)
  2829. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2830. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2831. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2832. assert len(ents) == 1
  2833. _resume_ra_M1_then_M2(M1, M2, M3)
  2834. #time.sleep(3600)
  2835. # Step 9
  2836. # Check that M1 still contains employeeNumber=<value_end>
  2837. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2838. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2839. assert len(ents) == 1
  2840. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2841. # Check that M2 still contains employeeNumber=<value_end>
  2842. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2843. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2844. assert len(ents) == 1
  2845. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2846. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2847. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2848. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2849. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2850. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2851. assert len(ents) == 1
  2852. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2853. def test_ticket49658_28(topo):
  2854. """Do
  2855. M1: MODRDN -> V1
  2856. M2: MODRDN -> V2
  2857. M1: MOD(DEL/ADD) -> V1
  2858. M2: MOD(REPL) -> V2
  2859. Replicate order: M2 then M1
  2860. expected: V2
  2861. :id: 286cd17e-225e-490f-83c9-20618b9407a9
  2862. :setup: 3 Master Instances
  2863. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2864. :steps:
  2865. 1. Isolate M1 and M2 by pausing the replication agreements
  2866. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2867. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2868. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2869. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2870. 6. Check that the employeeNumber is 13 on all servers
  2871. :expectedresults:
  2872. 1. Fill in the result that is expected
  2873. 2. For each test step
  2874. """
  2875. # If you need any test suite initialization,
  2876. # please, write additional fixture for that (including finalizer).
  2877. # Topology for suites are predefined in lib389/topologies.py.
  2878. # If you need host, port or any other data about instance,
  2879. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2880. if DEBUGGING:
  2881. # Add debugging steps(if any)...
  2882. pass
  2883. M1 = topo.ms["master1"]
  2884. M2 = topo.ms["master2"]
  2885. M3 = topo.ms["master3"]
  2886. value_init = '7'
  2887. last = '13'
  2888. value_S1 = '13.1'
  2889. value_S2 = '13.2'
  2890. description = {
  2891. "S1": M1,
  2892. "S2": M2,
  2893. "S1_MODRDN": value_S1,
  2894. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  2895. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  2896. "S2_MODRDN": value_S2,
  2897. "expected": value_S2}
  2898. # This test takes the user_1
  2899. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  2900. #
  2901. # Step 4
  2902. #
  2903. # disable all RA from M1 and M2
  2904. # only M3 can replicate the update
  2905. #
  2906. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  2907. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2908. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  2909. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  2910. M1.agreement.pause(agreement_m1_m2[0].dn)
  2911. M1.agreement.pause(agreement_m1_m3[0].dn)
  2912. M2.agreement.pause(agreement_m2_m1[0].dn)
  2913. M2.agreement.pause(agreement_m2_m3[0].dn)
  2914. # Step 5
  2915. # Oldest update
  2916. # check that the entry on M1 contains employeeNumber=<value_end>
  2917. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2918. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  2919. assert len(ents) == 1
  2920. time.sleep(1)
  2921. # Step 6
  2922. # More recent update
  2923. # check that the entry on M2 contains employeeNumber=<value_end>
  2924. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  2925. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  2926. assert len(ents) == 1
  2927. time.sleep(1)
  2928. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  2929. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  2930. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  2931. assert len(ents) == 1
  2932. time.sleep(1)
  2933. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  2934. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  2935. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  2936. assert len(ents) == 1
  2937. _resume_ra_M2_then_M1(M1, M2, M3)
  2938. #time.sleep(3600)
  2939. # Step 9
  2940. # Check that M1 still contains employeeNumber=<value_end>
  2941. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2942. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2943. assert len(ents) == 1
  2944. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2945. # Check that M2 still contains employeeNumber=<value_end>
  2946. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2947. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2948. assert len(ents) == 1
  2949. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2950. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  2951. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  2952. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  2953. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  2954. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  2955. assert len(ents) == 1
  2956. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  2957. def test_ticket49658_29(topo):
  2958. """Do
  2959. M1: MODRDN -> V1
  2960. M2: MODRDN -> V2
  2961. M1: MOD(DEL/ADD) -> V1
  2962. M2: MOD(DEL/ADD) -> V2
  2963. Replicate order: M1 then M2
  2964. expected: V2
  2965. :id: b81f3885-7965-48fe-8dbf-692d1150d061
  2966. :setup: 3 Master Instances
  2967. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  2968. :steps:
  2969. 1. Isolate M1 and M2 by pausing the replication agreements
  2970. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  2971. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  2972. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  2973. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  2974. 6. Check that the employeeNumber is 13 on all servers
  2975. :expectedresults:
  2976. 1. Fill in the result that is expected
  2977. 2. For each test step
  2978. """
  2979. # If you need any test suite initialization,
  2980. # please, write additional fixture for that (including finalizer).
  2981. # Topology for suites are predefined in lib389/topologies.py.
  2982. # If you need host, port or any other data about instance,
  2983. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  2984. if DEBUGGING:
  2985. # Add debugging steps(if any)...
  2986. pass
  2987. M1 = topo.ms["master1"]
  2988. M2 = topo.ms["master2"]
  2989. M3 = topo.ms["master3"]
  2990. value_init = '7'
  2991. last = '14'
  2992. value_S1 = '14.1'
  2993. value_S2 = '14.2'
  2994. description = {
  2995. "S1": M1,
  2996. "S2": M2,
  2997. "S1_MODRDN": value_S1,
  2998. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  2999. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S2.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  3000. "S2_MODRDN": value_S2,
  3001. "expected": value_S2}
  3002. # This test takes the user_1
  3003. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3004. #
  3005. # Step 4
  3006. #
  3007. # disable all RA from M1 and M2
  3008. # only M3 can replicate the update
  3009. #
  3010. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3011. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3012. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3013. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3014. M1.agreement.pause(agreement_m1_m2[0].dn)
  3015. M1.agreement.pause(agreement_m1_m3[0].dn)
  3016. M2.agreement.pause(agreement_m2_m1[0].dn)
  3017. M2.agreement.pause(agreement_m2_m3[0].dn)
  3018. # Step 5
  3019. # Oldest update
  3020. # check that the entry on M1 contains employeeNumber=<value_end>
  3021. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3022. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3023. assert len(ents) == 1
  3024. time.sleep(1)
  3025. # Step 6
  3026. # More recent update
  3027. # check that the entry on M2 contains employeeNumber=<value_end>
  3028. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3029. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  3030. assert len(ents) == 1
  3031. time.sleep(1)
  3032. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3033. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3034. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3035. assert len(ents) == 1
  3036. time.sleep(1)
  3037. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  3038. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  3039. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  3040. assert len(ents) == 1
  3041. _resume_ra_M1_then_M2(M1, M2, M3)
  3042. #time.sleep(3600)
  3043. # Step 9
  3044. # Check that M1 still contains employeeNumber=<value_end>
  3045. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3046. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3047. assert len(ents) == 1
  3048. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3049. # Check that M2 still contains employeeNumber=<value_end>
  3050. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3051. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3052. assert len(ents) == 1
  3053. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3054. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3055. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3056. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3057. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3058. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3059. assert len(ents) == 1
  3060. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3061. def test_ticket49658_30(topo):
  3062. """Do
  3063. M1: MODRDN -> V1
  3064. M2: MODRDN -> V2
  3065. M1: MOD(DEL/ADD) -> V1
  3066. M2: MOD(DEL/ADD) -> V2
  3067. Replicate order: M2 then M1
  3068. expected: V2
  3069. :id: 4dce88f8-31db-488b-aeb4-fce4173e3f12
  3070. :setup: 3 Master Instances
  3071. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  3072. :steps:
  3073. 1. Isolate M1 and M2 by pausing the replication agreements
  3074. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  3075. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  3076. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  3077. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  3078. 6. Check that the employeeNumber is 13 on all servers
  3079. :expectedresults:
  3080. 1. Fill in the result that is expected
  3081. 2. For each test step
  3082. """
  3083. # If you need any test suite initialization,
  3084. # please, write additional fixture for that (including finalizer).
  3085. # Topology for suites are predefined in lib389/topologies.py.
  3086. # If you need host, port or any other data about instance,
  3087. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  3088. if DEBUGGING:
  3089. # Add debugging steps(if any)...
  3090. pass
  3091. M1 = topo.ms["master1"]
  3092. M2 = topo.ms["master2"]
  3093. M3 = topo.ms["master3"]
  3094. value_init = '7'
  3095. last = '15'
  3096. value_S1 = '15.1'
  3097. value_S2 = '15.2'
  3098. description = {
  3099. "S1": M1,
  3100. "S2": M2,
  3101. "S1_MODRDN": value_S1,
  3102. "S1_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S1.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S1.encode())],
  3103. "S2_MOD": [(ldap.MOD_DELETE, 'employeeNumber', value_S2.encode()),(ldap.MOD_ADD, 'employeeNumber', value_S2.encode())],
  3104. "S2_MODRDN": value_S2,
  3105. "expected": value_S2}
  3106. # This test takes the user_1
  3107. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3108. #
  3109. # Step 4
  3110. #
  3111. # disable all RA from M1 and M2
  3112. # only M3 can replicate the update
  3113. #
  3114. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3115. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3116. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3117. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3118. M1.agreement.pause(agreement_m1_m2[0].dn)
  3119. M1.agreement.pause(agreement_m1_m3[0].dn)
  3120. M2.agreement.pause(agreement_m2_m1[0].dn)
  3121. M2.agreement.pause(agreement_m2_m3[0].dn)
  3122. # Step 5
  3123. # Oldest update
  3124. # check that the entry on M1 contains employeeNumber=<value_end>
  3125. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3126. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3127. assert len(ents) == 1
  3128. time.sleep(1)
  3129. # Step 6
  3130. # More recent update
  3131. # check that the entry on M2 contains employeeNumber=<value_end>
  3132. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3133. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN"])
  3134. assert len(ents) == 1
  3135. time.sleep(1)
  3136. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3137. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3138. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3139. assert len(ents) == 1
  3140. time.sleep(1)
  3141. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN"])
  3142. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  3143. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  3144. assert len(ents) == 1
  3145. _resume_ra_M2_then_M1(M1, M2, M3)
  3146. #time.sleep(3600)
  3147. # Step 9
  3148. # Check that M1 still contains employeeNumber=<value_end>
  3149. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3150. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3151. assert len(ents) == 1
  3152. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3153. # Check that M2 still contains employeeNumber=<value_end>
  3154. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3155. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3156. assert len(ents) == 1
  3157. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3158. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3159. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3160. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3161. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3162. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3163. assert len(ents) == 1
  3164. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3165. def test_ticket49658_31(topo):
  3166. """Do
  3167. M1: MODRDN -> V1
  3168. M2: MODRDN -> V2
  3169. M1: MOD(REPL) -> V1
  3170. M2: MOD(REPL) -> V2
  3171. M2: MODRDN -> V1
  3172. Replicate order: M2 then M1
  3173. expected: V1
  3174. :id: 2791a3df-25a2-4e6e-a5e9-514d76af43fb
  3175. :setup: 3 Master Instances
  3176. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  3177. :steps:
  3178. 1. Isolate M1 and M2 by pausing the replication agreements
  3179. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  3180. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  3181. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  3182. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  3183. 6. Check that the employeeNumber is 13 on all servers
  3184. :expectedresults:
  3185. 1. Fill in the result that is expected
  3186. 2. For each test step
  3187. """
  3188. # If you need any test suite initialization,
  3189. # please, write additional fixture for that (including finalizer).
  3190. # Topology for suites are predefined in lib389/topologies.py.
  3191. # If you need host, port or any other data about instance,
  3192. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  3193. if DEBUGGING:
  3194. # Add debugging steps(if any)...
  3195. pass
  3196. M1 = topo.ms["master1"]
  3197. M2 = topo.ms["master2"]
  3198. M3 = topo.ms["master3"]
  3199. value_init = '7'
  3200. last = '16'
  3201. value_S1 = '16.1'
  3202. value_S2 = '16.2'
  3203. description = {
  3204. "S1": M1,
  3205. "S2": M2,
  3206. "S1_MODRDN": value_S1,
  3207. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  3208. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  3209. "S2_MODRDN_1": value_S2,
  3210. "S2_MODRDN_2": value_S1,
  3211. "expected": value_S1}
  3212. # This test takes the user_1
  3213. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3214. #
  3215. # Step 4
  3216. #
  3217. # disable all RA from M1 and M2
  3218. # only M3 can replicate the update
  3219. #
  3220. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3221. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3222. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3223. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3224. M1.agreement.pause(agreement_m1_m2[0].dn)
  3225. M1.agreement.pause(agreement_m1_m3[0].dn)
  3226. M2.agreement.pause(agreement_m2_m1[0].dn)
  3227. M2.agreement.pause(agreement_m2_m3[0].dn)
  3228. # Step 5
  3229. # Oldest update
  3230. # check that the entry on M1 contains employeeNumber=<value_end>
  3231. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3232. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3233. assert len(ents) == 1
  3234. time.sleep(1)
  3235. # Step 6
  3236. # More recent update
  3237. # check that the entry on M2 contains employeeNumber=<value_end>
  3238. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_1"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3239. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_1"])
  3240. assert len(ents) == 1
  3241. time.sleep(1)
  3242. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3243. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3244. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3245. assert len(ents) == 1
  3246. time.sleep(1)
  3247. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN_1"])
  3248. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  3249. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  3250. assert len(ents) == 1
  3251. description["S2"].rename_s(new_test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_2"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3252. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_2"])
  3253. assert len(ents) == 1
  3254. time.sleep(1)
  3255. _resume_ra_M2_then_M1(M1, M2, M3)
  3256. #time.sleep(3600)
  3257. # Step 9
  3258. # Check that M1 still contains employeeNumber=<value_end>
  3259. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3260. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3261. assert len(ents) == 1
  3262. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3263. # Check that M2 still contains employeeNumber=<value_end>
  3264. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3265. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3266. assert len(ents) == 1
  3267. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3268. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3269. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3270. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3271. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3272. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3273. assert len(ents) == 1
  3274. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3275. def test_ticket49658_32(topo):
  3276. """Do
  3277. M1: MODRDN -> V1
  3278. M2: MODRDN -> V2
  3279. M1: MOD(REPL) -> V1
  3280. M2: MOD(REPL) -> V2
  3281. M2: MODRDN -> V1
  3282. Replicate order: M1 then M2
  3283. expected: V1
  3284. :id: 6af57e2e-a325-474a-9c9d-f07cd2244657
  3285. :setup: 3 Master Instances
  3286. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  3287. :steps:
  3288. 1. Isolate M1 and M2 by pausing the replication agreements
  3289. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  3290. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  3291. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  3292. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  3293. 6. Check that the employeeNumber is 13 on all servers
  3294. :expectedresults:
  3295. 1. Fill in the result that is expected
  3296. 2. For each test step
  3297. """
  3298. # If you need any test suite initialization,
  3299. # please, write additional fixture for that (including finalizer).
  3300. # Topology for suites are predefined in lib389/topologies.py.
  3301. # If you need host, port or any other data about instance,
  3302. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  3303. if DEBUGGING:
  3304. # Add debugging steps(if any)...
  3305. pass
  3306. M1 = topo.ms["master1"]
  3307. M2 = topo.ms["master2"]
  3308. M3 = topo.ms["master3"]
  3309. value_init = '7'
  3310. last = '17'
  3311. value_S1 = '17.1'
  3312. value_S2 = '17.2'
  3313. description = {
  3314. "S1": M1,
  3315. "S2": M2,
  3316. "S1_MODRDN": value_S1,
  3317. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  3318. "S2_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S2.encode())],
  3319. "S2_MODRDN_1": value_S2,
  3320. "S2_MODRDN_2": value_S1,
  3321. "expected": value_S1}
  3322. # This test takes the user_1
  3323. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3324. #
  3325. # Step 4
  3326. #
  3327. # disable all RA from M1 and M2
  3328. # only M3 can replicate the update
  3329. #
  3330. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3331. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3332. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3333. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3334. M1.agreement.pause(agreement_m1_m2[0].dn)
  3335. M1.agreement.pause(agreement_m1_m3[0].dn)
  3336. M2.agreement.pause(agreement_m2_m1[0].dn)
  3337. M2.agreement.pause(agreement_m2_m3[0].dn)
  3338. # Step 5
  3339. # Oldest update
  3340. # check that the entry on M1 contains employeeNumber=<value_end>
  3341. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3342. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3343. assert len(ents) == 1
  3344. time.sleep(1)
  3345. # Step 6
  3346. # More recent update
  3347. # check that the entry on M2 contains employeeNumber=<value_end>
  3348. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_1"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3349. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_1"])
  3350. assert len(ents) == 1
  3351. time.sleep(1)
  3352. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3353. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3354. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3355. assert len(ents) == 1
  3356. time.sleep(1)
  3357. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN_1"])
  3358. description["S2"].modify_s(new_test_user_dn, description["S2_MOD"])
  3359. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S2)
  3360. assert len(ents) == 1
  3361. description["S2"].rename_s(new_test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_2"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3362. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_2"])
  3363. assert len(ents) == 1
  3364. time.sleep(1)
  3365. _resume_ra_M1_then_M2(M1, M2, M3)
  3366. #time.sleep(3600)
  3367. # Step 9
  3368. # Check that M1 still contains employeeNumber=<value_end>
  3369. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3370. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3371. assert len(ents) == 1
  3372. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3373. # Check that M2 still contains employeeNumber=<value_end>
  3374. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3375. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3376. assert len(ents) == 1
  3377. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3378. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3379. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3380. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3381. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3382. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3383. assert len(ents) == 1
  3384. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3385. def test_ticket49658_33(topo):
  3386. """Do
  3387. M1: MODRDN -> V1
  3388. M2: MODRDN -> V2
  3389. M1: MOD(REPL) -> V1
  3390. M2: MODRDN -> V1
  3391. Replicate order: M2 then M1
  3392. expected: V1
  3393. :id: 81100b04-d3b6-47df-90eb-d96ef14a3722
  3394. :setup: 3 Master Instances
  3395. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  3396. :steps:
  3397. 1. Isolate M1 and M2 by pausing the replication agreements
  3398. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  3399. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  3400. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  3401. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  3402. 6. Check that the employeeNumber is 13 on all servers
  3403. :expectedresults:
  3404. 1. Fill in the result that is expected
  3405. 2. For each test step
  3406. """
  3407. # If you need any test suite initialization,
  3408. # please, write additional fixture for that (including finalizer).
  3409. # Topology for suites are predefined in lib389/topologies.py.
  3410. # If you need host, port or any other data about instance,
  3411. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  3412. if DEBUGGING:
  3413. # Add debugging steps(if any)...
  3414. pass
  3415. M1 = topo.ms["master1"]
  3416. M2 = topo.ms["master2"]
  3417. M3 = topo.ms["master3"]
  3418. value_init = '7'
  3419. last = '18'
  3420. value_S1 = '18.1'
  3421. value_S2 = '18.2'
  3422. description = {
  3423. "S1": M1,
  3424. "S2": M2,
  3425. "S1_MODRDN": value_S1,
  3426. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  3427. "S2_MODRDN_1": value_S2,
  3428. "S2_MODRDN_2": value_S1,
  3429. "expected": value_S1}
  3430. # This test takes the user_1
  3431. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3432. #
  3433. # Step 4
  3434. #
  3435. # disable all RA from M1 and M2
  3436. # only M3 can replicate the update
  3437. #
  3438. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3439. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3440. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3441. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3442. M1.agreement.pause(agreement_m1_m2[0].dn)
  3443. M1.agreement.pause(agreement_m1_m3[0].dn)
  3444. M2.agreement.pause(agreement_m2_m1[0].dn)
  3445. M2.agreement.pause(agreement_m2_m3[0].dn)
  3446. # Step 5
  3447. # Oldest update
  3448. # check that the entry on M1 contains employeeNumber=<value_end>
  3449. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3450. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3451. assert len(ents) == 1
  3452. time.sleep(1)
  3453. # Step 6
  3454. # More recent update
  3455. # check that the entry on M2 contains employeeNumber=<value_end>
  3456. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_1"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3457. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_1"])
  3458. assert len(ents) == 1
  3459. time.sleep(1)
  3460. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3461. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3462. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3463. assert len(ents) == 1
  3464. time.sleep(1)
  3465. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN_1"])
  3466. description["S2"].rename_s(new_test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_2"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3467. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_2"])
  3468. assert len(ents) == 1
  3469. time.sleep(1)
  3470. _resume_ra_M2_then_M1(M1, M2, M3)
  3471. #time.sleep(3600)
  3472. # Step 9
  3473. # Check that M1 still contains employeeNumber=<value_end>
  3474. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3475. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3476. assert len(ents) == 1
  3477. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3478. # Check that M2 still contains employeeNumber=<value_end>
  3479. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3480. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3481. assert len(ents) == 1
  3482. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3483. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3484. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3485. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3486. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3487. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3488. assert len(ents) == 1
  3489. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3490. def test_ticket49658_34(topo):
  3491. """Do
  3492. M1: MODRDN -> V1
  3493. M2: MODRDN -> V2
  3494. M1: MOD(REPL) -> V1
  3495. M2: MODRDN -> V1
  3496. Replicate order: M1 then M2
  3497. expected: V1
  3498. :id: 796d3d77-2401-49f5-89fa-80b231d3e758
  3499. :setup: 3 Master Instances
  3500. 1. Use employeenumber=1000,ou=distinguished,ou=people,<suffix>
  3501. :steps:
  3502. 1. Isolate M1 and M2 by pausing the replication agreements
  3503. 2. On M1 do DEL+ADD 1000 + MOD_ADD_13
  3504. 3. On M2 do DEL+ADD 1000 + MOD_ADD_13
  3505. 4. Enable replication agreement M2 -> M3, so that update step 2 is replicated first
  3506. 5. Enable replication agreement M1 -> M3, so that update step 3 is replicated second
  3507. 6. Check that the employeeNumber is 13 on all servers
  3508. :expectedresults:
  3509. 1. Fill in the result that is expected
  3510. 2. For each test step
  3511. """
  3512. # If you need any test suite initialization,
  3513. # please, write additional fixture for that (including finalizer).
  3514. # Topology for suites are predefined in lib389/topologies.py.
  3515. # If you need host, port or any other data about instance,
  3516. # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
  3517. if DEBUGGING:
  3518. # Add debugging steps(if any)...
  3519. pass
  3520. M1 = topo.ms["master1"]
  3521. M2 = topo.ms["master2"]
  3522. M3 = topo.ms["master3"]
  3523. value_init = '7'
  3524. last = '19'
  3525. value_S1 = '19.1'
  3526. value_S2 = '19.2'
  3527. description = {
  3528. "S1": M1,
  3529. "S2": M2,
  3530. "S1_MODRDN": value_S1,
  3531. "S1_MOD": [(ldap.MOD_REPLACE, 'employeeNumber', value_S1.encode())],
  3532. "S2_MODRDN_1": value_S2,
  3533. "S2_MODRDN_2": value_S1,
  3534. "expected": value_S1}
  3535. # This test takes the user_1
  3536. (uid, test_user_dn) = _employeenumber_user_get_dn(int(last))
  3537. #
  3538. # Step 4
  3539. #
  3540. # disable all RA from M1 and M2
  3541. # only M3 can replicate the update
  3542. #
  3543. agreement_m1_m2 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M2.host, consumer_port=M2.port)
  3544. agreement_m1_m3 = M1.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3545. agreement_m2_m1 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M1.host, consumer_port=M1.port)
  3546. agreement_m2_m3 = M2.agreement.list(suffix=DEFAULT_SUFFIX, consumer_host=M3.host, consumer_port=M3.port)
  3547. M1.agreement.pause(agreement_m1_m2[0].dn)
  3548. M1.agreement.pause(agreement_m1_m3[0].dn)
  3549. M2.agreement.pause(agreement_m2_m1[0].dn)
  3550. M2.agreement.pause(agreement_m2_m3[0].dn)
  3551. # Step 5
  3552. # Oldest update
  3553. # check that the entry on M1 contains employeeNumber=<value_end>
  3554. description["S1"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S1_MODRDN"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3555. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S1_MODRDN"])
  3556. assert len(ents) == 1
  3557. time.sleep(1)
  3558. # Step 6
  3559. # More recent update
  3560. # check that the entry on M2 contains employeeNumber=<value_end>
  3561. description["S2"].rename_s(test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_1"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3562. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_1"])
  3563. assert len(ents) == 1
  3564. time.sleep(1)
  3565. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S1_MODRDN"])
  3566. description["S1"].modify_s(new_test_user_dn, description["S1_MOD"])
  3567. ents = description["S1"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % value_S1)
  3568. assert len(ents) == 1
  3569. time.sleep(1)
  3570. (no, new_test_user_dn) = _employeenumber_user_get_dn(description["S2_MODRDN_1"])
  3571. description["S2"].rename_s(new_test_user_dn, 'employeeNumber=%s' % description["S2_MODRDN_2"], newsuperior=BASE_DISTINGUISHED, delold=1)
  3572. ents = description["S2"].search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["S2_MODRDN_2"])
  3573. assert len(ents) == 1
  3574. time.sleep(1)
  3575. _resume_ra_M1_then_M2(M1, M2, M3)
  3576. #time.sleep(3600)
  3577. # Step 9
  3578. # Check that M1 still contains employeeNumber=<value_end>
  3579. ents = M1.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3580. log.info('Search M1 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3581. assert len(ents) == 1
  3582. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3583. # Check that M2 still contains employeeNumber=<value_end>
  3584. ents = M2.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3585. log.info('Search M2 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3586. assert len(ents) == 1
  3587. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3588. # Check that M3 still contain employeeNumber and it contains employeeNumber=<value_end>
  3589. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=*)')
  3590. assert len(ents) == MAX_EMPLOYEENUMBER_USER
  3591. ents = M3.search_s(BASE_DISTINGUISHED, ldap.SCOPE_SUBTREE, '(employeeNumber=%s)' % description["expected"])
  3592. log.info('Search M3 employeeNumber=%s (vs. %s)' % (ents[0].getValue('employeeNumber'), description["expected"]))
  3593. assert len(ents) == 1
  3594. assert ents[0].hasAttr('employeeNumber') and ents[0].getValue('employeeNumber') == description["expected"].encode()
  3595. if __name__ == '__main__':
  3596. # Run isolated
  3597. # -s for DEBUG mode
  3598. CURRENT_FILE = os.path.realpath(__file__)
  3599. pytest.main(["-s", CURRENT_FILE])