cleanallruv_test.py 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494
  1. # --- BEGIN COPYRIGHT BLOCK ---
  2. # Copyright (C) 2015 Red Hat, Inc.
  3. # All rights reserved.
  4. #
  5. # License: GPL (version 3 or any later version).
  6. # See LICENSE for details.
  7. # --- END COPYRIGHT BLOCK ---
  8. #
  9. import os
  10. import sys
  11. import time
  12. import ldap
  13. import logging
  14. import pytest
  15. import threading
  16. from lib389 import DirSrv, Entry, tools, tasks
  17. from lib389.tools import DirSrvTools
  18. from lib389._constants import *
  19. from lib389.properties import *
  20. from lib389.tasks import *
  21. from lib389.utils import *
  22. logging.getLogger(__name__).setLevel(logging.DEBUG)
  23. log = logging.getLogger(__name__)
  24. installation1_prefix = None
  25. class AddUsers(threading.Thread):
  26. def __init__(self, inst, num_users):
  27. threading.Thread.__init__(self)
  28. self.daemon = True
  29. self.inst = inst
  30. self.num_users = num_users
  31. def openConnection(self, inst):
  32. # Open a new connection to our LDAP server
  33. server = DirSrv(verbose=False)
  34. args_instance[SER_HOST] = inst.host
  35. args_instance[SER_PORT] = inst.port
  36. args_instance[SER_SERVERID_PROP] = inst.serverid
  37. args_standalone = args_instance.copy()
  38. server.allocate(args_standalone)
  39. server.open()
  40. return server
  41. def run(self):
  42. # Start adding users
  43. conn = self.openConnection(self.inst)
  44. idx = 0
  45. while idx < self.num_users:
  46. USER_DN = 'uid=' + self.inst.serverid + '_' + str(idx) + ',' + DEFAULT_SUFFIX
  47. try:
  48. conn.add_s(Entry((USER_DN, {'objectclass': 'top extensibleObject'.split(),
  49. 'uid': 'user' + str(idx)})))
  50. except ldap.UNWILLING_TO_PERFORM:
  51. # One of the masters was probably put into read only mode - just break out
  52. break
  53. except ldap.LDAPError as e:
  54. log.error('AddUsers: failed to add (' + USER_DN + ') error: ' + e.message['desc'])
  55. assert False
  56. idx += 1
  57. conn.close()
  58. class TopologyReplication(object):
  59. def __init__(self, master1, master2, master3, master4, m1_m2_agmt, m1_m3_agmt, m1_m4_agmt):
  60. master1.open()
  61. self.master1 = master1
  62. master2.open()
  63. self.master2 = master2
  64. master3.open()
  65. self.master3 = master3
  66. master4.open()
  67. self.master4 = master4
  68. # Store the agreement dn's for future initializations
  69. self.m1_m2_agmt = m1_m2_agmt
  70. self.m1_m3_agmt = m1_m3_agmt
  71. self.m1_m4_agmt = m1_m4_agmt
  72. @pytest.fixture(scope="module")
  73. def topology(request):
  74. global installation1_prefix
  75. if installation1_prefix:
  76. args_instance[SER_DEPLOYED_DIR] = installation1_prefix
  77. # Creating master 1...
  78. master1 = DirSrv(verbose=False)
  79. args_instance[SER_HOST] = HOST_MASTER_1
  80. args_instance[SER_PORT] = PORT_MASTER_1
  81. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_1
  82. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  83. args_master = args_instance.copy()
  84. master1.allocate(args_master)
  85. instance_master1 = master1.exists()
  86. if instance_master1:
  87. master1.delete()
  88. master1.create()
  89. master1.open()
  90. master1.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_1)
  91. master1.log = log
  92. # Creating master 2...
  93. master2 = DirSrv(verbose=False)
  94. args_instance[SER_HOST] = HOST_MASTER_2
  95. args_instance[SER_PORT] = PORT_MASTER_2
  96. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_2
  97. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  98. args_master = args_instance.copy()
  99. master2.allocate(args_master)
  100. instance_master2 = master2.exists()
  101. if instance_master2:
  102. master2.delete()
  103. master2.create()
  104. master2.open()
  105. master2.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_2)
  106. # Creating master 3...
  107. master3 = DirSrv(verbose=False)
  108. args_instance[SER_HOST] = HOST_MASTER_3
  109. args_instance[SER_PORT] = PORT_MASTER_3
  110. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_3
  111. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  112. args_master = args_instance.copy()
  113. master3.allocate(args_master)
  114. instance_master3 = master3.exists()
  115. if instance_master3:
  116. master3.delete()
  117. master3.create()
  118. master3.open()
  119. master3.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_3)
  120. # Creating master 4...
  121. master4 = DirSrv(verbose=False)
  122. args_instance[SER_HOST] = HOST_MASTER_4
  123. args_instance[SER_PORT] = PORT_MASTER_4
  124. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_4
  125. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  126. args_master = args_instance.copy()
  127. master4.allocate(args_master)
  128. instance_master4 = master4.exists()
  129. if instance_master4:
  130. master4.delete()
  131. master4.create()
  132. master4.open()
  133. master4.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_4)
  134. #
  135. # Create all the agreements
  136. #
  137. # Creating agreement from master 1 to master 2
  138. properties = {RA_NAME: r'meTo_$host:$port',
  139. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  140. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  141. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  142. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  143. m1_m2_agmt = master1.agreement.create(suffix=SUFFIX, host=master2.host, port=master2.port, properties=properties)
  144. if not m1_m2_agmt:
  145. log.fatal("Fail to create a master -> master replica agreement")
  146. sys.exit(1)
  147. log.debug("%s created" % m1_m2_agmt)
  148. # Creating agreement from master 1 to master 3
  149. properties = {RA_NAME: r'meTo_$host:$port',
  150. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  151. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  152. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  153. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  154. m1_m3_agmt = master1.agreement.create(suffix=SUFFIX, host=master3.host, port=master3.port, properties=properties)
  155. if not m1_m3_agmt:
  156. log.fatal("Fail to create a master -> master replica agreement")
  157. sys.exit(1)
  158. log.debug("%s created" % m1_m3_agmt)
  159. # Creating agreement from master 1 to master 4
  160. properties = {RA_NAME: r'meTo_$host:$port',
  161. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  162. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  163. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  164. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  165. m1_m4_agmt = master1.agreement.create(suffix=SUFFIX, host=master4.host, port=master4.port, properties=properties)
  166. if not m1_m4_agmt:
  167. log.fatal("Fail to create a master -> master replica agreement")
  168. sys.exit(1)
  169. log.debug("%s created" % m1_m4_agmt)
  170. # Creating agreement from master 2 to master 1
  171. properties = {RA_NAME: r'meTo_$host:$port',
  172. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  173. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  174. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  175. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  176. m2_m1_agmt = master2.agreement.create(suffix=SUFFIX, host=master1.host, port=master1.port, properties=properties)
  177. if not m2_m1_agmt:
  178. log.fatal("Fail to create a master -> master replica agreement")
  179. sys.exit(1)
  180. log.debug("%s created" % m2_m1_agmt)
  181. # Creating agreement from master 2 to master 3
  182. properties = {RA_NAME: r'meTo_$host:$port',
  183. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  184. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  185. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  186. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  187. m2_m3_agmt = master2.agreement.create(suffix=SUFFIX, host=master3.host, port=master3.port, properties=properties)
  188. if not m2_m3_agmt:
  189. log.fatal("Fail to create a master -> master replica agreement")
  190. sys.exit(1)
  191. log.debug("%s created" % m2_m3_agmt)
  192. # Creating agreement from master 2 to master 4
  193. properties = {RA_NAME: r'meTo_$host:$port',
  194. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  195. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  196. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  197. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  198. m2_m4_agmt = master2.agreement.create(suffix=SUFFIX, host=master4.host, port=master4.port, properties=properties)
  199. if not m2_m4_agmt:
  200. log.fatal("Fail to create a master -> master replica agreement")
  201. sys.exit(1)
  202. log.debug("%s created" % m2_m4_agmt)
  203. # Creating agreement from master 3 to master 1
  204. properties = {RA_NAME: r'meTo_$host:$port',
  205. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  206. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  207. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  208. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  209. m3_m1_agmt = master3.agreement.create(suffix=SUFFIX, host=master1.host, port=master1.port, properties=properties)
  210. if not m3_m1_agmt:
  211. log.fatal("Fail to create a master -> master replica agreement")
  212. sys.exit(1)
  213. log.debug("%s created" % m3_m1_agmt)
  214. # Creating agreement from master 3 to master 2
  215. properties = {RA_NAME: r'meTo_$host:$port',
  216. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  217. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  218. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  219. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  220. m3_m2_agmt = master3.agreement.create(suffix=SUFFIX, host=master2.host, port=master2.port, properties=properties)
  221. if not m3_m2_agmt:
  222. log.fatal("Fail to create a master -> master replica agreement")
  223. sys.exit(1)
  224. log.debug("%s created" % m3_m2_agmt)
  225. # Creating agreement from master 3 to master 4
  226. properties = {RA_NAME: r'meTo_$host:$port',
  227. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  228. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  229. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  230. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  231. m3_m4_agmt = master3.agreement.create(suffix=SUFFIX, host=master4.host, port=master4.port, properties=properties)
  232. if not m3_m4_agmt:
  233. log.fatal("Fail to create a master -> master replica agreement")
  234. sys.exit(1)
  235. log.debug("%s created" % m3_m4_agmt)
  236. # Creating agreement from master 4 to master 1
  237. properties = {RA_NAME: r'meTo_$host:$port',
  238. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  239. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  240. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  241. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  242. m4_m1_agmt = master4.agreement.create(suffix=SUFFIX, host=master1.host, port=master1.port, properties=properties)
  243. if not m4_m1_agmt:
  244. log.fatal("Fail to create a master -> master replica agreement")
  245. sys.exit(1)
  246. log.debug("%s created" % m4_m1_agmt)
  247. # Creating agreement from master 4 to master 2
  248. properties = {RA_NAME: r'meTo_$host:$port',
  249. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  250. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  251. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  252. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  253. m4_m2_agmt = master4.agreement.create(suffix=SUFFIX, host=master2.host, port=master2.port, properties=properties)
  254. if not m4_m2_agmt:
  255. log.fatal("Fail to create a master -> master replica agreement")
  256. sys.exit(1)
  257. log.debug("%s created" % m4_m2_agmt)
  258. # Creating agreement from master 4 to master 3
  259. properties = {RA_NAME: r'meTo_$host:$port',
  260. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  261. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  262. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  263. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  264. m4_m3_agmt = master4.agreement.create(suffix=SUFFIX, host=master3.host, port=master3.port, properties=properties)
  265. if not m4_m3_agmt:
  266. log.fatal("Fail to create a master -> master replica agreement")
  267. sys.exit(1)
  268. log.debug("%s created" % m4_m3_agmt)
  269. # Allow the replicas to get situated with the new agreements
  270. time.sleep(5)
  271. #
  272. # Initialize all the agreements
  273. #
  274. master1.agreement.init(SUFFIX, HOST_MASTER_2, PORT_MASTER_2)
  275. master1.waitForReplInit(m1_m2_agmt)
  276. master1.agreement.init(SUFFIX, HOST_MASTER_3, PORT_MASTER_3)
  277. master1.waitForReplInit(m1_m3_agmt)
  278. master1.agreement.init(SUFFIX, HOST_MASTER_4, PORT_MASTER_4)
  279. master1.waitForReplInit(m1_m4_agmt)
  280. # Check replication is working...
  281. if master1.testReplication(DEFAULT_SUFFIX, master2):
  282. log.info('Replication is working.')
  283. else:
  284. log.fatal('Replication is not working.')
  285. assert False
  286. # Clear out the tmp dir
  287. master1.clearTmpDir(__file__)
  288. return TopologyReplication(master1, master2, master3, master4, m1_m2_agmt, m1_m3_agmt, m1_m4_agmt)
  289. def restore_master4(topology):
  290. '''
  291. In our tests will always be removing master 4, so we need a common
  292. way to restore it for another test
  293. '''
  294. log.info('Restoring master 4...')
  295. # Enable replication on master 4
  296. topology.master4.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_4)
  297. #
  298. # Create agreements from master 4 -> m1, m2 ,m3
  299. #
  300. # Creating agreement from master 4 to master 1
  301. properties = {RA_NAME: r'meTo_$host:$port',
  302. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  303. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  304. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  305. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  306. m4_m1_agmt = topology.master4.agreement.create(suffix=SUFFIX, host=topology.master1.host,
  307. port=topology.master1.port, properties=properties)
  308. if not m4_m1_agmt:
  309. log.fatal("Fail to create a master -> master replica agreement")
  310. sys.exit(1)
  311. log.debug("%s created" % m4_m1_agmt)
  312. # Creating agreement from master 4 to master 2
  313. properties = {RA_NAME: r'meTo_$host:$port',
  314. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  315. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  316. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  317. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  318. m4_m2_agmt = topology.master4.agreement.create(suffix=SUFFIX, host=topology.master2.host,
  319. port=topology.master2.port, properties=properties)
  320. if not m4_m2_agmt:
  321. log.fatal("Fail to create a master -> master replica agreement")
  322. sys.exit(1)
  323. log.debug("%s created" % m4_m2_agmt)
  324. # Creating agreement from master 4 to master 3
  325. properties = {RA_NAME: r'meTo_$host:$port',
  326. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  327. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  328. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  329. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  330. m4_m3_agmt = topology.master4.agreement.create(suffix=SUFFIX, host=topology.master3.host,
  331. port=topology.master3.port, properties=properties)
  332. if not m4_m3_agmt:
  333. log.fatal("Fail to create a master -> master replica agreement")
  334. sys.exit(1)
  335. log.debug("%s created" % m4_m3_agmt)
  336. #
  337. # Create agreements from m1, m2, m3 to master 4
  338. #
  339. # Creating agreement from master 1 to master 4
  340. properties = {RA_NAME: r'meTo_$host:$port',
  341. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  342. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  343. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  344. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  345. m1_m4_agmt = topology.master1.agreement.create(suffix=SUFFIX, host=topology.master4.host,
  346. port=topology.master4.port, properties=properties)
  347. if not m1_m4_agmt:
  348. log.fatal("Fail to create a master -> master replica agreement")
  349. sys.exit(1)
  350. log.debug("%s created" % m1_m4_agmt)
  351. # Creating agreement from master 2 to master 4
  352. properties = {RA_NAME: r'meTo_$host:$port',
  353. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  354. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  355. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  356. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  357. m2_m4_agmt = topology.master2.agreement.create(suffix=SUFFIX, host=topology.master4.host,
  358. port=topology.master4.port, properties=properties)
  359. if not m2_m4_agmt:
  360. log.fatal("Fail to create a master -> master replica agreement")
  361. sys.exit(1)
  362. log.debug("%s created" % m2_m4_agmt)
  363. # Creating agreement from master 3 to master 4
  364. properties = {RA_NAME: r'meTo_$host:$port',
  365. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  366. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  367. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  368. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  369. m3_m4_agmt = topology.master3.agreement.create(suffix=SUFFIX, host=topology.master4.host,
  370. port=topology.master4.port, properties=properties)
  371. if not m3_m4_agmt:
  372. log.fatal("Fail to create a master -> master replica agreement")
  373. sys.exit(1)
  374. log.debug("%s created" % m3_m4_agmt)
  375. #
  376. # Restart the other servers - this allows the rid(for master4) to be used again/valid
  377. #
  378. topology.master1.restart(timeout=30)
  379. topology.master2.restart(timeout=30)
  380. topology.master3.restart(timeout=30)
  381. topology.master4.restart(timeout=30)
  382. #
  383. # Initialize the agreements
  384. #
  385. topology.master1.agreement.init(SUFFIX, HOST_MASTER_2, PORT_MASTER_2)
  386. topology.master1.waitForReplInit(topology.m1_m2_agmt)
  387. topology.master1.agreement.init(SUFFIX, HOST_MASTER_3, PORT_MASTER_3)
  388. topology.master1.waitForReplInit(topology.m1_m3_agmt)
  389. topology.master1.agreement.init(SUFFIX, HOST_MASTER_4, PORT_MASTER_4)
  390. topology.master1.waitForReplInit(topology.m1_m4_agmt)
  391. #
  392. # Test Replication is working
  393. #
  394. # Check replication is working with previous working master(m1 -> m2)
  395. if topology.master1.testReplication(DEFAULT_SUFFIX, topology.master2):
  396. log.info('Replication is working m1 -> m2.')
  397. else:
  398. log.fatal('restore_master4: Replication is not working from m1 -> m2.')
  399. assert False
  400. # Check replication is working from master 1 to master 4...
  401. if topology.master1.testReplication(DEFAULT_SUFFIX, topology.master4):
  402. log.info('Replication is working m1 -> m4.')
  403. else:
  404. log.fatal('restore_master4: Replication is not working from m1 -> m4.')
  405. assert False
  406. # Check replication is working from master 4 to master1...
  407. if topology.master4.testReplication(DEFAULT_SUFFIX, topology.master1):
  408. log.info('Replication is working m4 -> m1.')
  409. else:
  410. log.fatal('restore_master4: Replication is not working from m4 -> 1.')
  411. assert False
  412. log.info('Master 4 has been successfully restored.')
  413. def test_cleanallruv_init(topology):
  414. '''
  415. Make updates on each master to make sure we have the all master RUVs on
  416. each master.
  417. '''
  418. log.info('Initializing cleanAllRUV test suite...')
  419. # Master 1
  420. if not topology.master1.testReplication(DEFAULT_SUFFIX, topology.master2):
  421. log.fatal('test_cleanallruv_init: Replication is not working between master 1 and master 2.')
  422. assert False
  423. if not topology.master1.testReplication(DEFAULT_SUFFIX, topology.master3):
  424. log.fatal('test_cleanallruv_init: Replication is not working between master 1 and master 3.')
  425. assert False
  426. if not topology.master1.testReplication(DEFAULT_SUFFIX, topology.master4):
  427. log.fatal('test_cleanallruv_init: Replication is not working between master 1 and master 4.')
  428. assert False
  429. # Master 2
  430. if not topology.master2.testReplication(DEFAULT_SUFFIX, topology.master1):
  431. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 1.')
  432. assert False
  433. if not topology.master2.testReplication(DEFAULT_SUFFIX, topology.master3):
  434. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 3.')
  435. assert False
  436. if not topology.master2.testReplication(DEFAULT_SUFFIX, topology.master4):
  437. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 4.')
  438. assert False
  439. # Master 3
  440. if not topology.master3.testReplication(DEFAULT_SUFFIX, topology.master1):
  441. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 1.')
  442. assert False
  443. if not topology.master3.testReplication(DEFAULT_SUFFIX, topology.master2):
  444. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 2.')
  445. assert False
  446. if not topology.master3.testReplication(DEFAULT_SUFFIX, topology.master4):
  447. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 4.')
  448. assert False
  449. # Master 4
  450. if not topology.master4.testReplication(DEFAULT_SUFFIX, topology.master1):
  451. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 1.')
  452. assert False
  453. if not topology.master4.testReplication(DEFAULT_SUFFIX, topology.master2):
  454. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 2.')
  455. assert False
  456. if not topology.master4.testReplication(DEFAULT_SUFFIX, topology.master3):
  457. log.fatal('test_cleanallruv_init: Replication is not working between master 2 and master 3.')
  458. assert False
  459. log.info('Initialized cleanAllRUV test suite.')
  460. def test_cleanallruv_clean(topology):
  461. '''
  462. Disable a master, remove agreements to that master, and clean the RUVs on
  463. the remaining replicas
  464. '''
  465. log.info('Running test_cleanallruv_clean...')
  466. # Disable master 4
  467. log.info('test_cleanallruv_clean: disable master 4...')
  468. try:
  469. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  470. except:
  471. log.fatal('error!')
  472. assert False
  473. # Remove the agreements from the other masters that point to master 4
  474. log.info('test_cleanallruv_clean: remove all the agreements to master 4...')
  475. try:
  476. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  477. except ldap.LDAPError as e:
  478. log.fatal('test_cleanallruv_clean: Failed to delete agmt(m1 -> m4), error: ' +
  479. e.message['desc'])
  480. assert False
  481. try:
  482. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  483. except ldap.LDAPError as e:
  484. log.fatal('test_cleanallruv_clean: Failed to delete agmt(m2 -> m4), error: ' +
  485. e.message['desc'])
  486. assert False
  487. try:
  488. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  489. except ldap.LDAPError as e:
  490. log.fatal('test_cleanallruv_clean: Failed to delete agmt(m3 -> m4), error: ' +
  491. e.message['desc'])
  492. assert False
  493. # Run the task
  494. log.info('test_cleanallruv_clean: run the cleanAllRUV task...')
  495. try:
  496. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  497. args={TASK_WAIT: True})
  498. except ValueError as e:
  499. log.fatal('test_cleanallruv_clean: Problem running cleanAllRuv task: ' +
  500. e.message('desc'))
  501. assert False
  502. # Check the other master's RUV for 'replica 4'
  503. log.info('test_cleanallruv_clean: check all the masters have been cleaned...')
  504. clean = False
  505. count = 0
  506. while not clean and count < 5:
  507. clean = True
  508. # Check master 1
  509. try:
  510. entry = topology.master1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  511. if not entry:
  512. log.error('test_cleanallruv_clean: Failed to find db tombstone entry from master')
  513. repl_fail(replica_inst)
  514. elements = entry[0].getValues('nsds50ruv')
  515. for ruv in elements:
  516. if 'replica 4' in ruv:
  517. # Not cleaned
  518. log.error('test_cleanallruv_clean: Master 1 not cleaned!')
  519. clean = False
  520. if clean:
  521. log.info('test_cleanallruv_clean: Master 1 is cleaned.')
  522. except ldap.LDAPError as e:
  523. log.fatal('test_cleanallruv_clean: Unable to search master 1 for db tombstone: ' + e.message['desc'])
  524. # Check master 2
  525. try:
  526. entry = topology.master2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  527. if not entry:
  528. log.error('test_cleanallruv_clean: Failed to find db tombstone entry from master')
  529. repl_fail(replica_inst)
  530. elements = entry[0].getValues('nsds50ruv')
  531. for ruv in elements:
  532. if 'replica 4' in ruv:
  533. # Not cleaned
  534. log.error('test_cleanallruv_clean: Master 2 not cleaned!')
  535. clean = False
  536. if clean:
  537. log.info('test_cleanallruv_clean: Master 2 is cleaned.')
  538. except ldap.LDAPError as e:
  539. log.fatal('Unable to search master 2 for db tombstone: ' + e.message['desc'])
  540. # Check master 3
  541. try:
  542. entry = topology.master3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  543. if not entry:
  544. log.error('test_cleanallruv_clean: Failed to find db tombstone entry from master')
  545. repl_fail(replica_inst)
  546. elements = entry[0].getValues('nsds50ruv')
  547. for ruv in elements:
  548. if 'replica 4' in ruv:
  549. # Not cleaned
  550. log.error('test_cleanallruv_clean: Master 3 not cleaned!')
  551. clean = False
  552. if clean:
  553. log.info('test_cleanallruv_clean: Master 3 is cleaned.')
  554. except ldap.LDAPError as e:
  555. log.fatal('test_cleanallruv_clean: Unable to search master 3 for db tombstone: ' + e.message['desc'])
  556. # Sleep a bit and give it chance to clean up...
  557. time.sleep(5)
  558. count += 1
  559. if not clean:
  560. log.fatal('test_cleanallruv_clean: Failed to clean replicas')
  561. assert False
  562. log.info('Allow cleanallruv threads to finish...')
  563. time.sleep(30)
  564. log.info('test_cleanallruv_clean PASSED, restoring master 4...')
  565. #
  566. # Cleanup - restore master 4
  567. #
  568. restore_master4(topology)
  569. def test_cleanallruv_clean_restart(topology):
  570. '''
  571. Test that if a master istopped during the clean process, that it
  572. resumes and finishes when its started.
  573. '''
  574. log.info('Running test_cleanallruv_clean_restart...')
  575. # Disable master 4
  576. log.info('test_cleanallruv_clean_restart: disable master 4...')
  577. try:
  578. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  579. except:
  580. log.fatal('error!')
  581. assert False
  582. # Remove the agreements from the other masters that point to master 4
  583. log.info('test_cleanallruv_clean: remove all the agreements to master 4...')
  584. try:
  585. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  586. except ldap.LDAPError as e:
  587. log.fatal('test_cleanallruv_clean_restart: Failed to delete agmt(m1 -> m4), error: ' +
  588. e.message['desc'])
  589. assert False
  590. try:
  591. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  592. except ldap.LDAPError as e:
  593. log.fatal('test_cleanallruv_clean_restart: Failed to delete agmt(m2 -> m4), error: ' +
  594. e.message['desc'])
  595. assert False
  596. try:
  597. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  598. except ldap.LDAPError as e:
  599. log.fatal('test_cleanallruv_clean_restart: Failed to delete agmt(m3 -> m4), error: ' +
  600. e.message['desc'])
  601. assert False
  602. # Stop master 3 to keep the task running, so we can stop master 1...
  603. topology.master3.stop(timeout=30)
  604. # Run the task
  605. log.info('test_cleanallruv_clean_restart: run the cleanAllRUV task...')
  606. try:
  607. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  608. args={TASK_WAIT: False})
  609. except ValueError as e:
  610. log.fatal('test_cleanallruv_clean_restart: Problem running cleanAllRuv task: ' +
  611. e.message('desc'))
  612. assert False
  613. # Sleep a bit, then stop master 1
  614. time.sleep(3)
  615. topology.master1.stop(timeout=30)
  616. # Now start master 3 & 1, and make sure we didn't crash
  617. topology.master3.start(timeout=30)
  618. if topology.master3.detectDisorderlyShutdown():
  619. log.fatal('test_cleanallruv_clean_restart: Master 3 previously crashed!')
  620. assert False
  621. topology.master1.start(timeout=30)
  622. if topology.master1.detectDisorderlyShutdown():
  623. log.fatal('test_cleanallruv_clean_restart: Master 1 previously crashed!')
  624. assert False
  625. # Wait a little for agmts/cleanallruv to wake up
  626. time.sleep(5)
  627. # Check the other master's RUV for 'replica 4'
  628. log.info('test_cleanallruv_clean_restart: check all the masters have been cleaned...')
  629. clean = False
  630. count = 0
  631. while not clean and count < 10:
  632. clean = True
  633. # Check master 1
  634. try:
  635. entry = topology.master1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  636. if not entry:
  637. log.error('test_cleanallruv_clean_restart: Failed to find db tombstone entry from master')
  638. repl_fail(replica_inst)
  639. elements = entry[0].getValues('nsds50ruv')
  640. for ruv in elements:
  641. if 'replica 4' in ruv:
  642. # Not cleaned
  643. log.error('test_cleanallruv_clean_restart: Master 1 not cleaned!')
  644. clean = False
  645. if clean:
  646. log.info('test_cleanallruv_clean_restart: Master 1 is cleaned.')
  647. except ldap.LDAPError as e:
  648. log.fatal('test_cleanallruv_clean_restart: Unable to search master 1 for db tombstone: ' +
  649. e.message['desc'])
  650. # Check master 2
  651. try:
  652. entry = topology.master2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  653. if not entry:
  654. log.error('test_cleanallruv_clean_restart: Failed to find db tombstone entry from master')
  655. repl_fail(replica_inst)
  656. elements = entry[0].getValues('nsds50ruv')
  657. for ruv in elements:
  658. if 'replica 4' in ruv:
  659. # Not cleaned
  660. log.error('test_cleanallruv_clean_restart: Master 2 not cleaned!')
  661. clean = False
  662. if clean:
  663. log.info('test_cleanallruv_clean_restart: Master 2 is cleaned.')
  664. except ldap.LDAPError as e:
  665. log.fatal('test_cleanallruv_clean_restart: Unable to search master 2 for db tombstone: ' +
  666. e.message['desc'])
  667. # Check master 3
  668. try:
  669. entry = topology.master3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  670. if not entry:
  671. log.error('test_cleanallruv_clean_restart: Failed to find db tombstone entry from master')
  672. repl_fail(replica_inst)
  673. elements = entry[0].getValues('nsds50ruv')
  674. for ruv in elements:
  675. if 'replica 4' in ruv:
  676. # Not cleaned
  677. log.error('test_cleanallruv_clean_restart: Master 3 not cleaned!')
  678. clean = False
  679. if clean:
  680. log.info('test_cleanallruv_clean_restart: Master 3 is cleaned.')
  681. except ldap.LDAPError as e:
  682. log.fatal('test_cleanallruv_clean_restart: Unable to search master 3 for db tombstone: ' +
  683. e.message['desc'])
  684. # Sleep a bit and give it chance to clean up...
  685. time.sleep(5)
  686. count += 1
  687. if not clean:
  688. log.fatal('Failed to clean replicas')
  689. assert False
  690. log.info('Allow cleanallruv threads to finish...')
  691. time.sleep(30)
  692. log.info('test_cleanallruv_clean_restart PASSED, restoring master 4...')
  693. #
  694. # Cleanup - restore master 4
  695. #
  696. restore_master4(topology)
  697. def test_cleanallruv_clean_force(topology):
  698. '''
  699. Disable a master, remove agreements to that master, and clean the RUVs on
  700. the remaining replicas
  701. '''
  702. log.info('Running test_cleanallruv_clean_force...')
  703. # Stop master 3, while we update master 4, so that 3 is behind the other masters
  704. topology.master3.stop(timeout=10)
  705. # Add a bunch of updates to master 4
  706. m4_add_users = AddUsers(topology.master4, 1500)
  707. m4_add_users.start()
  708. m4_add_users.join()
  709. # Disable master 4
  710. log.info('test_cleanallruv_clean_force: disable master 4...')
  711. try:
  712. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  713. except:
  714. log.fatal('error!')
  715. assert False
  716. # Start master 3, it should be out of sync with the other replicas...
  717. topology.master3.start(timeout=10)
  718. # Remove the agreements from the other masters that point to master 4
  719. log.info('test_cleanallruv_clean_force: remove all the agreements to master 4...')
  720. try:
  721. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  722. except ldap.LDAPError as e:
  723. log.fatal('test_cleanallruv_clean_force: Failed to delete agmt(m1 -> m4), error: ' +
  724. e.message['desc'])
  725. assert False
  726. try:
  727. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  728. except ldap.LDAPError as e:
  729. log.fatal('test_cleanallruv_clean_force: Failed to delete agmt(m2 -> m4), error: ' +
  730. e.message['desc'])
  731. assert False
  732. try:
  733. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  734. except ldap.LDAPError as e:
  735. log.fatal('test_cleanallruv_clean_force: Failed to delete agmt(m3 -> m4), error: ' +
  736. e.message['desc'])
  737. assert False
  738. # Run the task, use "force" because master 3 is not in sync with the other replicas
  739. # in regards to the replica 4 RUV
  740. log.info('test_cleanallruv_clean_force: run the cleanAllRUV task...')
  741. try:
  742. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  743. force=True, args={TASK_WAIT: True})
  744. except ValueError as e:
  745. log.fatal('test_cleanallruv_clean_force: Problem running cleanAllRuv task: ' +
  746. e.message('desc'))
  747. assert False
  748. # Check the other master's RUV for 'replica 4'
  749. log.info('test_cleanallruv_clean_force: check all the masters have been cleaned...')
  750. clean = False
  751. count = 0
  752. while not clean and count < 5:
  753. clean = True
  754. # Check master 1
  755. try:
  756. entry = topology.master1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  757. if not entry:
  758. log.error('test_cleanallruv_clean_force: Failed to find db tombstone entry from master')
  759. repl_fail(replica_inst)
  760. elements = entry[0].getValues('nsds50ruv')
  761. for ruv in elements:
  762. if 'replica 4' in ruv:
  763. # Not cleaned
  764. log.error('test_cleanallruv_clean_force: Master 1 not cleaned!')
  765. clean = False
  766. if clean:
  767. log.info('test_cleanallruv_clean_force: Master 1 is cleaned.')
  768. except ldap.LDAPError as e:
  769. log.fatal('test_cleanallruv_clean_force: Unable to search master 1 for db tombstone: ' +
  770. e.message['desc'])
  771. # Check master 2
  772. try:
  773. entry = topology.master2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  774. if not entry:
  775. log.error('test_cleanallruv_clean_force: Failed to find db tombstone entry from master')
  776. repl_fail(replica_inst)
  777. elements = entry[0].getValues('nsds50ruv')
  778. for ruv in elements:
  779. if 'replica 4' in ruv:
  780. # Not cleaned
  781. log.error('test_cleanallruv_clean_force: Master 1 not cleaned!')
  782. clean = False
  783. if clean:
  784. log.info('Master 2 is cleaned.')
  785. except ldap.LDAPError as e:
  786. log.fatal('test_cleanallruv_clean_force: Unable to search master 2 for db tombstone: ' +
  787. e.message['desc'])
  788. # Check master 3
  789. try:
  790. entry = topology.master3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  791. if not entry:
  792. log.error('test_cleanallruv_clean_force: Failed to find db tombstone entry from master')
  793. repl_fail(replica_inst)
  794. elements = entry[0].getValues('nsds50ruv')
  795. for ruv in elements:
  796. if 'replica 4' in ruv:
  797. # Not cleaned
  798. log.error('test_cleanallruv_clean_force: Master 3 not cleaned!')
  799. clean = False
  800. if clean:
  801. log.info('test_cleanallruv_clean_force: Master 3 is cleaned.')
  802. except ldap.LDAPError as e:
  803. log.fatal('test_cleanallruv_clean_force: Unable to search master 3 for db tombstone: ' +
  804. e.message['desc'])
  805. # Sleep a bit and give it chance to clean up...
  806. time.sleep(5)
  807. count += 1
  808. if not clean:
  809. log.fatal('test_cleanallruv_clean_force: Failed to clean replicas')
  810. assert False
  811. log.info('test_cleanallruv_clean_force: Allow cleanallruv threads to finish')
  812. time.sleep(30)
  813. log.info('test_cleanallruv_clean_force PASSED, restoring master 4...')
  814. #
  815. # Cleanup - restore master 4
  816. #
  817. restore_master4(topology)
  818. def test_cleanallruv_abort(topology):
  819. '''
  820. Test the abort task.
  821. DIsable master 4
  822. Stop master 2 so that it can not be cleaned
  823. Run the clean task
  824. Wait a bit
  825. Abort the task
  826. Verify task is aborted
  827. '''
  828. log.info('Running test_cleanallruv_abort...')
  829. # Disable master 4
  830. log.info('test_cleanallruv_abort: disable replication on master 4...')
  831. try:
  832. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  833. except:
  834. log.fatal('test_cleanallruv_abort: failed to disable replication')
  835. assert False
  836. # Remove the agreements from the other masters that point to master 4
  837. log.info('test_cleanallruv_abort: remove all the agreements to master 4...)')
  838. try:
  839. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  840. except ldap.LDAPError as e:
  841. log.fatal('test_cleanallruv_abort: Failed to delete agmt(m1 -> m4), error: ' +
  842. e.message['desc'])
  843. assert False
  844. try:
  845. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  846. except ldap.LDAPError as e:
  847. log.fatal('test_cleanallruv_abort: Failed to delete agmt(m2 -> m4), error: ' +
  848. e.message['desc'])
  849. assert False
  850. try:
  851. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  852. except ldap.LDAPError as e:
  853. log.fatal('test_cleanallruv_abort: Failed to delete agmt(m3 -> m4), error: ' +
  854. e.message['desc'])
  855. assert False
  856. # Stop master 2
  857. log.info('test_cleanallruv_abort: stop master 2 to freeze the cleanAllRUV task...')
  858. topology.master2.stop(timeout=10)
  859. # Run the task
  860. log.info('test_cleanallruv_abort: add the cleanAllRUV task...')
  861. try:
  862. (clean_task_dn, rc) = topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  863. replicaid='4', args={TASK_WAIT: False})
  864. except ValueError as e:
  865. log.fatal('test_cleanallruv_abort: Problem running cleanAllRuv task: ' +
  866. e.message('desc'))
  867. assert False
  868. # Wait a bit
  869. time.sleep(10)
  870. # Abort the task
  871. log.info('test_cleanallruv_abort: abort the cleanAllRUV task...')
  872. try:
  873. topology.master1.tasks.abortCleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  874. args={TASK_WAIT: True})
  875. except ValueError as e:
  876. log.fatal('test_cleanallruv_abort: Problem running abortCleanAllRuv task: ' +
  877. e.message('desc'))
  878. assert False
  879. # Check master 1 does not have the clean task running
  880. log.info('test_cleanallruv_abort: check master 1 no longer has a cleanAllRUV task...')
  881. attrlist = ['nsTaskLog', 'nsTaskStatus', 'nsTaskExitCode',
  882. 'nsTaskCurrentItem', 'nsTaskTotalItems']
  883. done = False
  884. count = 0
  885. while not done and count < 5:
  886. entry = topology.master1.getEntry(clean_task_dn, attrlist=attrlist)
  887. if not entry or entry.nsTaskExitCode:
  888. done = True
  889. break
  890. time.sleep(1)
  891. count += 1
  892. if not done:
  893. log.fatal('test_cleanallruv_abort: CleanAllRUV task was not aborted')
  894. assert False
  895. # Start master 2
  896. log.info('test_cleanallruv_abort: start master 2 to begin the restore process...')
  897. topology.master2.start(timeout=10)
  898. #
  899. # Now run the clean task task again to we can properly restore master 4
  900. #
  901. log.info('test_cleanallruv_abort: run cleanAllRUV task so we can properly restore master 4...')
  902. try:
  903. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  904. replicaid='4', args={TASK_WAIT: True})
  905. except ValueError as e:
  906. log.fatal('test_cleanallruv_abort: Problem running cleanAllRuv task: ' + e.message('desc'))
  907. assert False
  908. log.info('test_cleanallruv_abort PASSED, restoring master 4...')
  909. #
  910. # Cleanup - Restore master 4
  911. #
  912. restore_master4(topology)
  913. def test_cleanallruv_abort_restart(topology):
  914. '''
  915. Test the abort task can handle a restart, and then resume
  916. '''
  917. log.info('Running test_cleanallruv_abort_restart...')
  918. # Disable master 4
  919. log.info('test_cleanallruv_abort_restart: disable replication on master 4...')
  920. try:
  921. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  922. except:
  923. log.fatal('error!')
  924. assert False
  925. # Remove the agreements from the other masters that point to master 4
  926. log.info('test_cleanallruv_abort_restart: remove all the agreements to master 4...)')
  927. try:
  928. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  929. except ldap.LDAPError as e:
  930. log.fatal('test_cleanallruv_abort_restart: Failed to delete agmt(m1 -> m4), error: ' +
  931. e.message['desc'])
  932. assert False
  933. try:
  934. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  935. except ldap.LDAPError as e:
  936. log.fatal('test_cleanallruv_abort_restart: Failed to delete agmt(m2 -> m4), error: ' +
  937. e.message['desc'])
  938. assert False
  939. try:
  940. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  941. except ldap.LDAPError as e:
  942. log.fatal('test_cleanallruv_abort_restart: Failed to delete agmt(m3 -> m4), error: ' +
  943. e.message['desc'])
  944. assert False
  945. # Stop master 3
  946. log.info('test_cleanallruv_abort_restart: stop master 3 to freeze the cleanAllRUV task...')
  947. topology.master3.stop(timeout=10)
  948. # Run the task
  949. log.info('test_cleanallruv_abort_restart: add the cleanAllRUV task...')
  950. try:
  951. (clean_task_dn, rc) = topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  952. replicaid='4', args={TASK_WAIT: False})
  953. except ValueError as e:
  954. log.fatal('test_cleanallruv_abort_restart: Problem running cleanAllRuv task: ' +
  955. e.message('desc'))
  956. assert False
  957. # Wait a bit
  958. time.sleep(5)
  959. # Abort the task
  960. log.info('test_cleanallruv_abort_restart: abort the cleanAllRUV task...')
  961. try:
  962. topology.master1.tasks.abortCleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  963. certify=True, args={TASK_WAIT: False})
  964. except ValueError as e:
  965. log.fatal('test_cleanallruv_abort_restart: Problem running test_cleanallruv_abort_restart task: ' +
  966. e.message('desc'))
  967. assert False
  968. # Allow task to run for a bit:
  969. time.sleep(5)
  970. # Check master 1 does not have the clean task running
  971. log.info('test_cleanallruv_abort: check master 1 no longer has a cleanAllRUV task...')
  972. attrlist = ['nsTaskLog', 'nsTaskStatus', 'nsTaskExitCode',
  973. 'nsTaskCurrentItem', 'nsTaskTotalItems']
  974. done = False
  975. count = 0
  976. while not done and count < 10:
  977. entry = topology.master1.getEntry(clean_task_dn, attrlist=attrlist)
  978. if not entry or entry.nsTaskExitCode:
  979. done = True
  980. break
  981. time.sleep(1)
  982. count += 1
  983. if not done:
  984. log.fatal('test_cleanallruv_abort_restart: CleanAllRUV task was not aborted')
  985. assert False
  986. # Now restart master 1, and make sure the abort process completes
  987. topology.master1.restart(timeout=30)
  988. if topology.master1.detectDisorderlyShutdown():
  989. log.fatal('test_cleanallruv_abort_restart: Master 1 previously crashed!')
  990. assert False
  991. # Start master 3
  992. topology.master3.start(timeout=10)
  993. # Check master 1 tried to run abort task. We expect the abort task to be aborted.
  994. if not topology.master1.searchErrorsLog('Aborting abort task'):
  995. log.fatal('test_cleanallruv_abort_restart: Abort task did not restart')
  996. assert False
  997. #
  998. # Now run the clean task task again to we can properly restore master 4
  999. #
  1000. log.info('test_cleanallruv_abort_restart: run cleanAllRUV task so we can properly restore master 4...')
  1001. try:
  1002. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  1003. replicaid='4', args={TASK_WAIT: True})
  1004. except ValueError as e:
  1005. log.fatal('test_cleanallruv_abort_restart: Problem running cleanAllRuv task: ' +
  1006. e.message('desc'))
  1007. assert False
  1008. log.info('test_cleanallruv_abort_restart PASSED, restoring master 4...')
  1009. #
  1010. # Cleanup - Restore master 4
  1011. #
  1012. restore_master4(topology)
  1013. def test_cleanallruv_abort_certify(topology):
  1014. '''
  1015. Test the abort task.
  1016. Disable master 4
  1017. Stop master 2 so that it can not be cleaned
  1018. Run the clean task
  1019. Wait a bit
  1020. Abort the task
  1021. Verify task is aborted
  1022. '''
  1023. log.info('Running test_cleanallruv_abort_certify...')
  1024. # Disable master 4
  1025. log.info('test_cleanallruv_abort_certify: disable replication on master 4...')
  1026. try:
  1027. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  1028. except:
  1029. log.fatal('error!')
  1030. assert False
  1031. # Remove the agreements from the other masters that point to master 4
  1032. log.info('test_cleanallruv_abort_certify: remove all the agreements to master 4...)')
  1033. try:
  1034. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1035. except ldap.LDAPError as e:
  1036. log.fatal('test_cleanallruv_abort_certify: Failed to delete agmt(m1 -> m4), error: ' +
  1037. e.message['desc'])
  1038. assert False
  1039. try:
  1040. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1041. except ldap.LDAPError as e:
  1042. log.fatal('test_cleanallruv_abort_certify: Failed to delete agmt(m2 -> m4), error: ' +
  1043. e.message['desc'])
  1044. assert False
  1045. try:
  1046. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1047. except ldap.LDAPError as e:
  1048. log.fatal('test_cleanallruv_abort_certify: Failed to delete agmt(m3 -> m4), error: ' +
  1049. e.message['desc'])
  1050. assert False
  1051. # Stop master 2
  1052. log.info('test_cleanallruv_abort_certify: stop master 2 to freeze the cleanAllRUV task...')
  1053. topology.master2.stop(timeout=10)
  1054. # Run the task
  1055. log.info('test_cleanallruv_abort_certify: add the cleanAllRUV task...')
  1056. try:
  1057. (clean_task_dn, rc) = topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  1058. replicaid='4', args={TASK_WAIT: False})
  1059. except ValueError as e:
  1060. log.fatal('test_cleanallruv_abort_certify: Problem running cleanAllRuv task: ' +
  1061. e.message('desc'))
  1062. assert False
  1063. # Abort the task
  1064. log.info('test_cleanallruv_abort_certify: abort the cleanAllRUV task...')
  1065. try:
  1066. (abort_task_dn, rc) = topology.master1.tasks.abortCleanAllRUV(suffix=DEFAULT_SUFFIX,
  1067. replicaid='4', certify=True, args={TASK_WAIT: False})
  1068. except ValueError as e:
  1069. log.fatal('test_cleanallruv_abort_certify: Problem running abortCleanAllRuv task: ' +
  1070. e.message('desc'))
  1071. assert False
  1072. # Wait a while and make sure the abort task is still running
  1073. log.info('test_cleanallruv_abort_certify: sleep for 10 seconds')
  1074. time.sleep(10)
  1075. attrlist = ['nsTaskLog', 'nsTaskStatus', 'nsTaskExitCode',
  1076. 'nsTaskCurrentItem', 'nsTaskTotalItems']
  1077. entry = topology.master1.getEntry(abort_task_dn, attrlist=attrlist)
  1078. if not entry or entry.nsTaskExitCode:
  1079. log.fatal('test_cleanallruv_abort_certify: abort task incorrectly finished')
  1080. assert False
  1081. # Now start master 2 so it can be aborted
  1082. log.info('test_cleanallruv_abort_certify: start master 2 to allow the abort task to finish...')
  1083. topology.master2.start(timeout=10)
  1084. # Wait for the abort task to stop
  1085. done = False
  1086. count = 0
  1087. while not done and count < 60:
  1088. entry = topology.master1.getEntry(abort_task_dn, attrlist=attrlist)
  1089. if not entry or entry.nsTaskExitCode:
  1090. done = True
  1091. break
  1092. time.sleep(1)
  1093. count += 1
  1094. if not done:
  1095. log.fatal('test_cleanallruv_abort_certify: The abort CleanAllRUV task was not aborted')
  1096. assert False
  1097. # Check master 1 does not have the clean task running
  1098. log.info('test_cleanallruv_abort_certify: check master 1 no longer has a cleanAllRUV task...')
  1099. attrlist = ['nsTaskLog', 'nsTaskStatus', 'nsTaskExitCode',
  1100. 'nsTaskCurrentItem', 'nsTaskTotalItems']
  1101. done = False
  1102. count = 0
  1103. while not done and count < 5:
  1104. entry = topology.master1.getEntry(clean_task_dn, attrlist=attrlist)
  1105. if not entry or entry.nsTaskExitCode:
  1106. done = True
  1107. break
  1108. time.sleep(1)
  1109. count += 1
  1110. if not done:
  1111. log.fatal('test_cleanallruv_abort_certify: CleanAllRUV task was not aborted')
  1112. assert False
  1113. # Start master 2
  1114. log.info('test_cleanallruv_abort_certify: start master 2 to begin the restore process...')
  1115. topology.master2.start(timeout=10)
  1116. #
  1117. # Now run the clean task task again to we can properly restore master 4
  1118. #
  1119. log.info('test_cleanallruv_abort_certify: run cleanAllRUV task so we can properly restore master 4...')
  1120. try:
  1121. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX,
  1122. replicaid='4', args={TASK_WAIT: True})
  1123. except ValueError as e:
  1124. log.fatal('test_cleanallruv_abort_certify: Problem running cleanAllRuv task: ' +
  1125. e.message('desc'))
  1126. assert False
  1127. log.info('test_cleanallruv_abort_certify PASSED, restoring master 4...')
  1128. #
  1129. # Cleanup - Restore master 4
  1130. #
  1131. restore_master4(topology)
  1132. def test_cleanallruv_stress_clean(topology):
  1133. '''
  1134. Put each server(m1 - m4) under stress, and perform the entire clean process
  1135. '''
  1136. log.info('Running test_cleanallruv_stress_clean...')
  1137. log.info('test_cleanallruv_stress_clean: put all the masters under load...')
  1138. # Put all the masters under load
  1139. m1_add_users = AddUsers(topology.master1, 4000)
  1140. m1_add_users.start()
  1141. m2_add_users = AddUsers(topology.master2, 4000)
  1142. m2_add_users.start()
  1143. m3_add_users = AddUsers(topology.master3, 4000)
  1144. m3_add_users.start()
  1145. m4_add_users = AddUsers(topology.master4, 4000)
  1146. m4_add_users.start()
  1147. # Allow sometime to get replication flowing in all directions
  1148. log.info('test_cleanallruv_stress_clean: allow some time for replication to get flowing...')
  1149. time.sleep(5)
  1150. # Put master 4 into read only mode
  1151. log.info('test_cleanallruv_stress_clean: put master 4 into read-only mode...')
  1152. try:
  1153. topology.master4.modify_s(DN_CONFIG, [(ldap.MOD_REPLACE, 'nsslapd-readonly', 'on')])
  1154. except ldap.LDAPError as e:
  1155. log.fatal('test_cleanallruv_stress_clean: Failed to put master 4 into read-only mode: error ' +
  1156. e.message['desc'])
  1157. assert False
  1158. # We need to wait for master 4 to push its changes out
  1159. log.info('test_cleanallruv_stress_clean: allow some time for master 4 to push changes out (30 seconds)...')
  1160. time.sleep(30)
  1161. # Disable master 4
  1162. log.info('test_cleanallruv_stress_clean: disable replication on master 4...')
  1163. try:
  1164. topology.master4.replica.disableReplication(DEFAULT_SUFFIX)
  1165. except:
  1166. log.fatal('test_cleanallruv_stress_clean: failed to diable replication')
  1167. assert False
  1168. # Remove the agreements from the other masters that point to master 4
  1169. log.info('test_cleanallruv_stress_clean: remove all the agreements to master 4...')
  1170. try:
  1171. topology.master1.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1172. except ldap.LDAPError as e:
  1173. log.fatal('test_cleanallruv_stress_clean: Failed to delete agmt(m1 -> m4), error: ' +
  1174. e.message['desc'])
  1175. assert False
  1176. try:
  1177. topology.master2.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1178. except ldap.LDAPError as e:
  1179. log.fatal('test_cleanallruv_stress_clean: Failed to delete agmt(m2 -> m4), error: ' +
  1180. e.message['desc'])
  1181. assert False
  1182. try:
  1183. topology.master3.agreement.delete(DEFAULT_SUFFIX, topology.master4)
  1184. except ldap.LDAPError as e:
  1185. log.fatal('test_cleanallruv_stress_clean: Failed to delete agmt(m3 -> m4), error: ' +
  1186. e.message['desc'])
  1187. assert False
  1188. # Run the task
  1189. log.info('test_cleanallruv_stress_clean: Run the cleanAllRUV task...')
  1190. try:
  1191. topology.master1.tasks.cleanAllRUV(suffix=DEFAULT_SUFFIX, replicaid='4',
  1192. args={TASK_WAIT: True})
  1193. except ValueError as e:
  1194. log.fatal('test_cleanallruv_stress_clean: Problem running cleanAllRuv task: ' +
  1195. e.message('desc'))
  1196. assert False
  1197. # Wait for the update to finish
  1198. log.info('test_cleanallruv_stress_clean: wait for all the updates to finish...')
  1199. m1_add_users.join()
  1200. m2_add_users.join()
  1201. m3_add_users.join()
  1202. m4_add_users.join()
  1203. # Check the other master's RUV for 'replica 4'
  1204. log.info('test_cleanallruv_stress_clean: check if all the replicas have been cleaned...')
  1205. clean = False
  1206. count = 0
  1207. while not clean and count < 10:
  1208. clean = True
  1209. # Check master 1
  1210. try:
  1211. entry = topology.master1.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  1212. if not entry:
  1213. log.error('test_cleanallruv_stress_clean: Failed to find db tombstone entry from master')
  1214. repl_fail(replica_inst)
  1215. elements = entry[0].getValues('nsds50ruv')
  1216. for ruv in elements:
  1217. if 'replica 4' in ruv:
  1218. # Not cleaned
  1219. log.error('test_cleanallruv_stress_clean: Master 1 not cleaned!')
  1220. clean = False
  1221. if clean:
  1222. log.info('test_cleanallruv_stress_clean: Master 1 is cleaned.')
  1223. except ldap.LDAPError as e:
  1224. log.fatal('test_cleanallruv_stress_clean: Unable to search master 1 for db tombstone: ' +
  1225. e.message['desc'])
  1226. # Check master 2
  1227. try:
  1228. entry = topology.master2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  1229. if not entry:
  1230. log.error('test_cleanallruv_stress_clean: Failed to find db tombstone entry from master')
  1231. repl_fail(replica_inst)
  1232. elements = entry[0].getValues('nsds50ruv')
  1233. for ruv in elements:
  1234. if 'replica 4' in ruv:
  1235. # Not cleaned
  1236. log.error('test_cleanallruv_stress_clean: Master 2 not cleaned!')
  1237. clean = False
  1238. if clean:
  1239. log.info('test_cleanallruv_stress_clean: Master 2 is cleaned.')
  1240. except ldap.LDAPError as e:
  1241. log.fatal('test_cleanallruv_stress_clean: Unable to search master 2 for db tombstone: ' +
  1242. e.message['desc'])
  1243. # Check master 3
  1244. try:
  1245. entry = topology.master3.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, REPLICA_RUV_FILTER)
  1246. if not entry:
  1247. log.error('test_cleanallruv_stress_clean: Failed to find db tombstone entry from master')
  1248. repl_fail(replica_inst)
  1249. elements = entry[0].getValues('nsds50ruv')
  1250. for ruv in elements:
  1251. if 'replica 4' in ruv:
  1252. # Not cleaned
  1253. log.error('test_cleanallruv_stress_clean: Master 3 not cleaned!')
  1254. clean = False
  1255. if clean:
  1256. log.info('test_cleanallruv_stress_clean: Master 3 is cleaned.')
  1257. except ldap.LDAPError as e:
  1258. log.fatal('test_cleanallruv_stress_clean: Unable to search master 3 for db tombstone: ' +
  1259. e.message['desc'])
  1260. # Sleep a bit and give it chance to clean up...
  1261. time.sleep(5)
  1262. count += 1
  1263. if not clean:
  1264. log.fatal('test_cleanallruv_stress_clean: Failed to clean replicas')
  1265. assert False
  1266. log.info('test_cleanallruv_stress_clean: PASSED, restoring master 4...')
  1267. #
  1268. # Cleanup - restore master 4
  1269. #
  1270. # Turn off readonly mode
  1271. try:
  1272. topology.master4.modify_s(DN_CONFIG, [(ldap.MOD_REPLACE, 'nsslapd-readonly', 'off')])
  1273. except ldap.LDAPError as e:
  1274. log.fatal('test_cleanallruv_stress_clean: Failed to put master 4 into read-only mode: error ' +
  1275. e.message['desc'])
  1276. assert False
  1277. restore_master4(topology)
  1278. def test_cleanallruv_final(topology):
  1279. topology.master1.delete()
  1280. topology.master2.delete()
  1281. topology.master3.delete()
  1282. topology.master4.delete()
  1283. log.info('cleanAllRUV test suite PASSED')
  1284. def run_isolated():
  1285. global installation1_prefix
  1286. installation1_prefix = None
  1287. topo = topology(True)
  1288. test_cleanallruv_init(topo)
  1289. test_cleanallruv_clean(topo)
  1290. test_cleanallruv_clean_restart(topo)
  1291. test_cleanallruv_clean_force(topo)
  1292. test_cleanallruv_abort(topo)
  1293. test_cleanallruv_abort_restart(topo)
  1294. test_cleanallruv_abort_certify(topo)
  1295. test_cleanallruv_stress_clean(topo)
  1296. test_cleanallruv_final(topo)
  1297. if __name__ == '__main__':
  1298. run_isolated()