1
0

ticket47619_test.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. '''
  10. Created on Nov 7, 2013
  11. @author: tbordaz
  12. '''
  13. import os
  14. import sys
  15. import time
  16. import ldap
  17. import logging
  18. import pytest
  19. from lib389 import DirSrv, Entry, tools
  20. from lib389.tools import DirSrvTools
  21. from lib389._constants import *
  22. from lib389.properties import *
  23. logging.getLogger(__name__).setLevel(logging.DEBUG)
  24. log = logging.getLogger(__name__)
  25. installation_prefix = None
  26. TEST_REPL_DN = "cn=test_repl, %s" % SUFFIX
  27. ENTRY_DN = "cn=test_entry, %s" % SUFFIX
  28. OTHER_NAME = 'other_entry'
  29. MAX_OTHERS = 100
  30. ATTRIBUTES = ['street', 'countryName', 'description', 'postalAddress', 'postalCode', 'title', 'l', 'roomNumber']
  31. class TopologyMasterConsumer(object):
  32. def __init__(self, master, consumer):
  33. master.open()
  34. self.master = master
  35. consumer.open()
  36. self.consumer = consumer
  37. def __repr__(self):
  38. return "Master[%s] -> Consumer[%s" % (self.master, self.consumer)
  39. @pytest.fixture(scope="module")
  40. def topology(request):
  41. '''
  42. This fixture is used to create a replicated topology for the 'module'.
  43. The replicated topology is MASTER -> Consumer.
  44. '''
  45. global installation_prefix
  46. if installation_prefix:
  47. args_instance[SER_DEPLOYED_DIR] = installation_prefix
  48. master = DirSrv(verbose=False)
  49. consumer = DirSrv(verbose=False)
  50. # Args for the master instance
  51. args_instance[SER_HOST] = HOST_MASTER_1
  52. args_instance[SER_PORT] = PORT_MASTER_1
  53. args_instance[SER_SERVERID_PROP] = SERVERID_MASTER_1
  54. args_master = args_instance.copy()
  55. master.allocate(args_master)
  56. # Args for the consumer instance
  57. args_instance[SER_HOST] = HOST_CONSUMER_1
  58. args_instance[SER_PORT] = PORT_CONSUMER_1
  59. args_instance[SER_SERVERID_PROP] = SERVERID_CONSUMER_1
  60. args_consumer = args_instance.copy()
  61. consumer.allocate(args_consumer)
  62. # Get the status of the instance
  63. instance_master = master.exists()
  64. instance_consumer = consumer.exists()
  65. # Remove all the instances
  66. if instance_master:
  67. master.delete()
  68. if instance_consumer:
  69. consumer.delete()
  70. # Create the instances
  71. master.create()
  72. master.open()
  73. consumer.create()
  74. consumer.open()
  75. #
  76. # Now prepare the Master-Consumer topology
  77. #
  78. # First Enable replication
  79. master.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_MASTER, replicaId=REPLICAID_MASTER_1)
  80. consumer.replica.enableReplication(suffix=SUFFIX, role=REPLICAROLE_CONSUMER)
  81. # Initialize the supplier->consumer
  82. properties = {RA_NAME: r'meTo_$host:$port',
  83. RA_BINDDN: defaultProperties[REPLICATION_BIND_DN],
  84. RA_BINDPW: defaultProperties[REPLICATION_BIND_PW],
  85. RA_METHOD: defaultProperties[REPLICATION_BIND_METHOD],
  86. RA_TRANSPORT_PROT: defaultProperties[REPLICATION_TRANSPORT]}
  87. repl_agreement = master.agreement.create(suffix=SUFFIX, host=consumer.host, port=consumer.port, properties=properties)
  88. if not repl_agreement:
  89. log.fatal("Fail to create a replica agreement")
  90. sys.exit(1)
  91. log.debug("%s created" % repl_agreement)
  92. master.agreement.init(SUFFIX, HOST_CONSUMER_1, PORT_CONSUMER_1)
  93. master.waitForReplInit(repl_agreement)
  94. # Check replication is working fine
  95. if master.testReplication(DEFAULT_SUFFIX, consumer):
  96. log.info('Replication is working.')
  97. else:
  98. log.fatal('Replication is not working.')
  99. assert False
  100. def fin():
  101. master.delete()
  102. consumer.delete()
  103. request.addfinalizer(fin)
  104. # Here we have two instances master and consumer
  105. # with replication working.
  106. return TopologyMasterConsumer(master, consumer)
  107. def test_ticket47619_init(topology):
  108. """
  109. Initialize the test environment
  110. """
  111. topology.master.plugins.enable(name=PLUGIN_RETRO_CHANGELOG)
  112. #topology.master.plugins.enable(name=PLUGIN_MEMBER_OF)
  113. #topology.master.plugins.enable(name=PLUGIN_REFER_INTEGRITY)
  114. topology.master.stop(timeout=10)
  115. topology.master.start(timeout=10)
  116. topology.master.log.info("test_ticket47619_init topology %r" % (topology))
  117. # the test case will check if a warning message is logged in the
  118. # error log of the supplier
  119. topology.master.errorlog_file = open(topology.master.errlog, "r")
  120. # add dummy entries
  121. for cpt in range(MAX_OTHERS):
  122. name = "%s%d" % (OTHER_NAME, cpt)
  123. topology.master.add_s(Entry(("cn=%s,%s" % (name, SUFFIX), {
  124. 'objectclass': "top person".split(),
  125. 'sn': name,
  126. 'cn': name})))
  127. topology.master.log.info("test_ticket47619_init: %d entries ADDed %s[0..%d]" % (MAX_OTHERS, OTHER_NAME, MAX_OTHERS-1))
  128. # Check the number of entries in the retro changelog
  129. time.sleep(2)
  130. ents = topology.master.search_s(RETROCL_SUFFIX, ldap.SCOPE_ONELEVEL, "(objectclass=*)")
  131. assert len(ents) == MAX_OTHERS
  132. def test_ticket47619_create_index(topology):
  133. args = {INDEX_TYPE: 'eq'}
  134. for attr in ATTRIBUTES:
  135. topology.master.index.create(suffix=RETROCL_SUFFIX, attr=attr, args=args)
  136. topology.master.restart(timeout=10)
  137. def test_ticket47619_reindex(topology):
  138. '''
  139. Reindex all the attributes in ATTRIBUTES
  140. '''
  141. args = {TASK_WAIT: True}
  142. for attr in ATTRIBUTES:
  143. rc = topology.master.tasks.reindex(suffix=RETROCL_SUFFIX, attrname=attr, args=args)
  144. assert rc == 0
  145. def test_ticket47619_check_indexed_search(topology):
  146. for attr in ATTRIBUTES:
  147. ents = topology.master.search_s(RETROCL_SUFFIX, ldap.SCOPE_SUBTREE, "(%s=hello)" % attr)
  148. assert len(ents) == 0
  149. if __name__ == '__main__':
  150. # Run isolated
  151. # -s for DEBUG mode
  152. CURRENT_FILE = os.path.realpath(__file__)
  153. pytest.main("-s %s" % CURRENT_FILE)