externalchangelog.xml revision 949d778e8bf931a2331bea641d3b10283a8aa48d
<?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>