| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2008-2009 Sun Microsystems, Inc. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_externalchangelog"/> |
| | | |
| | | <function name="replication_externalchangelog"> |
| | | <sequence> |
| | | <block name="'externalchangelog'"> |
| | | <sequence> |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication External Changelog Tests |
| | | #@TestSuitePurpose Test the event notification system provided by |
| | | the External Changelog. |
| | | #@TestSuiteID External Changelog Tests |
| | | #@TestSuiteGroup External Changelog |
| | | #@TestGroup Replication |
| | | #@TestScript replication_externalchangelog.xml |
| | | #@TestHTMLLink http://opends.dev.java.net/ |
| | | --> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'dataFile' : 'Example.ldif' } |
| | | </call> |
| | | |
| | | |
| | | <script> |
| | | # initialise the lastCookie value to that for the first ECL request |
| | | lastCookie = ';' |
| | | nextCookie = None |
| | | |
| | | addOperationalAttrs = """\* creatorsname createtimestamp entryuuid""" |
| | | modOperationalAttrs = """\* modifiersname modifytimestamp entryuuid""" |
| | | |
| | | class Entry: |
| | | def __init__(self, rdn): |
| | | self.userDn = '%s,ou=People,%s' \ |
| | | % (rdn, synchroSuffix) |
| | | self.listAttr = [] |
| | | self.listAttr.append('objectclass:top') |
| | | self.listAttr.append('objectclass:organizationalperson') |
| | | self.listAttr.append('objectclass:inetorgperson') |
| | | self.listAttr.append('objectclass:person') |
| | | def getDn(self): |
| | | return self.userDn |
| | | def getAttrList(self): |
| | | return self.listAttr |
| | | def addAttr(self, attrType, attrValue): |
| | | self.listAttr.append('%s:%s' % (attrType, attrValue)) |
| | | </script> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Add_1 |
| | | #@TestID Add_1 |
| | | #@TestPurpose Verify add operation is recorded properly in the |
| | | external changelog on each replication server |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Add_1')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Add_1. \ |
| | | Verify add operation is recorded properly in the external \ |
| | | changelog on each replication server' |
| | | </message> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <script> |
| | | myEntry = Entry('cn=a') |
| | | myEntry.addAttr('sn', 'a') |
| | | myEntry.addAttr('description', '1') |
| | | myEntry.addAttr('description', '2') |
| | | myEntry.addAttr('uid', 'A') |
| | | |
| | | addedEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : addOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | addedEntry = STAXResult |
| | | |
| | | myTargetDN = addedEntry['dn'][0] |
| | | myChangeType = 'add' |
| | | myChangeTime = addedEntry['createtimestamp'][0] |
| | | myTargetEntryUUID = addedEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myChanges = {} |
| | | |
| | | for attr in addedEntry.keys(): |
| | | if (attr != 'dn') and (attr != 'changelogcookie') : |
| | | myChanges[attr] = addedEntry[attr] |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read added entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry add --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s' %\ |
| | | (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="addedEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | addedEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modify_add |
| | | #@TestID Modify_add |
| | | #@TestPurpose Verify modify-add operation is recorded properly |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modify entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_add')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modify_add. \ |
| | | Verify modify-add operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : '3', |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = modEntry['dn'][0] |
| | | myChangeType = 'modify' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myModifiersName = modEntry['modifiersname'][0] |
| | | myModifyTimestamp = modEntry['modifytimestamp'][0] |
| | | myChanges = [] |
| | | myChanges.append(['add', 'description', '3']) |
| | | myChanges.append(['replace', 'modifiersname', myModifiersName]) |
| | | myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp]) |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read modified entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modify_delete |
| | | #@TestID Modify_delete |
| | | #@TestPurpose Verify modify-del operation is recorded properly |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modify entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_delete')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modify_delete. \ |
| | | Verify modify-del operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | |
| | | valuesToDelete = [] |
| | | valuesToDelete.append('description:1') |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : valuesToDelete, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = modEntry['dn'][0] |
| | | myChangeType = 'modify' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myModifiersName = modEntry['modifiersname'][0] |
| | | myModifyTimestamp = modEntry['modifytimestamp'][0] |
| | | myChanges = [] |
| | | myChanges.append(['delete', 'description', '1']) |
| | | myChanges.append(['replace', 'modifiersname', myModifiersName]) |
| | | myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp]) |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read modified entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modify_replace |
| | | #@TestID Modify_replace |
| | | #@TestPurpose Verify modify-replace operation is well recorded |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modify entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_replace')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modify_replace. \ |
| | | Verify modify-replace operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : 'new', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = modEntry['dn'][0] |
| | | myChangeType = 'modify' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myModifiersName = modEntry['modifiersname'][0] |
| | | myModifyTimestamp = modEntry['modifytimestamp'][0] |
| | | myChanges = [] |
| | | myChanges.append(['replace', 'description', 'new']) |
| | | myChanges.append(['replace', 'modifiersname', myModifiersName]) |
| | | myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp]) |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read modified entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modrdn_deleteoldrdn_true |
| | | #@TestID Modrdn_deleteoldrdn_true |
| | | #@TestPurpose Verify modrdn operation is recorded properly |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modrdn entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modrdn_deleteoldrdn_true')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modrdn_deleteoldrdn_true. \ |
| | | Verify modrdn operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | |
| | | oldEntry = myEntry |
| | | newRdn = 'cn=b' |
| | | newEntry = Entry(newRdn) |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyDn'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : oldEntry.getDn(), |
| | | 'newRDN' : newRdn |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : newEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = oldEntry.getDn() |
| | | myChangeType = 'modrdn' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myNewRDN = newRdn |
| | | myDeleteOldRDN = 'true' |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read added entry %s from server %s:%s' % \ |
| | | (newEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'newRDN' : myNewRDN, |
| | | 'deleteOldRDN' : myDeleteOldRDN |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (newEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modrdn_deleteoldrdn_false |
| | | #@TestID Modrdn_deleteoldrdn_false |
| | | #@TestPurpose Verify modrdn operation is recorded properly |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modrdn entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modrdn_deleteoldrdn_false')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modrdn_deleteoldrdn_false. \ |
| | | Verify modrdn operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | |
| | | oldEntry = newEntry |
| | | newRdn = 'cn=c' |
| | | newEntry = Entry(newRdn) |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyDn'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : oldEntry.getDn(), |
| | | 'newRDN' : newRdn, |
| | | 'deleteOldRDN' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : newEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = oldEntry.getDn() |
| | | myChangeType = 'modrdn' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myNewRDN = newRdn |
| | | myDeleteOldRDN = 'false' |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read added entry %s from server %s:%s' % \ |
| | | (newEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'newRDN' : myNewRDN, |
| | | 'deleteOldRDN' : myDeleteOldRDN |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (newEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Delete_1 |
| | | #@TestID Delete_1 |
| | | #@TestPurpose Verify delete operation is recorded properly |
| | | in the external changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Delete entry on server A |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Delete_1')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Delete_1. \ |
| | | Verify delete operation is recorded properly in the \ |
| | | external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | delEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : newEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | delEntry = STAXResult |
| | | |
| | | myTargetDN = delEntry['dn'][0] |
| | | myChangeType = 'delete' |
| | | myTargetEntryUUID = delEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read added entry %s from server %s:%s' % \ |
| | | (newEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Delete entry on one of the servers --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : newEntry.getDn() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check delete worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : newEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="delEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'targetEntryUUID' : myTargetEntryUUID |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (newEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | delEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Add_2 |
| | | #@TestID Add_2 |
| | | #@TestPurpose Verify add operation (of an entry with |
| | | userpassword) is recorded properly in the |
| | | external changelog on each replication server |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server A (with userpassword) |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Add_2')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Add_2. \ |
| | | Verify add operation (of and entry with userpassword) is \ |
| | | recorded properly in the external changelog on each \ |
| | | replication server' |
| | | </message> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <script> |
| | | myEntry = Entry('cn=user') |
| | | myEntry.addAttr('sn', 'user') |
| | | myEntry.addAttr('userpassword', 'password') |
| | | |
| | | addedEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : '%s pwdChangedTime' % addOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | addedEntry = STAXResult |
| | | |
| | | myTargetDN = addedEntry['dn'][0] |
| | | myChangeType = 'add' |
| | | myChangeTime = addedEntry['createtimestamp'][0] |
| | | myTargetEntryUUID = addedEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myChanges = {} |
| | | |
| | | for attr in addedEntry.keys(): |
| | | if (attr != 'dn') and (attr != 'changelogcookie') : |
| | | myChanges[attr] = addedEntry[attr] |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read added entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry add --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s' %\ |
| | | (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="addedEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | addedEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication External Changelog Tests |
| | | #@TestName Replication: External Changelog: Modify_replace_2 |
| | | #@TestID Modify_replace_2 |
| | | #@TestPurpose Verify modify-replace operation as non directory |
| | | manager is well recorded in the external |
| | | changelog on each repl server |
| | | #@TestPreamble |
| | | #@TestSteps Modify entry on server A (as non dir manager) |
| | | #@TestSteps Verify servers in sync |
| | | #@TestSteps Read entry from ldap server |
| | | #@TestSteps Read last changelog entry on each repl server |
| | | #@TestSteps Check changelog entry against expected values |
| | | #@TestPostamble |
| | | #@TestResult Success if the server synchronised and the |
| | | changelog entry value check succeeds |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_replace_2')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: External Changelog: Modify_replace_2. \ |
| | | Verify modify-replace operation as non directory manager is \ |
| | | recorded properly in the external changelog on each repl server' |
| | | </message> |
| | | |
| | | <script> |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : 'password', |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'userpassword', |
| | | 'newAttributeValue' : 'newpass', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Retrieve entry information for checkChangelogEntry's sake --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : '%s pwdChangedTime' % modOperationalAttrs |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the entry as read from server %s:%s: \n%s' % \ |
| | | (masterHost, master.getPort(), searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | modEntry = STAXResult |
| | | |
| | | myTargetDN = modEntry['dn'][0] |
| | | myChangeType = 'modify' |
| | | myChangeTime = modEntry['modifytimestamp'][0] |
| | | myTargetEntryUUID = modEntry['entryuuid'][0] |
| | | # myReplicationCSN = ----> grab from where??? |
| | | # myReplicatIdentifier = ----> grab from ldap server |
| | | myModifiersName = modEntry['modifiersname'][0] |
| | | myModifyTimestamp = modEntry['modifytimestamp'][0] |
| | | myUserPassword = modEntry['userpassword'][0] |
| | | myPwdChangedTime = modEntry['pwdchangedtime'][0] |
| | | myChanges = [] |
| | | myChanges.append(['replace', 'userpassword', myUserPassword]) |
| | | myChanges.append(['replace', 'pwdchangedtime', myPwdChangedTime]) |
| | | myChanges.append(['replace', 'modifiersname', myModifiersName]) |
| | | myChanges.append(['replace', 'modifytimestamp', myModifyTimestamp]) |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read modified entry %s from server %s:%s' % \ |
| | | (myEntry.getDn(), masterHost, master.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <iterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Reading changelog in replication server %s:%s from index: \ |
| | | %s' % \ |
| | | (replServer.getHostname(), replServer.getPort(), lastCookie) |
| | | </message> |
| | | |
| | | <!-- Search for entry modify --> |
| | | <call function="'SearchExternalChangelog'"> |
| | | { 'location' : replServer.getHostname(), |
| | | 'dsPath' : replServerPath, |
| | | 'dsInstanceHost' : replServer.getHostname(), |
| | | 'dsInstancePort' : replServer.getPort(), |
| | | 'dsInstanceDn' : replServer.getRootDn(), |
| | | 'dsInstancePswd' : replServer.getRootPwd(), |
| | | 'dsScope' : 'subordinate', |
| | | 'dsBaseDN' : 'cn=changelog', |
| | | 'dsFilter' : '(objectclass=*)', |
| | | 'changelogCookie' : lastCookie |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | </script> |
| | | <if expr="searchRC == 0"> |
| | | <sequence> |
| | | <message> |
| | | 'This is the ECL entry as read from server %s:%s: \n%s'\ |
| | | % (replServer.getHostname(), replServer.getPort(), |
| | | searchResult) |
| | | </message> |
| | | <call function="'parseLdifEntry'"> |
| | | { 'ldifEntry' : searchResult } |
| | | </call> |
| | | <script> |
| | | eclEntry = STAXResult |
| | | |
| | | nextCookie = eclEntry['changelogcookie'][0] |
| | | </script> |
| | | <message> |
| | | 'Parsed changelog entry: \n%s' % eclEntry |
| | | </message> |
| | | <message> |
| | | 'Cookie to use for the next ECL search: %s' % \ |
| | | nextCookie |
| | | </message> |
| | | </sequence> |
| | | <else> |
| | | <message log="1" level="'Error'"> |
| | | 'Could not read changelog on replication server %s:%s' \ |
| | | % (replServer.getHostname(), replServer.getPort()) |
| | | </message> |
| | | </else> |
| | | </if> |
| | | |
| | | <if expr="modEntry and eclEntry"> |
| | | <call function="'checkChangelogEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'changelogEntry' : eclEntry, |
| | | 'targetDN' : myTargetDN, |
| | | 'changeType' : myChangeType, |
| | | 'changeTime' : myChangeTime, |
| | | 'targetEntryUUID' : myTargetEntryUUID, |
| | | 'changes' : myChanges |
| | | } |
| | | </call> |
| | | <else> |
| | | <sequence> |
| | | <message log="1" level="'Error'"> |
| | | 'Unable to check external changelog entry (failed to \ |
| | | read entries %s and/or %s)' % \ |
| | | (myEntry.getDn(), eclEntry['dn'][0]) |
| | | </message> |
| | | <call function="'testFailed'"/> |
| | | </sequence> |
| | | </else> |
| | | </if> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <script> |
| | | # set the lastCookie for the next ECL search |
| | | if nextCookie: |
| | | lastCookie = nextCookie |
| | | |
| | | # reset variables, just in case |
| | | modEntry = None |
| | | eclEntry = None |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" /> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | </sequence> |
| | | </block> |
| | | </sequence> |
| | | </function> |
| | | </stax> |