ticket47966_test.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. from lib389 import DirSrv, Entry, tools, tasks
  16. from lib389.tools import DirSrvTools
  17. from lib389._constants import *
  18. from lib389.properties import *
  19. from lib389.tasks import *
  20. from lib389.utils import *
  21. logging.getLogger(__name__).setLevel(logging.DEBUG)
  22. log = logging.getLogger(__name__)
  23. installation1_prefix = None
  24. m1_m2_agmt = ""
  25. class TopologyReplication(object):
  26. def __init__(self, master1, master2):
  27. master1.open()
  28. self.master1 = master1
  29. master2.open()
  30. self.master2 = master2
  31. @pytest.fixture(scope="module")
  32. def topology(request):
  33. global installation1_prefix
  34. if installation1_prefix:
  35. args_instance[SER_DEPLOYED_DIR] = installation1_prefix
  36. # Creating master 1...
  37. master1 = DirSrv(verbose=False)
  38. args_instance[SER_HOST] = HOST_MASTER_1
  39. args_instance[SER_PORT] = PORT_MASTER_1
  40. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_1
  41. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  42. args_master = args_instance.copy()
  43. master1.allocate(args_master)
  44. instance_master1 = master1.exists()
  45. if instance_master1:
  46. master1.delete()
  47. master1.create()
  48. master1.open()
  49. master1.replica.enableReplication(suffix=DEFAULT_SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_1)
  50. # Creating master 2...
  51. master2 = DirSrv(verbose=False)
  52. args_instance[SER_HOST] = HOST_MASTER_2
  53. args_instance[SER_PORT] = PORT_MASTER_2
  54. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_2
  55. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  56. args_master = args_instance.copy()
  57. master2.allocate(args_master)
  58. instance_master2 = master2.exists()
  59. if instance_master2:
  60. master2.delete()
  61. master2.create()
  62. master2.open()
  63. master2.replica.enableReplication(suffix=DEFAULT_SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_2)
  64. #
  65. # Create all the agreements
  66. #
  67. # Creating agreement from master 1 to master 2
  68. properties = {RA_NAME: r'meTo_$host:$port',
  69. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  70. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  71. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  72. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  73. global m1_m2_agmt
  74. m1_m2_agmt = master1.agreement.create(suffix=DEFAULT_SUFFIX, host=master2.host, port=master2.port, properties=properties)
  75. if not m1_m2_agmt:
  76. log.fatal("Fail to create a master -> master replica agreement")
  77. sys.exit(1)
  78. log.debug("%s created" % m1_m2_agmt)
  79. # Creating agreement from master 2 to master 1
  80. properties = {RA_NAME: r'meTo_$host:$port',
  81. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  82. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  83. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  84. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  85. m2_m1_agmt = master2.agreement.create(suffix=DEFAULT_SUFFIX, host=master1.host, port=master1.port, properties=properties)
  86. if not m2_m1_agmt:
  87. log.fatal("Fail to create a master -> master replica agreement")
  88. sys.exit(1)
  89. log.debug("%s created" % m2_m1_agmt)
  90. # Allow the replicas to get situated with the new agreements...
  91. time.sleep(5)
  92. #
  93. # Initialize all the agreements
  94. #
  95. master1.agreement.init(DEFAULT_SUFFIX, HOST_MASTER_2, PORT_MASTER_2)
  96. master1.waitForReplInit(m1_m2_agmt)
  97. # Check replication is working...
  98. if master1.testReplication(DEFAULT_SUFFIX, master2):
  99. log.info('Replication is working.')
  100. else:
  101. log.fatal('Replication is not working.')
  102. assert False
  103. def fin():
  104. master1.delete()
  105. master2.delete()
  106. request.addfinalizer(fin)
  107. return TopologyReplication(master1, master2)
  108. def test_ticket47966(topology):
  109. '''
  110. Testing bulk import when the backend with VLV was recreated.
  111. If the test passes without the server crash, 47966 is verified.
  112. '''
  113. log.info('Testing Ticket 47966 - [VLV] slapd crashes during Dogtag clone reinstallation')
  114. M1 = topology.master1
  115. M2 = topology.master2
  116. log.info('0. Create a VLV index on Master 2.')
  117. # get the backend entry
  118. be = M2.replica.conn.backend.list(suffix=DEFAULT_SUFFIX)
  119. if not be:
  120. log.fatal("ticket47966: enable to retrieve the backend for %s" % DEFAULT_SUFFIX)
  121. raise ValueError("no backend for suffix %s" % DEFAULT_SUFFIX)
  122. bent = be[0]
  123. beName = bent.getValue('cn')
  124. beDn = "cn=%s,cn=ldbm database,cn=plugins,cn=config" % beName
  125. # generate vlvSearch entry
  126. vlvSrchDn = "cn=vlvSrch,%s" % beDn
  127. log.info('0-1. vlvSearch dn: %s' % vlvSrchDn)
  128. vlvSrchEntry = Entry(vlvSrchDn)
  129. vlvSrchEntry.setValues('objectclass', 'top', 'vlvSearch')
  130. vlvSrchEntry.setValues('cn', 'vlvSrch')
  131. vlvSrchEntry.setValues('vlvBase', DEFAULT_SUFFIX)
  132. vlvSrchEntry.setValues('vlvFilter', '(|(objectclass=*)(objectclass=ldapsubentry))')
  133. vlvSrchEntry.setValues('vlvScope', '2')
  134. M2.add_s(vlvSrchEntry)
  135. # generate vlvIndex entry
  136. vlvIndexDn = "cn=vlvIdx,%s" % vlvSrchDn
  137. log.info('0-2. vlvIndex dn: %s' % vlvIndexDn)
  138. vlvIndexEntry = Entry(vlvIndexDn)
  139. vlvIndexEntry.setValues('objectclass', 'top', 'vlvIndex')
  140. vlvIndexEntry.setValues('cn', 'vlvIdx')
  141. vlvIndexEntry.setValues('vlvSort', 'cn ou sn')
  142. M2.add_s(vlvIndexEntry)
  143. log.info('1. Initialize Master 2 from Master 1.')
  144. M1.agreement.init(DEFAULT_SUFFIX, HOST_MASTER_2, PORT_MASTER_2)
  145. M1.waitForReplInit(m1_m2_agmt)
  146. # Check replication is working...
  147. if M1.testReplication(DEFAULT_SUFFIX, M2):
  148. log.info('1-1. Replication is working.')
  149. else:
  150. log.fatal('1-1. Replication is not working.')
  151. assert False
  152. log.info('2. Delete the backend instance on Master 2.')
  153. M2.delete_s(vlvIndexDn)
  154. M2.delete_s(vlvSrchDn)
  155. # delete the agreement, replica, and mapping tree, too.
  156. M2.replica.disableReplication(DEFAULT_SUFFIX)
  157. mappingTree = 'cn="%s",cn=mapping tree,cn=config' % DEFAULT_SUFFIX
  158. M2.mappingtree.delete(DEFAULT_SUFFIX, beName, mappingTree)
  159. M2.backend.delete(DEFAULT_SUFFIX, beDn, beName)
  160. log.info('3. Recreate the backend and the VLV index on Master 2.')
  161. M2.mappingtree.create(DEFAULT_SUFFIX, beName)
  162. M2.backend.create(DEFAULT_SUFFIX, {BACKEND_NAME: beName})
  163. log.info('3-1. Recreating %s and %s on Master 2.' % (vlvSrchDn, vlvIndexDn))
  164. M2.add_s(vlvSrchEntry)
  165. M2.add_s(vlvIndexEntry)
  166. M2.replica.enableReplication(suffix=DEFAULT_SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_2)
  167. # agreement m2_m1_agmt is not needed... :p
  168. log.info('4. Initialize Master 2 from Master 1 again.')
  169. M1.agreement.init(DEFAULT_SUFFIX, HOST_MASTER_2, PORT_MASTER_2)
  170. M1.waitForReplInit(m1_m2_agmt)
  171. # Check replication is working...
  172. if M1.testReplication(DEFAULT_SUFFIX, M2):
  173. log.info('4-1. Replication is working.')
  174. else:
  175. log.fatal('4-1. Replication is not working.')
  176. assert False
  177. log.info('5. Check Master 2 is up.')
  178. entries = M2.search_s(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, '(cn=*)')
  179. assert len(entries) > 0
  180. log.info('5-1. %s entries are returned from M2.' % len(entries))
  181. log.info('Test complete')
  182. def test_ticket47966_final(topology):
  183. log.info('Testcase PASSED')
  184. def run_isolated():
  185. global installation1_prefix
  186. installation1_prefix = None
  187. topo = topology(True)
  188. test_ticket47966(topo)
  189. test_ticket47966_final(topo)
  190. if __name__ == '__main__':
  191. run_isolated()