cleanallruv_test.py 48 KB

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