<?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 legal-notices/CDDLv1_0.txt
! or http://forgerock.org/license/CDDLv1.0.html.
! 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 legal-notices/CDDLv1_0.txt.
! 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.
! Portions Copyright 2011-2013 ForgeRock AS.
! -->
<stax>
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog: Search
#@TestID Search
#@TestPurpose Check replication changelog can be searched and
look up changes
#@TestPreamble
#@TestSteps Add entry to server A
#@TestSteps Modify entry on server A
#@TestSteps Search changelogs and check for made changes
#@TestPostamble
#@TestResult Success if the corresponding changes can be
found in the changelog
-->
<function name="replication_changelog_001" scope="local">
<testcase name="getTestCaseName('Search')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog can be searched and look up changes.' % msg1 }
</call>
<!-- Add entry to "master" server -->
<script>
userDn = 'uid=iabizen.0, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.0')
listAttr.append('sn:Abizen.0')
listAttr.append('cn:Izen Abizen.0')
listAttr.append('l:ICNC')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDn,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<!-- 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' : userDn,
'attributeName' : 'l',
'newAttributeValue' : 'GEC',
'changetype' : 'replace',
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Search changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<!-- Search for entry add -->
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.0',
'dsAttributes' : 'dn'
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1
}
</call>
<!-- Search for entry modify -->
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'l=GEC',
'dsAttributes' : 'dn'
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
if is_windows_platform(mylocation):
knownIssue = 'OPENDJ-110'
else:
knownIssue = None
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1,
'issue' : knownIssue
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog: Export (on-line)
#@TestID Export (on-line)
#@TestPurpose Check replication changelog can be exported
on-line and look up changes
#@TestPreamble
#@TestSteps Add entry to server A
#@TestSteps Export every changelog to ldif file
#@TestSteps Check for added entry in each exported changelog
file
#@TestPostamble
#@TestResult Success if the corresponding change can be found
in the exported changelog files
-->
<function name="replication_changelog_002" scope="local">
<testcase name="getTestCaseName('Export (on-line)')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog can be exported on-line and look up changes.' % msg1 }
</call>
<!-- Add entry to "master" server -->
<script>
userDn = 'uid=iabizen.2, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.2')
listAttr.append('sn:Abizen.2')
listAttr.append('cn:Izen Abizen.2')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDn,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Export changelog in the various replication servers, then
check for added entry in the exported files -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
replServerBackupDir = '%s' % replServer.getTmpDir()
</script>
<!-- Export changelog data from server -->
<call function="'exportLdifWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstanceAdminPort' : replServer.getAdminPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'ldifFile' : '%s/replication/changelog_export_online.ldif' \
% replServerBackupDir,
'backEnd' : 'replicationChanges'
}
</call>
<!-- Check for the added entry inside the exported file -->
<call function="'grep'">
{
'location' : replServer.getHostname(),
'filename' : '%s/replication/changelog_export_online.ldif' \
% replServerBackupDir,
'testString' : 'uid=iabizen.2'
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog:
Backup-restore (off-line)
#@TestID Backup-restore (off-line)
#@TestPurpose Check replication changelog can be backuped and
restored off-line
#@TestPreamble Backup server suffix
#@TestSteps Add entry A to server
#@TestSteps Stop servers
#@TestSteps Backup every changelog
#@TestSteps Start servers
#@TestSteps Add entry B to server
#@TestSteps Stop servers
#@TestSteps Restore server suffix (without entries A and B)
#@TestSteps Restore every changelog
#@TestSteps Start servers
#@TestSteps Check for added entry A in changelog and server
#@TestSteps Check for added entry B in changelog and server
#@TestPostamble
#@TestResult Success if the search for entry A succeeds and
the search for entry B fails
-->
<function name="replication_changelog_003" scope="local">
<testcase name="getTestCaseName('Backup-restore (off-line)')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog can be backed up and restored off-line.' % msg1 }
</call>
<!-- Backup "master" server -->
<message>
'+++++ binary copy off-line: back-up server %s:%s' \
% (masterHost, master.getPort())
</message>
<call function="'backup'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'backupDir' : '%s/replication/master_backup' % masterBackupDir
}
</call>
<!-- Add entry A to "master" server -->
<script>
userDnA = 'uid=iabizen.A, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.A')
listAttr.append('sn:Abizen.A')
listAttr.append('cn:Izen Abizen.A')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnA,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Stop the servers in the topology -->
<script>
if globalSplitServers:
serverList = _topologyReplServerList
else:
serverList = _topologyServerList
</script>
<call function="'stopServers'">
[serverList]
</call>
<!-- Backup changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
replServerDataDir = '%s' % replServer.getDataDir()
replServerBackupDir = '%s' % replServer.getTmpDir()
</script>
<call function="'backup'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'backupDir' : '%s/replication/changelog_backup' \
% replServerBackupDir,
'backEnd' : 'replicationChanges'
}
</call>
</sequence>
</paralleliterate>
<!-- Start the servers in the topology -->
<script>
if globalSplitServers:
serverList = _topologyReplServerList
else:
serverList = _topologyServerList
</script>
<call function="'startServers'">
[serverList]
</call>
<!-- Add entry B to "master" server -->
<script>
userDnB = 'uid=iabizen.B, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.B')
listAttr.append('sn:Abizen.B')
listAttr.append('cn:Izen Abizen.B')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnB,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Stop the servers in the topology -->
<call function="'stopServers'">
[_splitServerList]
</call>
<!-- Restore master_backup in every server, then restore
changelog_backup in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
serverBackupDir = '%s' % server.getTmpDir()
replServerDataDir = '%s' % replServer.getDataDir()
replServerBackupDir = '%s' % replServer.getTmpDir()
</script>
<!-- Restore master_backup -->
<if expr="i != 0">
<!-- _topologyServerList[0] corresponds to "master", so
no need to copy the files for that case -->
<sequence>
<!-- TODO: check what schematokens.dat files are? -->
<if expr="os.path.exists
('%s/config/schematokens.dat' % dsPath)" >
<call function="'copyFile'">
{ 'location' : masterHost,
'remotehost' : server.getHostname(),
'srcfile' : '%s/config/schematokens.dat' \
% masterPath,
'destfile' : '%s/config/schematokens.dat' \
% serverPath
}
</call>
</if>
<call function="'CopyFolderByExtension'">
{ 'location' : masterHost,
'remotehost' : server.getHostname(),
'srcfolder' : masterBackupDir,
'destfolder' : '%s/replication/master_backup' \
% serverBackupDir,
'extension' : '*'
}
</call>
</sequence>
</if>
<call function="'restore'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'backupDir' : '%s/replication/master_backup' \
% serverBackupDir
}
</call>
<!-- Restore changelog_backup -->
<call function="'restore'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'backupDir' : '%s/replication/changelog_backup' \
% replServerBackupDir
}
</call>
</sequence>
</paralleliterate>
<!-- Start the servers in the topology -->
<call function="'startServers'">
[_splitServerList]
</call>
<!-- Search synchroSuffix and changelog in the various servers,
looking for entries A (should be there) and B (shouldn't be) -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<!-- Search for entry A (should be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'dsBaseDN' : userDnA,
'dsFilter' : 'objectclass=*',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.A',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1
}
</call>
<!-- Search for entry B (should NOT be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'dsBaseDN' : userDnB,
'dsFilter' : 'objectclass=*',
'dsAttributes' : 'dn',
'expectedRC' : 32
}
</call>
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.B',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect NO entry returned => len(searchResult) = 0
=====> resultLength = 0 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 0
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
<!-- Due to the impossibility to ensure all the restore operations (of both
db and changelogs) are done at the very same time, there's no controlling
the output of this testcase.
-->
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog: Backup-restore (on-line)
#@TestID Backup-restore (on-line)
#@TestPurpose Check replication changelog can be backuped and
restored on-line
#@TestPreamble Backup server suffix (done at the beginning of
the test suite)
#@TestSteps Add entry AA to server
#@TestSteps Backup every changelog
#@TestSteps Add entry BB to server
#@TestSteps Restore every changelog
#@TestSteps Restore server suffix (without entries AA and BB)
#@TestSteps Check for added entry AA in changelog and server
#@TestSteps Check for added entry BB in changelog and server
#@TestPostamble
#@TestResult Success if the search for entry AA succeeds and
the search for entry BB fails
-->
<function name="replication_changelog_004" scope="local">
<testcase name="getTestCaseName('Backup-restore (on-line)')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog can be backed up and restored on-line.' % msg1 }
</call>
<!-- Add entry AA to "master" server -->
<script>
userDnAA = 'uid=iabizen.AA, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.AA')
listAttr.append('sn:Abizen.AA')
listAttr.append('cn:Izen Abizen.AA')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnAA,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Backup changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
replServerBackupDir = '%s' % replServer.getTmpDir()
</script>
<call function="'backupTask'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'taskID' : 'changelog backup task',
'backupDir' : '%s/replication/changelog_backup_online' \
% replServerBackupDir,
'backEnd' : 'replicationChanges'
}
</call>
</sequence>
</paralleliterate>
<!-- Add entry BB to "master" server -->
<script>
userDnBB = 'uid=iabizen.BB, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.BB')
listAttr.append('sn:Abizen.BB')
listAttr.append('cn:Izen Abizen.BB')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnBB,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Restore changelog_backup_online in the various replication
servers, then restore master_backup in every server -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
serverBackupDir = '%s' % server.getTmpDir()
replServerBackupDir = '%s' % replServer.getTmpDir()
</script>
<!-- Restore changelog_backup -->
<call function="'restoreTask'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'taskID' : 'changelog restore task',
'backupDir' : '%s/replication/changelog_backup_online' \
% replServerBackupDir
}
</call>
<!-- Restore master_backup -->
<if expr="i != 0">
<!-- _topologyServerList[0] corresponds to "master", so
no need to copy the files for that case -->
<sequence>
<if expr="os.path.exists
('%s/config/schematokens.dat' % dsPath)" >
<call function="'copyFile'">
{ 'location' : masterHost,
'remotehost' : server.getHostname(),
'srcfile' : '%s/config/schematokens.dat' \
% masterPath,
'destfile' : '%s/config/schematokens.dat' \
% serverPath
}
</call>
</if>
<call function="'CopyFolderByExtension'">
{ 'location' : masterHost,
'remotehost' : server.getHostname(),
'srcfolder' : masterBackupDir,
'destfolder' : '%s/replication/master_backup' \
% serverBackupDir,
'extension' : '*'
}
</call>
</sequence>
</if>
<call function="'restoreTask'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'taskID' : 'restore task',
'backupDir' : '%s/replication/master_backup' \
% serverBackupDir
}
</call>
</sequence>
</paralleliterate>
<!-- Search synchroSuffix and changelog in the various servers,
looking for entries AA (should be there) and BB (shouldn't be)
-->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<!-- Search for entry AA (should be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'dsBaseDN' : userDnAA,
'dsFilter' : 'objectclass=*',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.AA',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1
}
</call>
<!-- Search for entry BB (should NOT be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'dsBaseDN' : userDnBB,
'dsFilter' : 'objectclass=*',
'dsAttributes' : 'dn',
'expectedRC' : 32
}
</call>
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.BB',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect NO entry returned => len(searchResult) = 0
=====> resultLength = 0 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 0
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog: Changelog Reset
#@TestID Changelog Reset
#@TestPurpose Check replication changelog is reset by
dsreplication pre/post-external-initialize
#@TestPreamble
#@TestSteps Add entry to server A
#@TestSteps Search changelogs and check for made change
#@TestSteps Reset changelog (call pre/post-external init)
#@TestSteps Search changelogs and check for made change
#@TestPostamble
#@TestResult Success if the corresponding change can be found
in the changelog prior to the reset but not any
more after the reset
-->
<function name="replication_changelog_005" scope="local">
<testcase name="getTestCaseName('Changelog Reset')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog is reset by dsreplication pre/post-external-initialize.' % msg1 }
</call>
<!-- Add entry to "master" server -->
<script>
userDn = 'uid=iabizen.3, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.3')
listAttr.append('sn:Abizen.3')
listAttr.append('cn:Izen Abizen.3')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDn,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Search changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges' ,
'dsFilter' : 'uid=iabizen.3',
'dsAttributes' : 'dn'
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1
}
</call>
</sequence>
</paralleliterate>
<!-- Reset the changelog (call pre/post-external-init) -->
<call function="'resetReplicationData'">
{ 'location' : clientHost,
'dsPath' : clientPath,
'sourceInstanceHost' : masterHost,
'sourceInstancePort' : master.getPort(),
'sourceInstanceAdminPort' : master.getAdminPort(),
'sourceInstanceDn' : master.getRootDn(),
'sourceInstancePswd' : master.getRootPwd(),
'backupDir' : masterBackupDir,
'suffixDn' : synchroSuffix
}
</call>
<!-- Search changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<!-- Search for entry in the suffix (should NOT be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : server.getHostname(),
'dsPath' : serverPath,
'dsInstanceHost' : server.getHostname(),
'dsInstancePort' : server.getPort(),
'dsInstanceDn' : server.getRootDn(),
'dsInstancePswd' : server.getRootPwd(),
'dsBaseDN' : userDn,
'dsFilter' : 'objectclass=*',
'dsAttributes' : 'dn',
'expectedRC' : 32
}
</call>
<!-- Search for corresponding change in the changelog
(should NOT be there) -->
<call function="'ldapSearchWithScript'">
{ 'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.3',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect NO entry returned => len(searchResult) = 0
=====> resultLength = 0 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 0
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
<!--- Test Case information
#@TestMarker Replication Changelog Tests
#@TestName Replication: Changelog: Changelog Purge
#@TestID Changelog Purge
#@TestPurpose Check replication changelog is purged after the
purge delay specified in the conf expires
#@TestPreamble
#@TestSteps Set purge delay to 20 seconds on server A
#@TestSteps Add entry X to server A
#@TestSteps Add entry Y to server A
#@TestSteps Search changelogs and check for made change
#@TestSteps Let purge delay expire (sleep for 30 seconds)
#@TestSteps Search changelogs and check for made change
#@TestPostamble
#@TestResult Success if the corresponding change for entry X
can be found in every changelog before the purge
delay expires but not any more on server A's
after the delay expires (entry Y will still be
there though since the last change is always kept)
-->
<function name="replication_changelog_006" scope="local">
<testcase name="getTestCaseName('Changelog Purge')">
<sequence>
<try>
<sequence>
<call function="'testCase_Preamble'"/>
<message>
'Test Name = %s' % STAXCurrentTestcase
</message>
<call function="'testStep'">
{ 'stepMessage' : '%s Check replication changelog is purged after purge delay period expires].' % msg1 }
</call>
<script>
if globalSplitServers:
masterReplServer = _topologyReplServerList[0]
else:
masterReplServer = master
masterReplServerHost = masterReplServer.getHostname()
masterReplServerPath = '%s/%s' % \
(masterReplServer.getDir(), OPENDSNAME)
</script>
<message>
'Set purge delay to 20 seconds on server %s:%s' \
% (masterReplServerHost, masterReplServer.getPort())
</message>
<!-- Set purge delay to 20s on "master" server -->
<call function="'dsconfigSet'">
{ 'location' : masterReplServerHost,
'dsPath' : masterReplServerPath,
'dsInstanceHost' : masterReplServerHost,
'dsInstanceAdminPort' : masterReplServer.getAdminPort(),
'dsInstanceDn' : masterReplServer.getRootDn(),
'dsInstancePswd' : masterReplServer.getRootPwd(),
'objectName' : 'replication-server' ,
'propertyType' : 'provider',
'propertyName' : 'Multimaster Synchronization',
'attributeName' : 'replication-purge-delay' ,
'attributeValue' : '20s'
}
</call>
<!-- Add entry X to "master" server -->
<script>
userDnX = 'uid=iabizen.X, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.X')
listAttr.append('sn:Abizen.X')
listAttr.append('cn:Izen Abizen.X')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnX,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<!-- Add entry Y to "master" server -->
<script>
userDnY = 'uid=iabizen.Y, ou=People, %s' % synchroSuffix
listAttr = []
listAttr.append('objectclass:top')
listAttr.append('objectclass:organizationalperson')
listAttr.append('objectclass:inetorgperson')
listAttr.append('objectclass:person')
listAttr.append('givenname:Izen.Y')
listAttr.append('sn:Abizen.Y')
listAttr.append('cn:Izen Abizen.Y')
</script>
<call function="'addAnEntry'">
{ 'location' : masterHost,
'dsPath' : masterPath,
'dsInstanceHost' : masterHost,
'dsInstancePort' : master.getPort(),
'dsInstanceDn' : master.getRootDn(),
'dsInstancePswd' : master.getRootPwd(),
'DNToAdd' : userDnY,
'listAttributes' : listAttr,
'expectedRC' : 0
}
</call>
<if expr="not is_windows_platform(STAF_REMOTE_HOSTNAME)">
<!-- Unix -->
<script>
sleepTime = 2000
</script>
<else>
<!-- Windows -->
<script>
sleepTime = 6000
</script>
</else>
</if>
<!-- Let some time for the change to propagate -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : sleepTime }
</call>
<!-- Search changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<call function="'ldapSearchWithScript'">
{
'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges' ,
'dsFilter' : 'uid=iabizen.X',
'dsAttributes' : 'dn'
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
</script>
<!-- expect entry returned => len(searchResult) > 0
=====> resultLength = 1 -->
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : 1
}
</call>
</sequence>
</paralleliterate>
<!-- Let the purge delay expire: sleep for 60s -->
<call function="'Sleep'">
{ 'sleepForMilliSeconds' : 60000 }
</call>
<!-- Search changelog in the various replication servers -->
<paralleliterate var="server"
in="_topologyServerList"
indexvar="i">
<sequence>
<script>
if globalSplitServers:
replServer = _topologyReplServerList[i]
else:
replServer = server
replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
</script>
<call function="'ldapSearchWithScript'">
{
'location' : replServer.getHostname(),
'dsPath' : replServerPath,
'dsInstanceHost' : replServer.getHostname(),
'dsInstancePort' : replServer.getPort(),
'dsInstanceDn' : replServer.getRootDn(),
'dsInstancePswd' : replServer.getRootPwd(),
'dsBaseDN' : 'dc=replicationChanges',
'dsFilter' : 'uid=iabizen.X',
'dsAttributes' : 'dn',
'expectedRC' : 0
}
</call>
<script>
searchRC = STAXResult[0][0]
searchResult = STAXResult[0][1]
resultLength = len(searchResult) > 0
if i == 0:
# index [0] corresponds to "master" repl server
# => purge delay expired => changelog purged
# => expect NO entry returned
# => len(searchResult) = 0 => resultLength = 0
myExpectedRC = 0
else:
# purge delay not expired (default purge delay: 1 day)
# => expect entry returned
# => len(searchResult) > 0 => resultLength = 1
myExpectedRC = 1
</script>
<call function="'checktestRC'">
{ 'returncode' : resultLength ,
'result' : searchResult ,
'expected' : myExpectedRC
}
</call>
</sequence>
</paralleliterate>
<!-- Verify the synchronization of the trees among the servers in
the topology -->
<call function="'verifyTrees'">
[ clientHost, clientPath, master, consumerList, synchroSuffix ]
</call>
</sequence>
<catch exception="'STAXException'" typevar="eType" var="eInfo">
<message log="1" level="'fatal'">
'%s: Test failed. eInfo(%s)' % (eType,eInfo)
</message>
</catch>
<finally>
<sequence>
<call function="'testCase_Postamble'"/>
</sequence>
</finally>
</try>
</sequence>
</testcase>
</function>
</stax>