refactor replication functional tests to be one test per function
11 files added
11 files modified
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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 2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_aci"/> |
| | | |
| | | <function name="replication_aci"> |
| | | |
| | | <function name="replication_aci" scope="local"> |
| | | <sequence> |
| | | <block name="'replication_aci'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'aci' |
| | | |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication ACI' |
| | | </script> |
| | | |
| | | <block name="'aci'"> |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication ACI Tests |
| | | #@TestSuitePurpose Verify that the ACI operations are replicated |
| | | correctly between two servers. |
| | | #@TestSuiteID ACI Tests |
| | | #@TestSuiteGroup ACI |
| | | #@TestGroup Replication |
| | | #@TestScript replication_aci.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <sequence> |
| | | |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='aci' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication ACI Tests |
| | | #@TestSuitePurpose Verify that updates on ACIs are replicated all |
| | | right and are applied accordingly across the |
| | | topology. |
| | | #@TestSuiteID ACI Tests |
| | | #@TestSuiteGroup ACI |
| | | #@TestGroup Replication |
| | | #@TestScript replication_aci.xml |
| | | #@TestHTMLLink http://opends.dev.java.net/ |
| | | --> |
| | | |
| | | <try> |
| | | <sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'dataFile' : 'Short_Example.ldif' , |
| | | 'label' : 'Replication ACI' } |
| | | </call> |
| | | |
| | | <script> |
| | | class Entry: |
| | | def __init__(self, rdn, suffix): |
| | | self.userDn = '%s,ou=People,%s' \ |
| | | % (rdn, suffix) |
| | | self.suffix = suffix |
| | | 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 getSuffix(self): |
| | | return self.suffix |
| | | def getAttrList(self): |
| | | return self.listAttr |
| | | def addAttr(self, attrType, attrValue): |
| | | self.listAttr.append('%s:%s' % (attrType, attrValue)) |
| | | </script> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'dataFile' : 'Short_Example.ldif' , |
| | | 'label' : _label } |
| | | </call> |
| | | |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('aci/aci_tests') |
| | | </script> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Add entry with ACI |
| | | #@TestID Add entry with ACI |
| | | #@TestPurpose Check ACI replication over an entry add |
| | | #@TestPreamble |
| | | #@TestSteps Add entry with ACI: deny self description write |
| | | #@TestSteps Binding as entry, add givenname to entry |
| | | (expect SUCCESS) |
| | | #@TestSteps Binding as entry, add description to entry |
| | | (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Add entry with ACI')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Add entry with ACI. Check ACI replication \ |
| | | over an entry add.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)" |
| | | myUserpassword = 'entryPwd' |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | myEntry = Entry('cn=ACI entry', synchroSuffix) |
| | | myEntry.addAttr('sn', 'ACI repl tests') |
| | | myEntry.addAttr('aci', myAci) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | </script> |
| | | |
| | | <!-- Add entry to "master" server with aci: |
| | | ! (targetattr="description")(version 3.0; acl |
| | | ! "Deny Self Description Write"; deny (write) |
| | | ! userdn="ldap:///self";) |
| | | --> |
| | | <message> |
| | | 'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci) |
| | | </message> |
| | | <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> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny "%s" the access to write its own \ |
| | | description attribute.' % myEntry.getDn() |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: ACI:' |
| | | class Entry: |
| | | def __init__(self, rdn, suffix): |
| | | self.userDn = '%s,ou=People,%s' \ |
| | | % (rdn, suffix) |
| | | self.suffix = suffix |
| | | 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 getSuffix(self): |
| | | return self.suffix |
| | | def getAttrList(self): |
| | | return self.listAttr |
| | | def addAttr(self, attrType, attrValue): |
| | | self.listAttr.append('%s:%s' % (attrType, attrValue)) |
| | | </script> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_aci_001') |
| | | testsList.append('replication_aci_002') |
| | | testsList.append('replication_aci_003') |
| | | testsList.append('replication_aci_004') |
| | | testsList.append('replication_aci_005') |
| | | testsList.append('replication_aci_006') |
| | | testsList.append('replication_aci_007') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | </sequence> |
| | | |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myGivenname = 'My own GIVENNAME value %s' % i |
| | | myDescription = 'My own DESCRIPTION value %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add givenname %s to entry %s on server \ |
| | | %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myGivenname, myEntry.getDn(), |
| | | server.getHostname(), server.getPort()) |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'givenname', |
| | | 'newAttributeValue' : myGivenname, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myDescription, myEntry.getDn(), |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | <rethrow/> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | </try> |
| | | |
| | | </sequence> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Modify_add ACI |
| | | #@TestID Modify_add ACI |
| | | #@TestPurpose Check ACI replication over a modify_add |
| | | #@TestPreamble Add a user entry to suffix |
| | | #@TestSteps Binding as user, add description to child entry |
| | | (expect ERROR 50) |
| | | #@TestSteps Add ACI to parent entry: allow user full access |
| | | to all description attributes |
| | | #@TestSteps Binding as user, add description to child entry |
| | | (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_add ACI')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Modify_add ACI. Check ACI replication \ |
| | | over a modify_add.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | mySn = 'ACI repl user' |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | myEntry.addAttr('sn', mySn) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | </script> |
| | | |
| | | <!-- Add user entry to "master" server --> |
| | | <message> |
| | | 'Add user entry %s' % myEntry.getDn() |
| | | </message> |
| | | <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> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myDescription = 'He was a serious opium adict - %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myDescription, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : _label } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Add aci to entry ou=People,o=example on "master" server: |
| | | ! (targetattr="description")(version 3.0; acl |
| | | ! "Allow ACI-user access to description"; allow (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nAllow "%s" full access to all description \ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myDescription = 'He was a serious opium adict - %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myDescription, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI target |
| | | #@TestID Modify_replace ACI target |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI target |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, add telephonenumber to child |
| | | entry (expect ERROR 50) |
| | | #@TestSteps Replace ACI on parent entry: allow user full |
| | | access to all telephonenumber attributes |
| | | #@TestSteps Binding as user, add telephonenumber to child |
| | | entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_replace ACI target')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI target. Check ACI \ |
| | | replication over a modify_replace of the ACI target.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myTelephonenumber = '221-221-221-%s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add telephonenumber %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'telephonenumber', |
| | | 'newAttributeValue' : myTelephonenumber, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Allow ACI-user access to telephonenumber"; allow (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myTelephonenumber = '221-221-221-%s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'telephonenumber', |
| | | 'newAttributeValue' : myTelephonenumber, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI permission |
| | | #@TestID Modify_replace ACI permission |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI permission |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect SUCCESS) |
| | | #@TestSteps Replace ACI on parent entry: deny user access to |
| | | telephonenumber attributes |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_replace ACI permission')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI permission. Check ACI \ |
| | | replication over a modify_replace of the ACI permission.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI-user access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny "%s" access to all telephonenumber \ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI bind rule |
| | | #@TestID Modify_replace ACI bind rule |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI bind rule |
| | | #@TestPreamble Add new user entry |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect SUCCESS) |
| | | #@TestSteps Replace ACI on parent entry: deny users with |
| | | a given sn access to telephonenumber attributes |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_replace ACI bind rule')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI bind rule. Check ACI \ |
| | | replication over a modify_replace of the ACI bind rule.' |
| | | </message> |
| | | |
| | | <script> |
| | | mySn = 'ACI repl user' |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'secondUserPwd' |
| | | |
| | | myEntry = Entry('cn=Second ACI user', synchroSuffix) |
| | | myEntry.addAttr('sn', mySn) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <!-- Add user entry to "master" server --> |
| | | <message> |
| | | 'Add user entry %s' % myEntry.getDn() |
| | | </message> |
| | | <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> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI repl users access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny users with (sn=%s) access to all \ |
| | | telephonenumber attributes under ou=People,%s.' % \ |
| | | (mySn, synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Bypass-acl privilege |
| | | #@TestID Bypass-acl privilege |
| | | #@TestPurpose Check the bypass-acl privilege is replicated and |
| | | successfully applied over the topology |
| | | #@TestPreamble |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect ERROR 50) |
| | | #@TestSteps Add ds-privilege-name:bypass-acl to new user |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Bypass-acl privilege')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \ |
| | | privilege is replicated and successfully applied over the \ |
| | | topology' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'secondUserPwd' |
| | | myPrivilege = 'bypass-acl' |
| | | |
| | | myEntry = Entry('cn=Second ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Add bypass-acl privilege to new user entry --> |
| | | <message> |
| | | 'Add %s privilege to entry %s: \n' % \ |
| | | (myPrivilege, myEntry.getDn()) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'ds-privilege-name', |
| | | 'newAttributeValue' : myPrivilege, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ Active ACI +++\nDeny users with (sn=%s) access to all \ |
| | | telephonenumber attributes under ou=People,%s.' % \ |
| | | (mySn, synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Modify_delete ACI |
| | | #@TestID Modify_delete ACI |
| | | #@TestPurpose Check ACI replication over a modify_delete |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect ERROR 50) |
| | | #@TestSteps Delete ACI on parent entry |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <testcase name="getTestCaseName('Modify_delete ACI')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: ACI: Modify_delete ACI. Check ACI \ |
| | | replication over a modify_delete.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Delete aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI repl users access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";) |
| | | --> |
| | | <message> |
| | | 'Delete ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" > |
| | | { 'label' : 'Replication ACI' } |
| | | </call> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | |
| | | </sequence> |
| | | |
| | | </finally> |
| | | |
| | | </try> |
| | | </block> |
| | | |
| | | </sequence> |
| | | |
| | | </function> |
| | | |
| | | </stax> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication ACI Tests |
| | | #@TestName Replication: ACI: Add entry with ACI |
| | | #@TestID Add entry with ACI |
| | | #@TestPurpose Check ACI replication over an entry add |
| | | #@TestPreamble |
| | | #@TestSteps Add entry with ACI: deny self description write |
| | | #@TestSteps Binding as entry, add givenname to entry |
| | | (expect SUCCESS) |
| | | #@TestSteps Binding as entry, add description to entry |
| | | (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_001" scope="local"> |
| | | <testcase name="getTestCaseName('Add entry with ACI')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Add entry with ACI. Check ACI replication \ |
| | | over an entry add.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)" |
| | | myUserpassword = 'entryPwd' |
| | | |
| | | myEntry = Entry('cn=ACI entry', synchroSuffix) |
| | | myEntry.addAttr('sn', 'ACI repl tests') |
| | | myEntry.addAttr('aci', myAci) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | </script> |
| | | |
| | | <!-- Add entry to "master" server with aci: |
| | | ! (targetattr="description")(version 3.0; acl |
| | | ! "Deny Self Description Write"; deny (write) |
| | | ! userdn="ldap:///self";) |
| | | --> |
| | | <message> |
| | | 'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci) |
| | | </message> |
| | | <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> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny "%s" the access to write its own \ |
| | | description attribute.' % myEntry.getDn() |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myGivenname = 'My own GIVENNAME value %s' % i |
| | | myDescription = 'My own DESCRIPTION value %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add givenname %s to entry %s on server \ |
| | | %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myGivenname, myEntry.getDn(), |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'givenname', |
| | | 'newAttributeValue' : myGivenname, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myDescription, myEntry.getDn(), |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Modify_add ACI |
| | | #@TestID Modify_add ACI |
| | | #@TestPurpose Check ACI replication over a modify_add |
| | | #@TestPreamble Add a user entry to suffix |
| | | #@TestSteps Binding as user, add description to child entry |
| | | (expect ERROR 50) |
| | | #@TestSteps Add ACI to parent entry: allow user full access |
| | | to all description attributes |
| | | #@TestSteps Binding as user, add description to child entry |
| | | (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_002" scope="local"> |
| | | <testcase name="getTestCaseName('Modify_add ACI')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Modify_add ACI. Check ACI replication \ |
| | | over a modify_add.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | mySn = 'ACI repl user' |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | myEntry.addAttr('sn', mySn) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | </script> |
| | | |
| | | <!-- Add user entry to "master" server --> |
| | | <message> |
| | | 'Add user entry %s' % myEntry.getDn() |
| | | </message> |
| | | <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> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myDescription = 'He was a serious opium adict - %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myDescription, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Add aci to entry ou=People,o=example on "master" server: |
| | | ! (targetattr="description")(version 3.0; acl |
| | | ! "Allow ACI-user access to description"; allow (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nAllow "%s" full access to all description \ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myDescription = 'He was a serious opium adict - %s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myDescription, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : myDescription, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI target |
| | | #@TestID Modify_replace ACI target |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI target |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, add telephonenumber to child |
| | | entry (expect ERROR 50) |
| | | #@TestSteps Replace ACI on parent entry: allow user full |
| | | access to all telephonenumber attributes |
| | | #@TestSteps Binding as user, add telephonenumber to child |
| | | entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_003" scope="local"> |
| | | <testcase name="getTestCaseName('Modify_replace ACI target')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI target. Check ACI \ |
| | | replication over a modify_replace of the ACI target.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myTelephonenumber = '221-221-221-%s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add telephonenumber %s to entry %s on \ |
| | | server %s:%s. -- Expect: ERROR 50 (Insufficient Access \ |
| | | Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'telephonenumber', |
| | | 'newAttributeValue' : myTelephonenumber, |
| | | 'changetype' : 'add', |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Allow ACI-user access to telephonenumber"; allow (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | |
| | | myTelephonenumber = '221-221-221-%s' % i |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", add description %s to entry %s on \ |
| | | server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'DNToModify' : myTargetEntryDn, |
| | | 'attributeName' : 'telephonenumber', |
| | | 'newAttributeValue' : myTelephonenumber, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI permission |
| | | #@TestID Modify_replace ACI permission |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI permission |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect SUCCESS) |
| | | #@TestSteps Replace ACI on parent entry: deny user access to |
| | | telephonenumber attributes |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_004" scope="local"> |
| | | <testcase name="getTestCaseName('Modify_replace ACI permission')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI permission. Check ACI \ |
| | | replication over a modify_replace of the ACI permission.' |
| | | </message> |
| | | |
| | | <script> |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI-user access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///cn=ACI user,ou=People,o=example";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny "%s" access to all telephonenumber \ |
| | | attributes under ou=People,%s.' % \ |
| | | (myEntry.getDn(), synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Modify_replace ACI bind rule |
| | | #@TestID Modify_replace ACI bind rule |
| | | #@TestPurpose Check ACI replication over a modify_replace of |
| | | the ACI bind rule |
| | | #@TestPreamble Add new user entry |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect SUCCESS) |
| | | #@TestSteps Replace ACI on parent entry: deny users with |
| | | a given sn access to telephonenumber attributes |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect ERROR 50) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_005" scope="local"> |
| | | <testcase name="getTestCaseName('Modify_replace ACI bind rule')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Modify_replace ACI bind rule. Check ACI \ |
| | | replication over a modify_replace of the ACI bind rule.' |
| | | </message> |
| | | |
| | | <script> |
| | | mySn = 'ACI repl user' |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'secondUserPwd' |
| | | |
| | | myEntry = Entry('cn=Second ACI user', synchroSuffix) |
| | | myEntry.addAttr('sn', mySn) |
| | | myEntry.addAttr('userpassword', myUserpassword) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <!-- Add user entry to "master" server --> |
| | | <message> |
| | | 'Add user entry %s' % myEntry.getDn() |
| | | </message> |
| | | <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> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Replace aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI repl users access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";) |
| | | --> |
| | | <message> |
| | | 'Replace ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nDeny users with (sn=%s) access to all \ |
| | | telephonenumber attributes under ou=People,%s.' % \ |
| | | (mySn, synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Bypass-acl privilege |
| | | #@TestID Bypass-acl privilege |
| | | #@TestPurpose Check the bypass-acl privilege is replicated and |
| | | successfully applied over the topology |
| | | #@TestPreamble |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect ERROR 50) |
| | | #@TestSteps Add ds-privilege-name:bypass-acl to new user |
| | | #@TestSteps Binding as new user, compare telephonenumber |
| | | value to child entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_006" scope="local"> |
| | | <testcase name="getTestCaseName('Bypass-acl privilege')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \ |
| | | privilege is replicated and successfully applied over the \ |
| | | topology' |
| | | </message> |
| | | |
| | | <script> |
| | | mySn = 'ACI repl user' |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'secondUserPwd' |
| | | myPrivilege = 'bypass-acl' |
| | | |
| | | myEntry = Entry('cn=Second ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Add bypass-acl privilege to new user entry --> |
| | | <message> |
| | | 'Add %s privilege to entry %s: \n' % \ |
| | | (myPrivilege, myEntry.getDn()) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'ds-privilege-name', |
| | | 'newAttributeValue' : myPrivilege, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ Active ACI +++\nDeny users with (sn=%s) access to all \ |
| | | telephonenumber attributes under ou=People,%s.' % \ |
| | | (mySn, synchroSuffix) |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 ACI Tests |
| | | #@TestName Replication: ACI: Modify_delete ACI |
| | | #@TestID Modify_delete ACI |
| | | #@TestPurpose Check ACI replication over a modify_delete |
| | | #@TestPreamble |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect ERROR 50) |
| | | #@TestSteps Delete ACI on parent entry |
| | | #@TestSteps Binding as user, compare telephonenumber value |
| | | to child entry (expect SUCCESS) |
| | | #@TestPostamble |
| | | #@TestResult Success if the servers synchronised and the aci |
| | | correctly applied after replication |
| | | --> |
| | | <function name="replication_aci_007" scope="local"> |
| | | <testcase name="getTestCaseName('Modify_delete ACI')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: ACI: Modify_delete ACI. Check ACI \ |
| | | replication over a modify_delete.' |
| | | </message> |
| | | |
| | | <script> |
| | | mySn = 'ACI repl user' |
| | | myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn) |
| | | myUserpassword = 'userPwd' |
| | | |
| | | myEntry = Entry('cn=ACI user', synchroSuffix) |
| | | |
| | | myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix |
| | | myTelephonenumber = '+1 408 555 6789' |
| | | </script> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: ERROR 50 \ |
| | | (Insufficient Access Rights)' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 50 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Delete aci on entry ou=People,o=example on "master" server: |
| | | ! (targetattr="telephonenumber")(version 3.0; acl |
| | | ! "Deny ACI repl users access to telephonenumber"; deny (all) |
| | | ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";) |
| | | --> |
| | | <message> |
| | | 'Delete ACI on entry ou=People,%s: \n%s' % \ |
| | | (synchroSuffix, myAci) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'ou=People,%s' % synchroSuffix, |
| | | 'attributeName' : 'aci', |
| | | 'newAttributeValue' : myAci, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | </script> |
| | | |
| | | <message> |
| | | 'Binding as "%s", compare telephonenumber:%s value to \ |
| | | entry %s on server %s:%s. -- Expect: SUCCESS' % \ |
| | | (myEntry.getDn(), myTelephonenumber, myTargetEntryDn, |
| | | server.getHostname(), server.getPort()) |
| | | </message> |
| | | |
| | | <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry |
| | | ! uid=sholmes,ou=People,o=example --> |
| | | <call function="'ldapCompareWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : myEntry.getDn(), |
| | | 'dsInstancePswd' : myUserpassword, |
| | | 'dsDn' : ['telephonenumber:%s' % \ |
| | | myTelephonenumber, myTargetEntryDn], |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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> |
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_basic"/> |
| | | |
| | | <function name="replication_basic"> |
| | | |
| | | <function name="replication_basic" scope="local"> |
| | | <sequence> |
| | | <block name="'replication_basic'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'basic' |
| | | |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication Basic' |
| | | </script> |
| | | |
| | | <block name="'basic'"> |
| | | |
| | | <sequence> |
| | | |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Basic Tests |
| | | #@TestSuitePurpose Verify that the basic operations are replicated |
| | | correctly between two serrvers. |
| | | #@TestSuiteID Basic Tests |
| | | #@TestSuiteGroup Basic |
| | | #@TestGroup Replication |
| | | #@TestScript replication_basic.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'" > |
| | | { 'label' : 'Replication Basic' } |
| | | </call> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/basic/replication_basic_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_basic_setup'" /> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Add Entry |
| | | #@TestID Add Entry |
| | | #@TestPurpose Check that an entry add is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add root suffix entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Add Entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Add Entry. Check that an added entry is \ |
| | | well propagated by replication.' |
| | | </message> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry |
| | | #@TestID Modify Entry |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add entry on server |
| | | #@TestSteps Modify entry |
| | | #@TestSteps Check modify worked on server |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Modify Entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry. Check that an entry modify \ |
| | | is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication_add_single.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/replication_mod.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn, |
| | | 'dsFilter' : '%s=%s' % (attr_type,attr_value) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Delete Entry |
| | | #@TestID Delete Entry |
| | | #@TestPurpose Check that an entry delete is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete entry |
| | | #@TestSteps Check delete worked on server |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Delete Entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Delete Entry. Check that an entry delete \ |
| | | is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn, |
| | | '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> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Add Multiple Entries |
| | | #@TestID Add Multiple Entries |
| | | #@TestPurpose Check that a multiple-entry add is well |
| | | propagated by replication. |
| | | #@TestPreamble Delete root suffix entry |
| | | #@TestSteps Add multiple entries |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Add Multiple Entries')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Add Multiple Entries. Check that a \ |
| | | multiple-entry add is well propagated by replication.' |
| | | </message> |
| | | |
| | | <!-- Delete the root entry, as it is already present in |
| | | Example.ldif file --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/Example.ldif' \ |
| | | % master.getDataDir() |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | attribute |
| | | #@TestID Modify Entry - add single attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add description attribute to entry |
| | | #@TestSteps Check modify worked |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - add single attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - add single attribute. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : ' ', |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'description=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | value |
| | | #@TestID Modify Entry - add single value |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add single-valued attribute to entry |
| | | #@TestSteps Check modify worked |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Modify Entry - add single value')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - add single value. Check \ |
| | | that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'departmentnumber', |
| | | 'newAttributeValue' : '5203214400', |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'departmentnumber=5203214400' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | attribute |
| | | #@TestID Modify Entry - delete single attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete attribute in entry |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete single attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - delete single attribute. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=smason, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'roomNumber' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'roomNumber=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | value |
| | | #@TestID Modify Entry - delete single value |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete single attribute value in entry |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete single value')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - delete single value. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwalker, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'roomNumber', |
| | | 'newAttributeValue' : '3915', |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwalker, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'roomNumber=3915' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add multiple |
| | | values |
| | | #@TestID Modify Entry - add multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add multiple-valued attribute to entry |
| | | #@TestSteps Check add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if add worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - add multiple values')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - add multiple values. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | valuesToAdd = [] |
| | | valuesToAdd.append('postaladdress:Residence Parc Europe') |
| | | valuesToAdd.append('postaladdress:Appartement #6') |
| | | valuesToAdd.append('postaladdress:31 Rue General Mangin') |
| | | valuesToAdd.append('postaladdress:38100 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToAdd, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Residence Parc Europe)' |
| | | filter2 = '(postaladdress=Appartement #6)' |
| | | filter3 = '(postaladdress=31 Rue General Mangin)' |
| | | filter4 = '(postaladdress=38100 Grenoble)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '&%s%s%s%s' \ |
| | | % (filter1, filter2, filter3, filter4) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete |
| | | multiple values |
| | | #@TestID Modify Entry - delete multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete multiple values in same attribute |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete multiple values')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - delete multiple values. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | valuesToDelete = [] |
| | | valuesToDelete.append('postaladdress:Appartement #6') |
| | | valuesToDelete.append('postaladdress:38100 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToDelete, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Appartement #6)' |
| | | filter2 = '(postaladdress=38100 Grenoble)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '|%s%s' % (filter1, filter2) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | multiple values |
| | | #@TestID Modify Entry - replace multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Replace multiple values in same attribute |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - replace multiple values')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - replace multiple values. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | valuesToReplace = [] |
| | | valuesToReplace.append('postaladdress: Residence Letilleuil') |
| | | valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToReplace, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Residence Letilleuil)' |
| | | filter2 = '(postaladdress=18 rue Nicolas Chorier)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '&%s%s' % (filter1, filter2) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | value to multiple valued attribute |
| | | #@TestID Modify Entry - add single value to multiple |
| | | valued attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add single value to multiple-valued attribute |
| | | #@TestSteps Check value add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if value add worked and trees |
| | | synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - add single value to multiple valued attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - add single value to \ |
| | | multiple valued attribute. Check that an entry modify is well \ |
| | | propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | valuesToAdd = [] |
| | | valuesToAdd.append('postaladdress:38000 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToAdd, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'postaladdress=38000 Grenoble' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | value from multiple valued attribute |
| | | #@TestID Modify Entry - delete single value from multiple |
| | | valued attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete single value from multiple-valued |
| | | attribute |
| | | #@TestSteps Check value delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if value delete worked and trees |
| | | synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete single value from multiple valued attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - delete single value from \ |
| | | multiple valued attribute. Check that an entry modify is well \ |
| | | propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | valuesToDelete = [] |
| | | valuesToDelete.append('postaladdress: Residence Letilleuil') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToDelete, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'postaladdress=Residence Letilleuil' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace case |
| | | sensitive attribute |
| | | #@TestID Modify Entry - replace case sensitive attribute |
| | | #@TestPurpose Check that case sensitive attribute |
| | | modifications are replicated. |
| | | #@TestPreamble |
| | | #@TestSteps Add entry |
| | | #@TestSteps Replace description attribute in entry |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - replace case sensitive attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - replace case sensitive \ |
| | | attribute. Check that case sensitive attribute modifications \ |
| | | are replicated.' |
| | | </message> |
| | | |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % master.getDataDir() |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | value = 'Profession Tap Fitter and Plumber' |
| | | valuesToReplace = [] |
| | | valuesToReplace.append('description: %s' % value) |
| | | </script> |
| | | |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tfitter, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToReplace, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter = 'description=%s' % value |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=tfitter, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : filter |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | userpassword |
| | | #@TestID Modify Entry - replace userpassword |
| | | #@TestPurpose Check replaced userpasswords are replicated. |
| | | #@TestPreamble |
| | | #@TestSteps Add user entry on server A |
| | | #@TestSteps Bind as user with userpassword to server A |
| | | #@TestSteps Replace user's userpassword |
| | | #@TestSteps Bind as user with old userpassword to server B |
| | | #@TestSteps Bind as user with new userpassword to server B |
| | | #@TestPostamble |
| | | #@TestResult Success if bind with old userpassword fails with |
| | | LDAP_INVALID_CREDENTIALS error and bind with new |
| | | user password suceeds and trees are synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - replace userpassword')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - replace userpassword. \ |
| | | Check replaced userpasswords are replicated.' |
| | | </message> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <script> |
| | | userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix |
| | | oldPassword = 'jajejijoju' |
| | | newPassword = 'JUAJUAJUA' |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Basic Tests |
| | | #@TestSuitePurpose Verify that the basic operations are replicated |
| | | correctly between two serrvers. |
| | | #@TestSuiteID Basic Tests |
| | | #@TestSuiteGroup Basic |
| | | #@TestGroup Replication |
| | | #@TestScript replication_basic.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Professor') |
| | | listAttr.append('sn:Moriarty') |
| | | listAttr.append('cn:Professor Moriarty') |
| | | listAttr.append('l:London') |
| | | listAttr.append('userpassword:%s' % oldPassword) |
| | | </script> |
| | | <message> |
| | | 'replace userpassword: add user entry %s' % userDn |
| | | </message> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check userDn can bind with oldPassword on "master" server --> |
| | | <message> |
| | | 'replace userpassword: bind on master using password %s' \ |
| | | % oldPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : oldPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!-- Replace userDn's oldPassword with newPassword on "master" |
| | | server --> |
| | | <message> |
| | | 'replace userpassword: replace user password %s with %s' \ |
| | | % (oldPassword, newPassword) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : userDn, |
| | | 'attributeName' : 'userpassword', |
| | | 'newAttributeValue' : 'JUAJUAJUA', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | consumer = consumerList[0] |
| | | </script> |
| | | <!-- Try binding as userDn with oldPassword on "consumer" server: |
| | | ==> should fail with LDAP_INVALID_CREDENTIALS (49) error --> |
| | | <message> |
| | | 'replace userpassword: bind on consumer using old password %s :\ |
| | | should fail with error LDAP_INVALID_CREDENTIALS (49)' \ |
| | | % oldPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : oldPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 49 |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check userDn can bind with newPassword on "consumer" |
| | | server --> |
| | | <message> |
| | | 'replace userpassword: bind on consumer using new password %s :\ |
| | | should pass' % newPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : newPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Delete added entry as clean-up measure --> |
| | | <message> |
| | | 'replace userpassword: delete user entry %s on master' \ |
| | | % userDn |
| | | </message> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : userDn |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add binary |
| | | attribute |
| | | #@TestID Modify Entry - add binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add jpegPhoto attribute to entry with binary |
| | | value |
| | | #@TestSteps Check add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if add worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - add binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - add binary attribute. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_add_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo1.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'add' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | binary attribute |
| | | #@TestID Modify Entry - replace binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Replace jpegPhoto (binary) attribute value |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - replace binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - replace binary attribute. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_replace_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo2.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'replace' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete binary |
| | | attribute |
| | | #@TestID Modify Entry - delete binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete binary attribute jpegPhoto |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Modify Entry - delete binary attribute. \ |
| | | Check that an entry modify is well propagated by replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'jpegPhoto' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Rename Entry |
| | | #@TestID Rename Entry |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename entry |
| | | #@TestSteps Check old dn entry no longer exists |
| | | #@TestSteps Check new dn entry exists |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Rename Entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Rename Entry. Check that a rename \ |
| | | (modrdn) operation is well propagated by replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=kvaughan2' |
| | | newsuperior = None |
| | | deleteoldrdn = 1 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry |
| | | "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Rename Entry (preserving old |
| | | rdn) |
| | | #@TestID Rename Entry (preserving old rdn) |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename entry |
| | | #@TestSteps Check old dn entry no longer exists |
| | | #@TestSteps Check new dn entry exists and contains old rdn |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Rename Entry (preserving old rdn). \ |
| | | Check that a rename (modrdn) operation is well propagated by \ |
| | | replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn_preserve.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=jwallace, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=igueye' |
| | | newsuperior = None |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry |
| | | "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'uid=jwallace' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Rename Subtree |
| | | #@TestID Rename Subtree |
| | | #@TestPurpose Check that a subtree rename (moddn) operation is |
| | | well propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename subtree |
| | | #@TestSteps Check old subtree no longer exists |
| | | #@TestSteps Check new subree exists |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Rename Subtree')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Rename Subtree. Check that a subtree \ |
| | | rename (moddn) operation is well propagated by replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_moddn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'ou=People,%s' % synchroSuffix |
| | | newrdn = 'ou=Special People' |
| | | newsuperior = 'ou=Special Users,%s' % synchroSuffix |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \ |
| | | % synchroSuffix |
| | | </script> |
| | | <!-- check that new entry |
| | | "uid=gfarmer, ou=Special People, ou=Special Users, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : base, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Add entry after restart |
| | | #@TestID Add entry after restart |
| | | #@TestPurpose Check entry add over secured replication after |
| | | server restart |
| | | #@TestPreamble |
| | | #@TestSteps Restart servers |
| | | #@TestSteps Add entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Add entry after restart')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Basic: Add entry after restart. \ |
| | | Check entry add over secured replication after server restart' |
| | | </message> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=RESTART-iabizen-%s, %s' % \ |
| | | (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'" > |
| | | { 'label' : 'Replication Basic' } |
| | | </call> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/basic/replication_basic_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_basic_setup'" /> |
| | | |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('basic/basic_tests') |
| | | </script> |
| | | |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: Basic:' |
| | | </script> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_basic_001') |
| | | testsList.append('replication_basic_002') |
| | | testsList.append('replication_basic_003') |
| | | testsList.append('replication_basic_004') |
| | | testsList.append('replication_basic_005') |
| | | testsList.append('replication_basic_006') |
| | | testsList.append('replication_basic_007') |
| | | testsList.append('replication_basic_008') |
| | | testsList.append('replication_basic_009') |
| | | testsList.append('replication_basic_010') |
| | | testsList.append('replication_basic_011') |
| | | testsList.append('replication_basic_012') |
| | | testsList.append('replication_basic_013') |
| | | testsList.append('replication_basic_014') |
| | | testsList.append('replication_basic_015') |
| | | testsList.append('replication_basic_016') |
| | | testsList.append('replication_basic_017') |
| | | testsList.append('replication_basic_018') |
| | | testsList.append('replication_basic_019') |
| | | testsList.append('replication_basic_020') |
| | | testsList.append('replication_basic_021') |
| | | testsList.append('replication_basic_022') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | </sequence> |
| | | |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <rethrow/> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </try> |
| | | |
| | | </sequence> |
| | | |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : 'Replication Basic' } |
| | | </call> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : 'Replication Basic' } |
| | | </call> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | |
| | | </sequence> |
| | | |
| | | </finally> |
| | | |
| | | </try> |
| | | </block> |
| | | |
| | | </sequence> |
| | | |
| | | </function> |
| | | |
| | | </stax> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Basic Tests |
| | | #@TestName Replication: Basic: Add Entry |
| | | #@TestID Add Entry |
| | | #@TestPurpose Check that an entry add is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add root suffix entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <function name="replication_basic_001" scope="local"> |
| | | <testcase name="getTestCaseName('Add Entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that an add of an entry is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry |
| | | #@TestID Modify Entry |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add entry on server |
| | | #@TestSteps Modify entry |
| | | #@TestSteps Check modify worked on server |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_002" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify of an entry is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication_add_single.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/replication_mod.ldif' \ |
| | | % client.getTmpDir() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn, |
| | | 'dsFilter' : '%s=%s' % (attr_type,attr_value) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Delete Entry |
| | | #@TestID Delete Entry |
| | | #@TestPurpose Check that an entry delete is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete entry |
| | | #@TestSteps Check delete worked on server |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_003" scope="local"> |
| | | <testcase name="getTestCaseName('Delete Entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a delete of an entry is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : entryDn, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Add Multiple Entries |
| | | #@TestID Add Multiple Entries |
| | | #@TestPurpose Check that a multiple-entry add is well |
| | | propagated by replication. |
| | | #@TestPreamble Delete root suffix entry |
| | | #@TestSteps Add multiple entries |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <function name="replication_basic_004" scope="local"> |
| | | <testcase name="getTestCaseName('Add Multiple Entries')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that multiple adds of an entry are replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Delete the root entry, as it is already present in |
| | | Example.ldif file --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/Example.ldif' \ |
| | | % master.getDataDir() |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | attribute |
| | | #@TestID Modify Entry - add single attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add description attribute to entry |
| | | #@TestSteps Check modify worked |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_005" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add single attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (add single attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'description', |
| | | 'newAttributeValue' : ' ', |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'description=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | value |
| | | #@TestID Modify Entry - add single value |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add single-valued attribute to entry |
| | | #@TestSteps Check modify worked |
| | | #@TestPostamble |
| | | #@TestResult Success if modify worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_006" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add single value')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (add single value) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'departmentnumber', |
| | | 'newAttributeValue' : '5203214400', |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'departmentnumber=5203214400' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | attribute |
| | | #@TestID Modify Entry - delete single attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete attribute in entry |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_007" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete single attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (delete single attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=smason, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'roomNumber' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'roomNumber=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | value |
| | | #@TestID Modify Entry - delete single value |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete single attribute value in entry |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_008" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete single value')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (delete single value) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwalker, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'attributeName' : 'roomNumber', |
| | | 'newAttributeValue' : '3915', |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwalker, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'roomNumber=3915' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add multiple |
| | | values |
| | | #@TestID Modify Entry - add multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add multiple-valued attribute to entry |
| | | #@TestSteps Check add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if add worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_009" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add multiple values')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (add multiple values) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | valuesToAdd = [] |
| | | valuesToAdd.append('postaladdress:Residence Parc Europe') |
| | | valuesToAdd.append('postaladdress:Appartement #6') |
| | | valuesToAdd.append('postaladdress:31 Rue General Mangin') |
| | | valuesToAdd.append('postaladdress:38100 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToAdd, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Residence Parc Europe)' |
| | | filter2 = '(postaladdress=Appartement #6)' |
| | | filter3 = '(postaladdress=31 Rue General Mangin)' |
| | | filter4 = '(postaladdress=38100 Grenoble)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '&%s%s%s%s' \ |
| | | % (filter1, filter2, filter3, filter4) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete |
| | | multiple values |
| | | #@TestID Modify Entry - delete multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete multiple values in same attribute |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_010" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete multiple values')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (delete multiple values) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | valuesToDelete = [] |
| | | valuesToDelete.append('postaladdress:Appartement #6') |
| | | valuesToDelete.append('postaladdress:38100 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToDelete, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Appartement #6)' |
| | | filter2 = '(postaladdress=38100 Grenoble)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '|%s%s' % (filter1, filter2) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | multiple values |
| | | #@TestID Modify Entry - replace multiple values |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Replace multiple values in same attribute |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_011" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - replace multiple values')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (replace multiple values) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | valuesToReplace = [] |
| | | valuesToReplace.append('postaladdress: Residence Letilleuil') |
| | | valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToReplace, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter1 = '(postaladdress=Residence Letilleuil)' |
| | | filter2 = '(postaladdress=18 rue Nicolas Chorier)' |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : '&%s%s' % (filter1, filter2) |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add single |
| | | value to multiple valued attribute |
| | | #@TestID Modify Entry - add single value to multiple |
| | | valued attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add single value to multiple-valued attribute |
| | | #@TestSteps Check value add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if value add worked and trees |
| | | synchronised over the topology |
| | | --> |
| | | <function name="replication_basic_012" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add single value to multiple valued attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (add single value to multiple valued attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | valuesToAdd = [] |
| | | valuesToAdd.append('postaladdress:38000 Grenoble') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToAdd, |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'postaladdress=38000 Grenoble' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete single |
| | | value from multiple valued attribute |
| | | #@TestID Modify Entry - delete single value from multiple |
| | | valued attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete single value from multiple-valued |
| | | attribute |
| | | #@TestSteps Check value delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if value delete worked and trees |
| | | synchronised over the topology |
| | | --> |
| | | <function name="replication_basic_013" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete single value from multiple valued attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (delete single value from multiple valued attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | valuesToDelete = [] |
| | | valuesToDelete.append('postaladdress: Residence Letilleuil') |
| | | </script> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToDelete, |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'postaladdress=Residence Letilleuil' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace case |
| | | sensitive attribute |
| | | #@TestID Modify Entry - replace case sensitive attribute |
| | | #@TestPurpose Check that case sensitive attribute |
| | | modifications are replicated. |
| | | #@TestPreamble |
| | | #@TestSteps Add entry |
| | | #@TestSteps Replace description attribute in entry |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_014" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - replace case sensitive attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (replace case sensitive attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % master.getDataDir() |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | value = 'Profession Tap Fitter and Plumber' |
| | | valuesToReplace = [] |
| | | valuesToReplace.append('description: %s' % value) |
| | | </script> |
| | | |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : 'uid=tfitter, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'listAttributes' : valuesToReplace, |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | filter = 'description=%s' % value |
| | | </script> |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=tfitter, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : filter |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | userpassword |
| | | #@TestID Modify Entry - replace userpassword |
| | | #@TestPurpose Check replaced userpasswords are replicated. |
| | | #@TestPreamble |
| | | #@TestSteps Add user entry on server A |
| | | #@TestSteps Bind as user with userpassword to server A |
| | | #@TestSteps Replace user's userpassword |
| | | #@TestSteps Bind as user with old userpassword to server B |
| | | #@TestSteps Bind as user with new userpassword to server B |
| | | #@TestPostamble |
| | | #@TestResult Success if bind with old userpassword fails with |
| | | LDAP_INVALID_CREDENTIALS error and bind with new |
| | | user password suceeds and trees are synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_015" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - replace userpassword')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (replace userpassword) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <script> |
| | | userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix |
| | | oldPassword = 'jajejijoju' |
| | | newPassword = 'JUAJUAJUA' |
| | | |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Professor') |
| | | listAttr.append('sn:Moriarty') |
| | | listAttr.append('cn:Professor Moriarty') |
| | | listAttr.append('l:London') |
| | | listAttr.append('userpassword:%s' % oldPassword) |
| | | </script> |
| | | <message> |
| | | 'replace userpassword: add user entry %s' % userDn |
| | | </message> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check userDn can bind with oldPassword on "master" server --> |
| | | <message> |
| | | 'replace userpassword: bind on master using password %s' \ |
| | | % oldPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : oldPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Replace userDn's oldPassword with newPassword on "master" |
| | | server --> |
| | | <message> |
| | | 'replace userpassword: replace user password %s with %s' \ |
| | | % (oldPassword, newPassword) |
| | | </message> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'DNToModify' : userDn, |
| | | 'attributeName' : 'userpassword', |
| | | 'newAttributeValue' : 'JUAJUAJUA', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | consumer = consumerList[0] |
| | | </script> |
| | | <!-- Try binding as userDn with oldPassword on "consumer" server: |
| | | ==> should fail with LDAP_INVALID_CREDENTIALS (49) error --> |
| | | <message> |
| | | 'replace userpassword: bind on consumer using old password %s :\ |
| | | should fail with error LDAP_INVALID_CREDENTIALS (49)' \ |
| | | % oldPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : oldPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 49 |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check userDn can bind with newPassword on "consumer" |
| | | server --> |
| | | <message> |
| | | 'replace userpassword: bind on consumer using new password %s :\ |
| | | should pass' % newPassword |
| | | </message> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : userDn, |
| | | 'dsInstancePswd' : newPassword, |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Delete added entry as clean-up measure --> |
| | | <message> |
| | | 'replace userpassword: delete user entry %s on master' \ |
| | | % userDn |
| | | </message> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : userDn |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - add binary |
| | | attribute |
| | | #@TestID Modify Entry - add binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Add jpegPhoto attribute to entry with binary |
| | | value |
| | | #@TestSteps Check add worked |
| | | #@TestPostamble |
| | | #@TestResult Success if add worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_016" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (add binary attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_add_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo1.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'add' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - replace |
| | | binary attribute |
| | | #@TestID Modify Entry - replace binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Replace jpegPhoto (binary) attribute value |
| | | #@TestSteps Check replace worked |
| | | #@TestPostamble |
| | | #@TestResult Success if replace worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_017" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - replace binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (replace binary attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_replace_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo2.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'replace' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Modify Entry - delete binary |
| | | attribute |
| | | #@TestID Modify Entry - delete binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated by |
| | | replication. |
| | | #@TestPreamble |
| | | #@TestSteps Delete binary attribute jpegPhoto |
| | | #@TestSteps Check delete worked |
| | | #@TestPostamble |
| | | #@TestResult Success if delete worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_018" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a modify (delete binary attribute) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'jpegPhoto' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Rename Entry |
| | | #@TestID Rename Entry |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename entry |
| | | #@TestSteps Check old dn entry no longer exists |
| | | #@TestSteps Check new dn entry exists |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_019" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a rename (modrdn) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=kvaughan2' |
| | | newsuperior = None |
| | | deleteoldrdn = 1 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry |
| | | "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Rename Entry (keep old rdn) |
| | | #@TestID Rename Entry (keep old rdn) |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename entry |
| | | #@TestSteps Check old dn entry no longer exists |
| | | #@TestSteps Check new dn entry exists and contains old rdn |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_020" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Entry - keep old rdn')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a rename (keep old rdn) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn_preserve.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=jwallace, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=igueye' |
| | | newsuperior = None |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry |
| | | "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'uid=jwallace' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength, |
| | | 'result' : searchResult, |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Rename Subtree |
| | | #@TestID Rename Subtree |
| | | #@TestPurpose Check that a subtree rename (moddn) operation is |
| | | well propagated by replication. |
| | | #@TestPreamble |
| | | #@TestSteps Rename subtree |
| | | #@TestSteps Check old subtree no longer exists |
| | | #@TestSteps Check new subree exists |
| | | #@TestPostamble |
| | | #@TestResult Success if rename worked and trees synchronised |
| | | over the topology |
| | | --> |
| | | <function name="replication_basic_021" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Subtree')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a subtree rename (moddn) is replicated.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_moddn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'ou=People,%s' % synchroSuffix |
| | | newrdn = 'ou=Special People' |
| | | newsuperior = 'ou=Special Users,%s' % synchroSuffix |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' \ |
| | | % (filename,local.temp,client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does |
| | | NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \ |
| | | % synchroSuffix |
| | | </script> |
| | | <!-- check that new entry |
| | | "uid=gfarmer, ou=Special People, ou=Special Users, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'dsBaseDN' : base, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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 Basic Tests |
| | | #@TestName Replication: Basic: Add entry after restart |
| | | #@TestID Add entry after restart |
| | | #@TestPurpose Check entry add over secured replication after |
| | | server restart |
| | | #@TestPreamble |
| | | #@TestSteps Restart servers |
| | | #@TestSteps Add entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <function name="replication_basic_022" scope="local"> |
| | | <testcase name="getTestCaseName('Add entry after restart')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=RESTART-iabizen-%s, %s' % \ |
| | | (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- 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> |
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | <defaultcall function="replication_binarycopy"/> |
| | | <function name="replication_binarycopy"> |
| | | <function name="replication_binarycopy" scope="local"> |
| | | <sequence> |
| | | <block name="'binarycopy'"> |
| | | <sequence> |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | <call function="'testSuite_Preamble'"/> |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Binary Copy Tests |
| | | #@TestSuitePurpose Verify that the servers in a replicated topology |
| | | can be initialised by the means of a binary copy |
| | | (backup-restore). |
| | | #@TestSuiteID Binary Copy Tests |
| | | #@TestSuiteGroup Binary Copy |
| | | #@TestGroup Replication |
| | | #@TestScript replication_binarycopy.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'" > |
| | | { 'label' : 'Replication Binarycopy' } |
| | | </call> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Binary Copy Tests |
| | | #@TestName Replication: Binary Copy: Off-line |
| | | initialisation |
| | | #@TestID Off-line initialisation |
| | | #@TestPurpose Initialise replicated servers using off-line |
| | | backup/restore |
| | | #@TestPreamble |
| | | #@TestSteps Call dsreplication pre-external-initialization |
| | | #@TestSteps Stop servers |
| | | #@TestSteps Import data on server A |
| | | #@TestSteps Back-up server A |
| | | #@TestSteps Restore back-up on other servers |
| | | #@TestSteps Start servers |
| | | #@TestSteps Call dsreplication post-external-initialization |
| | | #@TestSteps Add entry on server A |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronized |
| | | --> |
| | | <testcase name="getTestCaseName('Off-line initialisation')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <script> |
| | | m = md5_hash() |
| | | m.update(STAXCurrentTestcase) |
| | | </script> |
| | | <message> |
| | | 'Replication: Binary Copy: Off-line initialisation. \ |
| | | Initialise replicated servers using off-line backup/restore' |
| | | </message> |
| | | |
| | | |
| | | <!-- Pre-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy off-line: prepare servers for external \ |
| | | initialization' |
| | | </message> |
| | | <call function="'preInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'localOnly' : False, |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_topologyServerList] |
| | | </call> |
| | | <block name="'replication_binarycopy'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'binarycopy' |
| | | |
| | | <!-- Import data into "master" server --> |
| | | <message> |
| | | '+++++ binary copy off-line: import data on %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'ImportLdifWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'backEnd' : DIRECTORY_INSTANCE_BE, |
| | | 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir |
| | | } |
| | | </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_%s' \ |
| | | % (masterBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication BinaryCopy' |
| | | </script> |
| | | |
| | | <!-- Copy backup to "consumer" servers and restore it --> |
| | | <paralleliterate var="consumer" in="consumerList"> |
| | | <sequence> |
| | | <script> |
| | | consumerBackupDir = '%s' % consumer.getTmpDir() |
| | | </script> |
| | | <call function="'CopyFolderByExtension'"> |
| | | { 'location' : masterHost, |
| | | 'remotehost' : consumer.getHostname(), |
| | | 'srcfolder' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()), |
| | | 'destfolder' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()), |
| | | 'extension' : '*' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++++ binary copy off-line: restore back-up on %s:%s' \ |
| | | % (consumer.getHostname(), consumer.getPort()) |
| | | </message> |
| | | <call function="'restore'"> |
| | | { 'location' : consumer.getHostname(), |
| | | 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME), |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_topologyServerList] |
| | | </call> |
| | | |
| | | <!-- Check some data was imported into "master" server --> |
| | | <call function="'checkImport'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsHost' : masterHost, |
| | | 'dsPort' : master.getPort(), |
| | | 'dsAdminPort' : master.getAdminPort(), |
| | | 'dsDn' : master.getRootDn(), |
| | | 'dsPswd' : master.getRootPwd(), |
| | | 'expectedEntries' : ['uid=scarter,ou=People,o=example', |
| | | 'uid=dmiller, ou=People, o=example', |
| | | 'uid=rhunt, ou=People, o=example'], |
| | | 'startDS' : 'no' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Post-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy off-line: end external server initialization' |
| | | </message> |
| | | <call function="'postInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <message> |
| | | '+++++ binary copy off-line: add entry to %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % clientDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Binary Copy Tests |
| | | #@TestName Replication: Binary Copy: On-line initialisation |
| | | #@TestID On-line initialisation |
| | | #@TestPurpose Initialise replicated servers using on-line |
| | | backup/restore |
| | | #@TestPreamble |
| | | #@TestSteps Call dsreplication pre-external-initialization |
| | | #@TestSteps Import data on server A |
| | | #@TestSteps Back-up server A |
| | | #@TestSteps Restore back-up on other servers |
| | | #@TestSteps Call dsreplication post-external-initialization |
| | | #@TestSteps Add entry on server A |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronized |
| | | --> |
| | | <testcase name="getTestCaseName('On-line initialisation')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <script> |
| | | m = md5_hash() |
| | | m.update(STAXCurrentTestcase) |
| | | </script> |
| | | <message> |
| | | 'Replication: Binary Copy: On-line initialisation. Initialise \ |
| | | replicated servers using on-line backup/restore' |
| | | </message> |
| | | |
| | | <!-- Pre-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy on-line: prepare servers for external \ |
| | | initialization' |
| | | </message> |
| | | <call function="'preInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'localOnly' : False, |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Import data into "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: import data on %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'ImportLdifWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'ldifFile' : '%s/replication/Example.ldif' \ |
| | | % masterDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check some data was imported into "master" server --> |
| | | <call function="'checkImport'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsHost' : masterHost, |
| | | 'dsPort' : master.getPort(), |
| | | 'dsAdminPort' : master.getAdminPort(), |
| | | 'dsDn' : master.getRootDn(), |
| | | 'dsPswd' : master.getRootPwd(), |
| | | 'expectedEntries' : ['uid=scarter,ou=People,o=example', |
| | | 'uid=dmiller, ou=People, o=example', |
| | | 'uid=rhunt, ou=People, o=example'], |
| | | 'startDS' : 'no' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Backup "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: back-up server %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'backupTask'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'taskID' : 'backup task', |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Copy backup to "consumer" servers and restore it --> |
| | | <paralleliterate var="consumer" in="consumerList"> |
| | | <sequence> |
| | | <script> |
| | | consumerBackupDir = '%s' % consumer.getTmpDir() |
| | | </script> |
| | | |
| | | <call function="'CopyFolderByExtension'"> |
| | | { 'location' : masterHost, |
| | | 'remotehost' : consumer.getHostname(), |
| | | 'srcfolder' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()), |
| | | 'destfolder' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()), |
| | | 'extension' : '*' |
| | | } |
| | | </call> |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication BinaryCopy Tests |
| | | #@TestSuitePurpose Verify that the total-update operations are replicated |
| | | correctly between two servers. |
| | | #@TestSuiteID BinaryCopy Tests |
| | | #@TestSuiteGroup BinaryCopy |
| | | #@TestGroup Replication |
| | | #@TestScript replication_binarycopy.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | <message> |
| | | '+++++ binary copy on-line: restore back-up on %s:%s' \ |
| | | % (consumer.getHostname(), consumer.getPort()) |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <try> |
| | | <sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'" > |
| | | { 'label' : _label } |
| | | </call> |
| | | |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('binarycopy/binarycopy_tests') |
| | | </script> |
| | | |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: BinaryCopy:' |
| | | </script> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_binarycopy_001') |
| | | testsList.append('replication_binarycopy_002') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | </sequence> |
| | | |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <call function="'restoreTask'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : consumer.getRootDn(), |
| | | 'dsInstancePswd' : consumer.getRootPwd(), |
| | | 'taskID' : 'restore task', |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | <rethrow/> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Post-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy on-line: end external server initialization' |
| | | </message> |
| | | <call function="'postInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: add entry to %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % clientDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | </try> |
| | | |
| | | </sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" > |
| | | { 'label' : 'Replication Binarycopy' } |
| | | </call> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </sequence> |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : _label } |
| | | </call> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </finally> |
| | | |
| | | </try> |
| | | </block> |
| | | </sequence> |
| | | </function> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Binary Copy Tests |
| | | #@TestName Replication: Binary Copy: Off-line |
| | | initialisation |
| | | #@TestID Off-line initialisation |
| | | #@TestPurpose Initialise replicated servers using off-line |
| | | backup/restore |
| | | #@TestPreamble |
| | | #@TestSteps Call dsreplication pre-external-initialization |
| | | #@TestSteps Stop servers |
| | | #@TestSteps Import data on server A |
| | | #@TestSteps Back-up server A |
| | | #@TestSteps Restore back-up on other servers |
| | | #@TestSteps Start servers |
| | | #@TestSteps Call dsreplication post-external-initialization |
| | | #@TestSteps Add entry on server A |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronized |
| | | --> |
| | | <function name="replication_binarycopy_001" scope="local"> |
| | | <testcase name="getTestCaseName('Off-line initialisation')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <script> |
| | | m = md5_hash() |
| | | m.update(STAXCurrentTestcase) |
| | | </script> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Initialise replicated servers using off-line backup/restore.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Pre-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy off-line: prepare servers for external \ |
| | | initialization' |
| | | </message> |
| | | <call function="'preInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'localOnly' : False, |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_topologyServerList] |
| | | </call> |
| | | |
| | | <!-- Import data into "master" server --> |
| | | <message> |
| | | '+++++ binary copy off-line: import data on %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'ImportLdifWithScript'"> |
| | | { 'location' : masterHost, |
| | | 'dsPath' : masterPath, |
| | | 'backEnd' : DIRECTORY_INSTANCE_BE, |
| | | 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir |
| | | } |
| | | </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_%s' \ |
| | | % (masterBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Copy backup to "consumer" servers and restore it --> |
| | | <paralleliterate var="consumer" in="consumerList"> |
| | | <sequence> |
| | | <script> |
| | | consumerBackupDir = '%s' % consumer.getTmpDir() |
| | | </script> |
| | | <call function="'CopyFolderByExtension'"> |
| | | { 'location' : masterHost, |
| | | 'remotehost' : consumer.getHostname(), |
| | | 'srcfolder' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()), |
| | | 'destfolder' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()), |
| | | 'extension' : '*' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++++ binary copy off-line: restore back-up on %s:%s' \ |
| | | % (consumer.getHostname(), consumer.getPort()) |
| | | </message> |
| | | <call function="'restore'"> |
| | | { 'location' : consumer.getHostname(), |
| | | 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME), |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_topologyServerList] |
| | | </call> |
| | | |
| | | <!-- Check some data was imported into "master" server --> |
| | | <call function="'checkImport'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsHost' : masterHost, |
| | | 'dsPort' : master.getPort(), |
| | | 'dsAdminPort' : master.getAdminPort(), |
| | | 'dsDn' : master.getRootDn(), |
| | | 'dsPswd' : master.getRootPwd(), |
| | | 'expectedEntries' : ['uid=scarter,ou=People,o=example', |
| | | 'uid=dmiller, ou=People, o=example', |
| | | 'uid=rhunt, ou=People, o=example'], |
| | | 'startDS' : 'no' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Post-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy off-line: end external server initialization' |
| | | </message> |
| | | <call function="'postInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <message> |
| | | '+++++ binary copy off-line: add entry to %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % clientDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- 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 Binary Copy Tests |
| | | #@TestName Replication: Binary Copy: On-line initialisation |
| | | #@TestID On-line initialisation |
| | | #@TestPurpose Initialise replicated servers using on-line |
| | | backup/restore |
| | | #@TestPreamble |
| | | #@TestSteps Call dsreplication pre-external-initialization |
| | | #@TestSteps Import data on server A |
| | | #@TestSteps Back-up server A |
| | | #@TestSteps Restore back-up on other servers |
| | | #@TestSteps Call dsreplication post-external-initialization |
| | | #@TestSteps Add entry on server A |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronized |
| | | --> |
| | | <function name="replication_binarycopy_002" scope="local"> |
| | | <testcase name="getTestCaseName('On-line initialisation')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <script> |
| | | m = md5_hash() |
| | | m.update(STAXCurrentTestcase) |
| | | </script> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Initialise replicated servers using on-line backup/restore.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Pre-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy on-line: prepare servers for external \ |
| | | initialization' |
| | | </message> |
| | | <call function="'preInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'localOnly' : False, |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Import data into "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: import data on %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'ImportLdifWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'ldifFile' : '%s/replication/Example.ldif' \ |
| | | % masterDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check some data was imported into "master" server --> |
| | | <call function="'checkImport'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsHost' : masterHost, |
| | | 'dsPort' : master.getPort(), |
| | | 'dsAdminPort' : master.getAdminPort(), |
| | | 'dsDn' : master.getRootDn(), |
| | | 'dsPswd' : master.getRootPwd(), |
| | | 'expectedEntries' : ['uid=scarter,ou=People,o=example', |
| | | 'uid=dmiller, ou=People, o=example', |
| | | 'uid=rhunt, ou=People, o=example'], |
| | | 'startDS' : 'no' |
| | | } |
| | | </call> |
| | | |
| | | <!-- Backup "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: back-up server %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'backupTask'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'taskID' : 'backup task', |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Copy backup to "consumer" servers and restore it --> |
| | | <paralleliterate var="consumer" in="consumerList"> |
| | | <sequence> |
| | | <script> |
| | | consumerBackupDir = '%s' % consumer.getTmpDir() |
| | | </script> |
| | | |
| | | <call function="'CopyFolderByExtension'"> |
| | | { 'location' : masterHost, |
| | | 'remotehost' : consumer.getHostname(), |
| | | 'srcfolder' : '%s/replication/master_backup_%s' \ |
| | | % (masterBackupDir,m.hexdigest()), |
| | | 'destfolder' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()), |
| | | 'extension' : '*' |
| | | } |
| | | </call> |
| | | |
| | | <message> |
| | | '+++++ binary copy on-line: restore back-up on %s:%s' \ |
| | | % (consumer.getHostname(), consumer.getPort()) |
| | | </message> |
| | | <call function="'restoreTask'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : consumer.getHostname(), |
| | | 'dsInstancePort' : consumer.getPort(), |
| | | 'dsInstanceDn' : consumer.getRootDn(), |
| | | 'dsInstancePswd' : consumer.getRootPwd(), |
| | | 'taskID' : 'restore task', |
| | | 'backupDir' : '%s/replication/master_backup_%s' \ |
| | | % (consumerBackupDir,m.hexdigest()) |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Post-initialise the servers in the topology --> |
| | | <message> |
| | | '+++++ binary copy on-line: end external server initialization' |
| | | </message> |
| | | <call function="'postInitializeReplication'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstanceAdminPort' : master.getAdminPort(), |
| | | 'replicationDnList' : [synchroSuffix], |
| | | 'adminUID' : adminUID, |
| | | 'adminPswd' : adminPswd |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add entry to "master" server --> |
| | | <message> |
| | | '+++++ binary copy on-line: add entry to %s:%s' \ |
| | | % (masterHost, master.getPort()) |
| | | </message> |
| | | <call function="'addEntry'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost, |
| | | 'dsInstancePort' : master.getPort(), |
| | | 'dsInstanceDn' : master.getRootDn(), |
| | | 'dsInstancePswd' : master.getRootPwd(), |
| | | 'entryToBeAdded' : '%s/replication/tfitter.ldif' \ |
| | | % clientDataDir |
| | | } |
| | | </call> |
| | | |
| | | <!-- 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> |
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_changelog"/> |
| | | |
| | | <function name="replication_changelog"> |
| | | <function name="replication_changelog" scope="local"> |
| | | <sequence> |
| | | <block name="'changelog'"> |
| | | <sequence> |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Changelog Tests |
| | | #@TestSuitePurpose Test the accessibility of the changelog through |
| | | search, export, backup and restore operations. |
| | | Also, test other replication features using |
| | | changelog properties. |
| | | #@TestSuiteID Changelog Tests |
| | | #@TestSuiteGroup Changelog |
| | | #@TestGroup Replication |
| | | #@TestScript replication_changelog.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', |
| | | 'label' : 'Replication Changelog' } |
| | | </call> |
| | | <block name="'replication_changelog'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'changelog' |
| | | |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication Changelog' |
| | | </script> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Changelog Tests |
| | | #@TestSuitePurpose Verify that the changelog operations are replicated |
| | | correctly between two servers. |
| | | #@TestSuiteID Changelog Tests |
| | | #@TestSuiteGroup Changelog |
| | | #@TestGroup Replication |
| | | #@TestScript replication_changelog.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | |
| | | <!--- 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 |
| | | --> |
| | | <testcase name="getTestCaseName('Search')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Search. \ |
| | | Check replication changelog can be searched and look up changes' |
| | | </message> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <!-- 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> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'dataFile' : 'Example.ldif', |
| | | 'label' : _label } |
| | | </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> |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('changelog/changelog_tests') |
| | | </script> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </call> |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: Changelog:' |
| | | </script> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_changelog_001') |
| | | testsList.append('replication_changelog_002') |
| | | testsList.append('replication_changelog_003') |
| | | testsList.append('replication_changelog_004') |
| | | #OOS: testsList.append('replication_changelog_005') |
| | | testsList.append('replication_changelog_006') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Search changelog in the various replication servers --> |
| | | <paralleliterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | </sequence> |
| | | |
| | | 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 |
| | | </script> |
| | | <!-- expect entry returned => len(searchResult) > 0 |
| | | =====> resultLength = 1 --> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- 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 |
| | | --> |
| | | <testcase name="getTestCaseName('Export (on-line)')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Export (on-line). \ |
| | | Check replication changelog can be exported on-line and look \ |
| | | up changes' |
| | | </message> |
| | | |
| | | <!-- 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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </call> |
| | | |
| | | <!-- Export changelog in the various replication servers, then |
| | | check for added entry in the exported files --> |
| | | <paralleliterate var="server" |
| | | in="_topologyServerList" |
| | | indexvar="i"> |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | |
| | | <script> |
| | | if globalSplitServers: |
| | | replServer = _topologyReplServerList[i] |
| | | else: |
| | | replServer = server |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <rethrow/> |
| | | </sequence> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME) |
| | | </try> |
| | | |
| | | 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> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | </sequence> |
| | | |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : _label } |
| | | </call> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </finally> |
| | | |
| | | |
| | | <!--- 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 |
| | | --> |
| | | <testcase name="getTestCaseName('Backup-restore (off-line)')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Backup-restore (off-line). \ |
| | | Check replication changelog can be backed up and restored \ |
| | | off-line' |
| | | </message> |
| | | |
| | | <!-- 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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <if expr="0"> |
| | | <!-- 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 |
| | | --> |
| | | <testcase name="getTestCaseName('Backup-restore (on-line)')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Backup-restore (on-line). \ |
| | | Check replication changelog can be backuped and restored \ |
| | | on-line' |
| | | </message> |
| | | |
| | | <!-- 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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | </if> |
| | | |
| | | <!--- 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 |
| | | --> |
| | | <testcase name="getTestCaseName('Changelog Reset')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Changelog Reset. \ |
| | | Check replication changelog is reset by \ |
| | | dsreplication pre/post-external-initialize' |
| | | </message> |
| | | |
| | | <!-- 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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- 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) |
| | | --> |
| | | <testcase name="getTestCaseName('Changelog Purge')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Changelog: Changelog Purge. \ |
| | | Check replication changelog is purged after the purge delay \ |
| | | specified in the conf expires' |
| | | </message> |
| | | |
| | | <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> |
| | | |
| | | <!-- Let some time for the changes to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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 |
| | | # if entry not purged => we may have run into Issue 3736 |
| | | # (Dynamic purge delay change not taken into account) |
| | | myKnownIssue = '3736' |
| | | else: |
| | | # purge delay not expired (default purge delay: 1 day) |
| | | # => expect entry returned |
| | | # => len(searchResult) > 0 => resultLength = 1 |
| | | myExpectedRC = 1 |
| | | myKnownIssue = None |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : myExpectedRC, |
| | | 'issue' : myKnownIssue |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" > |
| | | { 'label' : 'Replication Changelog' } |
| | | </call> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | </sequence> |
| | | </try> |
| | | </block> |
| | | </sequence> |
| | | </function> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2008-2009 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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 |
| | | </script> |
| | | <!-- expect entry returned => len(searchResult) > 0 |
| | | =====> resultLength = 1 --> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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> |
| | | |
| | | <!-- Let some time for the change to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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 Reset')"> |
| | | <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> |
| | | |
| | | <!-- Let some time for the changes to propagate --> |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </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 |
| | | # if entry not purged => we may have run into Issue 3736 |
| | | # (Dynamic purge delay change not taken into account) |
| | | myKnownIssue = '3736' |
| | | else: |
| | | # purge delay not expired (default purge delay: 1 day) |
| | | # => expect entry returned |
| | | # => len(searchResult) > 0 => resultLength = 1 |
| | | myExpectedRC = 1 |
| | | myKnownIssue = None |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : myExpectedRC, |
| | | 'issue' : myKnownIssue |
| | | } |
| | | </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> |
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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 |
| | | ! |
| | | ! Portions Copyright 2006-2009 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_conflict"/> |
| | | |
| | | <function name="replication_conflict"> |
| | | |
| | | <function name="replication_conflict" scope="local"> |
| | | <sequence> |
| | | <block name="'replication_conflict'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'conflict' |
| | | |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication Conflict' |
| | | </script> |
| | | |
| | | <block name="'conflict'"> |
| | | |
| | | <sequence> |
| | | |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Conflict Tests |
| | | #@TestSuitePurpose Verify that replication handles the conflicts |
| | | all right |
| | | #@TestSuiteID Conflict Tests |
| | | #@TestSuiteGroup Conflict |
| | | #@TestGroup Replication |
| | | #@TestScript replication_failover.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'"> |
| | | { 'topologyFile' : '%s/basic_topology.txt' \ |
| | | % REPLICATION_CONFIG_DIR, |
| | | 'dataFile' : 'Short_Example.ldif', |
| | | 'isolateLdapServers' : True, |
| | | 'enableDebugLogs' : False, |
| | | 'label' : 'Replication Conflict' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <script> |
| | | server1 = _topologyServerList[0] |
| | | server2 = _topologyServerList[1] |
| | | server1Host = server1.getHostname() |
| | | server2Host = server2.getHostname() |
| | | server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME) |
| | | server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME) |
| | | server1name = '%s:%s' % (server1Host, server1.getPort()) |
| | | server2name = '%s:%s' % (server2Host, server2.getPort()) |
| | | |
| | | if globalSplitServers: |
| | | replServer1 = _topologyReplServerList[0] |
| | | replServer2 = _topologyReplServerList[1] |
| | | else: |
| | | replServer1 = server1 |
| | | replServer2 = server2 |
| | | |
| | | # Filter used for retrieving conflict counters from cn=monitor |
| | | filter0 = '(base-dn=%s)' % synchroSuffix |
| | | filter1 = '(cn=Replication Plugin*)' |
| | | monitorFilter = '&%s%s' % (filter0, filter1) |
| | | monitorCounters = 'resolved-naming-conflicts \ |
| | | unresolved-naming-conflicts \ |
| | | resolved-modify-conflicts' |
| | | |
| | | addedEntries = STAXGlobal( [[], []] ) |
| | | |
| | | 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') |
| | | self.listAttr.append('sn:User') |
| | | self.listAttr.append('cn:Test User') |
| | | 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 Conflict Tests |
| | | #@TestName Replication: Conflict: Basic check |
| | | #@TestID Basic check |
| | | #@TestPurpose Check replication assures synchronization after |
| | | a simultaneous conflictuous modify on 2 |
| | | different servers (regardless of the prevailing |
| | | modify) |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber:0 |
| | | #@TestSteps Parallel replace |
| | | server1: employeeNumber -> 1 |
| | | server2: employeeNumber -> 2 |
| | | #@TestSteps Check entry consistent on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Basic check')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: Basic check 0. \ |
| | | Check replication assures synchronization after a simultaneous \ |
| | | conflictuous modify on 2 different servers (regardless of the \ |
| | | prevailing modify)' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('uid=tuser-0') |
| | | myEntry.addAttr('employeeNumber', '0') |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </call> |
| | | |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'employeeNumber', |
| | | 'newAttributeValue' : '%i' % (i + 1), |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_replace_multi |
| | | #@TestID double_replace_multi |
| | | #@TestPurpose Double replace a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description:{1 2} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {3 4} |
| | | #@TestSteps server2: replace description -> {5 6} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={5 6} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_replace_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_replace_multi. \ |
| | | Double replace a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A1') |
| | | myEntry.addAttr('description', '1') |
| | | myEntry.addAttr('description', '2') |
| | | server1mods = ['description:3', 'description:4'] |
| | | server2mods = ['description:5', 'description:6'] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i], |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_replace_single |
| | | #@TestID double_replace_single |
| | | #@TestPurpose Double replace a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber:0 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace employeeNumber -> 1 |
| | | #@TestSteps server2: replace employeeNumber -> 2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber=2 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_replace_single')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_replace_single. \ |
| | | Double replace a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A4') |
| | | myEntry.addAttr('employeeNumber', '0') |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'employeeNumber', |
| | | 'newAttributeValue' : '%i' % (i + 1), |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_add_multi_1 |
| | | #@TestID double_mod_del_add_multi_1 |
| | | #@TestPurpose Double replace (del+add) same value with any |
| | | value of a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: del description=1 + add description=11 |
| | | #@TestSteps server2: del description=1 + add description=12 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5 6 7 8 9 10 11 12} |
| | | on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_del_add_multi_1')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_add_multi_1. \ |
| | | Double replace (del+add) same value with any value of a \ |
| | | multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A2') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:1'] |
| | | server1add = ['description:11'] |
| | | server2del = ['description:1'] |
| | | server2add = ['description:12'] |
| | | server1mods = [server1del, server1add] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_add_multi_2 |
| | | #@TestID double_mod_del_add_multi_2 |
| | | #@TestPurpose Double replace (del+add) any value with same |
| | | value of a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: del description=1 + add description=11 |
| | | #@TestSteps server2: del description=10 + add description=11 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5 6 7 8 9 11} |
| | | on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_del_add_multi_2')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_add_multi_2. \ |
| | | Double replace (del+add) any value with same value of a \ |
| | | multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A3') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:1'] |
| | | server1add = ['description:11'] |
| | | server2del = ['description:10'] |
| | | server2add = ['description:11'] |
| | | server1mods = [server1del, server1add] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_add_multi |
| | | #@TestID double_mod_add_multi |
| | | #@TestPurpose Double mod_add a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description=1 |
| | | #@TestSteps server2: add description={1 2} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={1 2} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_add_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_add_multi. \ |
| | | Double mod_add a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=B1') |
| | | server1add = ['description:1'] |
| | | server2add = ['description:1', 'description:2'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_add_single |
| | | #@TestID double_mod_add_single |
| | | #@TestPurpose Double mod_add a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add employeeNumber=1 |
| | | #@TestSteps server2: add employeeNumber=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber=1 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_add_single')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_add_single. \ |
| | | Double mod_add a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=B2') |
| | | server1add = ['employeeNumber:1'] |
| | | server2add = ['employeeNumber:2'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_multi |
| | | #@TestID double_mod_del_multi |
| | | #@TestPurpose Double mod_delete a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete description={1 2 3 4 5} |
| | | #@TestSteps server2: delete description={4 5 6 7 8} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={9 10} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_del_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_multi. \ |
| | | Double mod_delete a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=C1') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = [] |
| | | for y in range(1,6): |
| | | server1del.append('description:%i' % y) |
| | | server2del = [] |
| | | for z in range(4,9): |
| | | server2del.append('description:%i' % z) |
| | | server1mods = [server1del] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_single |
| | | #@TestID double_mod_del_single |
| | | #@TestPurpose Double mod_delete a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete employeeNumber |
| | | #@TestSteps server2: delete employeeNumber=1 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber no longer exists on either |
| | | server |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_mod_del_single')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_single. \ |
| | | Double mod_delete a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=C2') |
| | | myEntry.addAttr('employeeNumber', '1') |
| | | server1del = ['employeeNumber:'] |
| | | server2del = ['employeeNumber:1'] |
| | | server1mods = [server1del] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_del_add_vs_mod_add_del_multi |
| | | #@TestID mod_del_add_vs_mod_add_del_multi |
| | | #@TestPurpose Modify: Delete+Add then Add+Delete on 2 |
| | | multi-valued attributes |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description=1 , telephoneNumber=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description=2 , |
| | | delete telephoneNumber |
| | | #@TestSteps server2: delete description , |
| | | add telephoneNumber=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description no longer exists and |
| | | telephoneNumber=2 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('mod_del_add_vs_mod_add_del_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \ |
| | | Modify: Delete+Add then Add+Delete on 2 multi-valued attributes' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=D1') |
| | | myEntry.addAttr('description', '1') |
| | | myEntry.addAttr('telephoneNumber', '1') |
| | | server1add = ['description:2'] |
| | | server1del = ['telephoneNumber:'] |
| | | server2del = ['description:'] |
| | | server2add = ['telephoneNumber:2'] |
| | | server1mods = [server1add, server1del] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['add', 'delete'] |
| | | server2changetypes = ['delete', 'add'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : changetypes[i][1] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description telephoneNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description telephoneNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_add_vs_mod_replace_multi |
| | | #@TestID mod_add_vs_mod_replace_multi |
| | | #@TestPurpose mod_add vs mod_replace on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description={2 3} |
| | | #@TestSteps server2: replace description -> {4 5} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={4 5} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('mod_add_vs_mod_replace_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: mod_add_vs_mod_replace_multi. \ |
| | | mod_add vs mod_replace on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=E1') |
| | | myEntry.addAttr('description', '1') |
| | | server1add = ['description:2', 'description:3'] |
| | | server2replace = ['description:4', 'description:5'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2replace] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['add'] |
| | | server2changetypes = ['replace'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_replace_vs_mod_add_multi |
| | | #@TestID mod_replace_vs_mod_add_multi |
| | | #@TestPurpose mod_replace vs mod_add on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {2 3} |
| | | #@TestSteps server2: add description={4 5} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('mod_replace_vs_mod_add_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: mod_replace_vs_mod_add_multi. \ |
| | | mod_replace vs mod_add on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=E2') |
| | | myEntry.addAttr('description', '1') |
| | | server1replace = ['description:2', 'description:3'] |
| | | server2add = ['description:4', 'description:5'] |
| | | server1mods = [server1replace] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['replace'] |
| | | server2changetypes = ['add'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_del_vs_mod_replace_multi |
| | | #@TestID mod_del_vs_mod_replace_multi |
| | | #@TestPurpose mod_del vs mod_replace on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description={1 2 3 4} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete description={2 3} |
| | | #@TestSteps server2: replace description -> {6 7 8 9 10} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={6 7 8 9 10} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('mod_del_vs_mod_replace_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: mod_del_vs_mod_replace_multi. \ |
| | | mod_del vs mod_replace on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=F1') |
| | | for x in range(4): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:2', 'description:3'] |
| | | server2replace = [] |
| | | for y in range(6,11): |
| | | server2replace.append('description:%i' % y) |
| | | server1mods = [server1del] |
| | | server2mods = [server2replace] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['delete'] |
| | | server2changetypes = ['replace'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_replace_vs_mod_del_multi |
| | | #@TestID mod_replace_vs_mod_del_multi |
| | | #@TestPurpose mod_replace vs mod_del on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description={1 2 3 4} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {1 2 3} |
| | | #@TestSteps server2: delete description={3 4} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={1 2} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('mod_replace_vs_mod_del_multi')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: mod_replace_vs_mod_del_multi. \ |
| | | mod_replace vs mod_del on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=F2') |
| | | for x in range(4): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1replace = ['description:1', 'description:2', |
| | | 'description:3'] |
| | | server2del = ['description:3', 'description:4'] |
| | | server1mods = [server1replace] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['replace'] |
| | | server2changetypes = ['delete'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: add_child_del_parent |
| | | #@TestID add_child_del_parent |
| | | #@TestPurpose Add a child vs delete his parent |
| | | #@TestPreamble |
| | | #@TestSteps Add entry cn=P1 to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server2: add child cn=C1,cn=P1 |
| | | #@TestSteps server1: delete parent cn=P1 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('add_child_del_parent')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: add_child_del_parent. \ |
| | | Add a child vs delete his parent' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | parentEntry = Entry('cn=P1') |
| | | parentEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | childEntry = Entry('cn=C1,cn=P1') |
| | | childEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | # addedEntries = [[], []] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : parentEntry.getDn(), |
| | | 'listAttributes' : parentEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Add child entry on server2 --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server2Host, |
| | | 'dsPath' : server2Path, |
| | | 'dsInstanceHost' : server2Host, |
| | | 'dsInstancePort' : server2.getPort(), |
| | | 'dsInstanceDn' : server2.getRootDn(), |
| | | 'dsInstancePswd' : server2.getRootPwd(), |
| | | 'DNToAdd' : childEntry.getDn(), |
| | | 'listAttributes' : childEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Delete parent entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [parentEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue 3891 |
| | | (Replication conflict: add child , delete parent) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | '3891' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | <!-- Issue visible in the conflict counters, so not automatically |
| | | ! detectable so far. |
| | | <call function="'setKnownIssue'"> |
| | | { 'issueId' : '3400' } |
| | | </call> |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Conflict Tests |
| | | #@TestSuitePurpose Verify that the conflict operations are replicated |
| | | correctly between two servers. |
| | | #@TestSuiteID Conflict Tests |
| | | #@TestSuiteGroup Conflict |
| | | #@TestGroup Replication |
| | | #@TestScript replication_conflict.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: del_parent_add_child |
| | | #@TestID del_parent_add_child |
| | | #@TestPurpose Delete a parent vs add his child |
| | | #@TestPreamble |
| | | #@TestSteps Add entry cn=P2 to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete parent cn=P2 |
| | | #@TestSteps server2: add child cn=C2,cn=P2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('del_parent_add_child')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: del_parent_add_child. \ |
| | | Delete a parent vs add his child' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | parentEntry = Entry('cn=P2') |
| | | parentEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | childEntry = Entry('cn=C2,cn=P2') |
| | | childEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | # addedEntries = [[], []] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : parentEntry.getDn(), |
| | | 'listAttributes' : parentEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Delete parent entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [parentEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add child entry on server2 --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server2Host, |
| | | 'dsPath' : server2Path, |
| | | 'dsInstanceHost' : server2Host, |
| | | 'dsInstancePort' : server2.getPort(), |
| | | 'dsInstanceDn' : server2.getRootDn(), |
| | | 'dsInstancePswd' : server2.getRootPwd(), |
| | | 'DNToAdd' : childEntry.getDn(), |
| | | 'listAttributes' : childEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue 4071 |
| | | (Replication conflict: delete parent, add child) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | '4071' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | <!-- Issue visible in the conflict counters, so not automatically |
| | | ! detectable so far. |
| | | <call function="'setKnownIssue'"> |
| | | { 'issueId' : '3400' } |
| | | </call> |
| | | --> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_add |
| | | #@TestID double_add |
| | | #@TestPurpose Double add (same dn, different uid) |
| | | #@TestPreamble |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add entry cn=F with uid=1 |
| | | #@TestSteps server2: add entry cn=F with uid=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_add')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_add. \ |
| | | Double add (same dn, different uid)' |
| | | </message> |
| | | |
| | | <script> |
| | | entry1 = Entry('cn=F') |
| | | entry1.addAttr('uid', '1') |
| | | entry1.addAttr('givenname', 'DUMMY ENTRY') |
| | | entry2 = Entry('cn=F') |
| | | entry2.addAttr('uid', '2') |
| | | entry2.addAttr('givenname', 'DUMMY ENTRY') |
| | | |
| | | entriesToAdd = [entry1, entry2] |
| | | </script> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Add entry on one of the servers --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : entriesToAdd[i].getDn(), |
| | | 'listAttributes' : entriesToAdd[i].getAttrList() |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue OPENDJ-454 |
| | | (RFE: Solve naming conflict of 2 adds with same dn, different |
| | | attr value) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | 'OPENDJ-454' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: double_add_single_del_1 |
| | | #@TestID double_add_single_del_1 |
| | | #@TestPurpose Add twice same dn, then delete it in one server |
| | | #@TestPreamble |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add entry cn=DN1 with uid=1 |
| | | #@TestSteps server2: add entry cn=DN1 with uid=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps server1: delete entry cn=DN1 |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('double_add_single_del_1')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_add_single_del_1. \ |
| | | Add twice same dn, then delete it in one server' |
| | | </message> |
| | | |
| | | <script> |
| | | entry1 = Entry('cn=DN1') |
| | | entry1.addAttr('uid', '1') |
| | | entry1.addAttr('givenname', 'DUMMY ENTRY') |
| | | entry2 = Entry('cn=DN1') |
| | | entry2.addAttr('uid', '2') |
| | | entry2.addAttr('givenname', 'DUMMY ENTRY') |
| | | |
| | | entriesToAdd = [entry1, entry2] |
| | | </script> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Add entry on one of the servers --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : entriesToAdd[i].getDn(), |
| | | 'listAttributes' : entriesToAdd[i].getAttrList() |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Delete entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [entry1.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue OPENDJ-454 |
| | | (RFE: Solve naming conflict of 2 adds with same dn, different |
| | | attr value) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | 'OPENDJ-454' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" > |
| | | { 'label' : 'Replication Conflict' } |
| | | </call> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | |
| | | </sequence> |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <try> |
| | | <sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'topologyFile' : '%s/basic_topology.txt' \ |
| | | % REPLICATION_CONFIG_DIR, |
| | | 'dataFile' : 'Short_Example.ldif', |
| | | 'isolateLdapServers' : True, |
| | | 'enableDebugLogs' : False, |
| | | 'label' : _label |
| | | } |
| | | </call> |
| | | |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('conflict/conflict_tests') |
| | | </script> |
| | | |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: Conflict:' |
| | | server1 = _topologyServerList[0] |
| | | server2 = _topologyServerList[1] |
| | | server1Host = server1.getHostname() |
| | | server2Host = server2.getHostname() |
| | | server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME) |
| | | server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME) |
| | | server1name = '%s:%s' % (server1Host, server1.getPort()) |
| | | server2name = '%s:%s' % (server2Host, server2.getPort()) |
| | | |
| | | if globalSplitServers: |
| | | replServer1 = _topologyReplServerList[0] |
| | | replServer2 = _topologyReplServerList[1] |
| | | else: |
| | | replServer1 = server1 |
| | | replServer2 = server2 |
| | | |
| | | # Filter used for retrieving conflict counters from cn=monitor |
| | | filter0 = '(base-dn=%s)' % synchroSuffix |
| | | filter1 = '(cn=Replication Plugin*)' |
| | | monitorFilter = '&%s%s' % (filter0, filter1) |
| | | monitorCounters = 'resolved-naming-conflicts \ |
| | | unresolved-naming-conflicts \ |
| | | resolved-modify-conflicts' |
| | | |
| | | addedEntries = STAXGlobal( [[], []] ) |
| | | |
| | | 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') |
| | | self.listAttr.append('sn:User') |
| | | self.listAttr.append('cn:Test User') |
| | | 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> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_conflict_001') |
| | | testsList.append('replication_conflict_002') |
| | | testsList.append('replication_conflict_003') |
| | | testsList.append('replication_conflict_004') |
| | | testsList.append('replication_conflict_005') |
| | | testsList.append('replication_conflict_006') |
| | | testsList.append('replication_conflict_007') |
| | | testsList.append('replication_conflict_008') |
| | | testsList.append('replication_conflict_009') |
| | | testsList.append('replication_conflict_010') |
| | | testsList.append('replication_conflict_011') |
| | | testsList.append('replication_conflict_012') |
| | | testsList.append('replication_conflict_013') |
| | | testsList.append('replication_conflict_014') |
| | | testsList.append('replication_conflict_015') |
| | | testsList.append('replication_conflict_016') |
| | | testsList.append('replication_conflict_017') |
| | | testsList.append('replication_conflict_018') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | </sequence> |
| | | |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <rethrow/> |
| | | </sequence> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | </try> |
| | | |
| | | </sequence> |
| | | |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : _label } |
| | | </call> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </finally> |
| | | |
| | | </try> |
| | | </block> |
| | | |
| | | </sequence> |
| | | |
| | | </function> |
| | | |
| | | </stax> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Portions Copyright 2006-2009 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: Basic check |
| | | #@TestID Basic check |
| | | #@TestPurpose Check replication assures synchronization after |
| | | a simultaneous conflictuous modify on 2 |
| | | different servers (regardless of the prevailing |
| | | modify) |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber:0 |
| | | #@TestSteps Parallel replace |
| | | server1: employeeNumber -> 1 |
| | | server2: employeeNumber -> 2 |
| | | #@TestSteps Check entry consistent on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_001" scope="local"> |
| | | <testcase name="getTestCaseName('Basic check')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: Basic check 0. \ |
| | | Check replication assures synchronization after a simultaneous \ |
| | | conflictuous modify on 2 different servers (regardless of the \ |
| | | prevailing modify)' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('uid=tuser-0') |
| | | myEntry.addAttr('employeeNumber', '0') |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <call function="'Sleep'"> |
| | | { 'sleepForMilliSeconds' : 2000 } |
| | | </call> |
| | | |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'employeeNumber', |
| | | 'newAttributeValue' : '%i' % (i + 1), |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_replace_multi |
| | | #@TestID double_replace_multi |
| | | #@TestPurpose Double replace a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description:{1 2} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {3 4} |
| | | #@TestSteps server2: replace description -> {5 6} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={5 6} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_002" scope="local"> |
| | | <testcase name="getTestCaseName('double_replace_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_replace_multi. \ |
| | | Double replace a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A1') |
| | | myEntry.addAttr('description', '1') |
| | | myEntry.addAttr('description', '2') |
| | | server1mods = ['description:3', 'description:4'] |
| | | server2mods = ['description:5', 'description:6'] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i], |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_replace_single |
| | | #@TestID double_replace_single |
| | | #@TestPurpose Double replace a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber:0 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace employeeNumber -> 1 |
| | | #@TestSteps server2: replace employeeNumber -> 2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber=2 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_003" scope="local"> |
| | | <testcase name="getTestCaseName('double_replace_single')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_replace_single. \ |
| | | Double replace a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A4') |
| | | myEntry.addAttr('employeeNumber', '0') |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'attributeName' : 'employeeNumber', |
| | | 'newAttributeValue' : '%i' % (i + 1), |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_add_multi_1 |
| | | #@TestID double_mod_del_add_multi_1 |
| | | #@TestPurpose Double replace (del+add) same value with any |
| | | value of a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: del description=1 + add description=11 |
| | | #@TestSteps server2: del description=1 + add description=12 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5 6 7 8 9 10 11 12} |
| | | on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_004" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_del_add_multi_1')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_add_multi_1. \ |
| | | Double replace (del+add) same value with any value of a \ |
| | | multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A2') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:1'] |
| | | server1add = ['description:11'] |
| | | server2del = ['description:1'] |
| | | server2add = ['description:12'] |
| | | server1mods = [server1del, server1add] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_add_multi_2 |
| | | #@TestID double_mod_del_add_multi_2 |
| | | #@TestPurpose Double replace (del+add) any value with same |
| | | value of a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: del description=1 + add description=11 |
| | | #@TestSteps server2: del description=10 + add description=11 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5 6 7 8 9 11} |
| | | on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_005" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_del_add_multi_2')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_add_multi_2. \ |
| | | Double replace (del+add) any value with same value of a \ |
| | | multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=A3') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:1'] |
| | | server1add = ['description:11'] |
| | | server2del = ['description:10'] |
| | | server2add = ['description:11'] |
| | | server1mods = [server1del, server1add] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_add_multi |
| | | #@TestID double_mod_add_multi |
| | | #@TestPurpose Double mod_add a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description=1 |
| | | #@TestSteps server2: add description={1 2} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={1 2} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_006" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_add_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_add_multi. \ |
| | | Double mod_add a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=B1') |
| | | server1add = ['description:1'] |
| | | server2add = ['description:1', 'description:2'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_add_single |
| | | #@TestID double_mod_add_single |
| | | #@TestPurpose Double mod_add a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add employeeNumber=1 |
| | | #@TestSteps server2: add employeeNumber=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber=1 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_007" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_add_single')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_add_single. \ |
| | | Double mod_add a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=B2') |
| | | server1add = ['employeeNumber:1'] |
| | | server2add = ['employeeNumber:2'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'add' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_multi |
| | | #@TestID double_mod_del_multi |
| | | #@TestPurpose Double mod_delete a multi-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description:{1 2 3 4 5 6 7 8 9 10} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete description={1 2 3 4 5} |
| | | #@TestSteps server2: delete description={4 5 6 7 8} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={9 10} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_008" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_del_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_multi. \ |
| | | Double mod_delete a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=C1') |
| | | for x in range(10): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = [] |
| | | for y in range(1,6): |
| | | server1del.append('description:%i' % y) |
| | | server2del = [] |
| | | for z in range(4,9): |
| | | server2del.append('description:%i' % z) |
| | | server1mods = [server1del] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_mod_del_single |
| | | #@TestID double_mod_del_single |
| | | #@TestPurpose Double mod_delete a single-valued attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with employeeNumber=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete employeeNumber |
| | | #@TestSteps server2: delete employeeNumber=1 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check employeeNumber no longer exists on either |
| | | server |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_009" scope="local"> |
| | | <testcase name="getTestCaseName('double_mod_del_single')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_mod_del_single. \ |
| | | Double mod_delete a single-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=C2') |
| | | myEntry.addAttr('employeeNumber', '1') |
| | | server1del = ['employeeNumber:'] |
| | | server2del = ['employeeNumber:1'] |
| | | server1mods = [server1del] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : 'delete' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'employeeNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_del_add_vs_mod_add_del_multi |
| | | #@TestID mod_del_add_vs_mod_add_del_multi |
| | | #@TestPurpose Modify: Delete+Add then Add+Delete on 2 |
| | | multi-valued attributes |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description=1 , telephoneNumber=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description=2 , |
| | | delete telephoneNumber |
| | | #@TestSteps server2: delete description , |
| | | add telephoneNumber=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description no longer exists and |
| | | telephoneNumber=2 on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_010" scope="local"> |
| | | <testcase name="getTestCaseName('mod_del_add_vs_mod_add_del_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \ |
| | | Modify: Delete+Add then Add+Delete on 2 multi-valued attributes' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=D1') |
| | | myEntry.addAttr('description', '1') |
| | | myEntry.addAttr('telephoneNumber', '1') |
| | | server1add = ['description:2'] |
| | | server1del = ['telephoneNumber:'] |
| | | server2del = ['description:'] |
| | | server2add = ['telephoneNumber:2'] |
| | | server1mods = [server1add, server1del] |
| | | server2mods = [server2del, server2add] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['add', 'delete'] |
| | | server2changetypes = ['delete', 'add'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][1], |
| | | 'changetype' : changetypes[i][1] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description telephoneNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description telephoneNumber', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_add_vs_mod_replace_multi |
| | | #@TestID mod_add_vs_mod_replace_multi |
| | | #@TestPurpose mod_add vs mod_replace on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add description={2 3} |
| | | #@TestSteps server2: replace description -> {4 5} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={4 5} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_011" scope="local"> |
| | | <testcase name="getTestCaseName('mod_add_vs_mod_replace_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: mod_add_vs_mod_replace_multi. \ |
| | | mod_add vs mod_replace on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=E1') |
| | | myEntry.addAttr('description', '1') |
| | | server1add = ['description:2', 'description:3'] |
| | | server2replace = ['description:4', 'description:5'] |
| | | server1mods = [server1add] |
| | | server2mods = [server2replace] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['add'] |
| | | server2changetypes = ['replace'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_replace_vs_mod_add_multi |
| | | #@TestID mod_replace_vs_mod_add_multi |
| | | #@TestPurpose mod_replace vs mod_add on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with description=1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {2 3} |
| | | #@TestSteps server2: add description={4 5} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={2 3 4 5} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_012" scope="local"> |
| | | <testcase name="getTestCaseName('mod_replace_vs_mod_add_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: mod_replace_vs_mod_add_multi. \ |
| | | mod_replace vs mod_add on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=E2') |
| | | myEntry.addAttr('description', '1') |
| | | server1replace = ['description:2', 'description:3'] |
| | | server2add = ['description:4', 'description:5'] |
| | | server1mods = [server1replace] |
| | | server2mods = [server2add] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['replace'] |
| | | server2changetypes = ['add'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_del_vs_mod_replace_multi |
| | | #@TestID mod_del_vs_mod_replace_multi |
| | | #@TestPurpose mod_del vs mod_replace on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description={1 2 3 4} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete description={2 3} |
| | | #@TestSteps server2: replace description -> {6 7 8 9 10} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={6 7 8 9 10} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_013" scope="local"> |
| | | <testcase name="getTestCaseName('mod_del_vs_mod_replace_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: mod_del_vs_mod_replace_multi. \ |
| | | mod_del vs mod_replace on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=F1') |
| | | for x in range(4): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1del = ['description:2', 'description:3'] |
| | | server2replace = [] |
| | | for y in range(6,11): |
| | | server2replace.append('description:%i' % y) |
| | | server1mods = [server1del] |
| | | server2mods = [server2replace] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['delete'] |
| | | server2changetypes = ['replace'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: |
| | | mod_replace_vs_mod_del_multi |
| | | #@TestID mod_replace_vs_mod_del_multi |
| | | #@TestPurpose mod_replace vs mod_del on a multi-valued |
| | | attribute |
| | | #@TestPreamble |
| | | #@TestSteps Add entry to server1 with |
| | | description={1 2 3 4} |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: replace description -> {1 2 3} |
| | | #@TestSteps server2: delete description={3 4} |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check description={1 2} on both servers |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_014" scope="local"> |
| | | <testcase name="getTestCaseName('mod_replace_vs_mod_del_multi')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: mod_replace_vs_mod_del_multi. \ |
| | | mod_replace vs mod_del on a multi-valued attribute' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | myEntry = Entry('cn=F2') |
| | | for x in range(4): |
| | | myEntry.addAttr('description', '%i' % (x+1)) |
| | | server1replace = ['description:1', 'description:2', |
| | | 'description:3'] |
| | | server2del = ['description:3', 'description:4'] |
| | | server1mods = [server1replace] |
| | | server2mods = [server2del] |
| | | mods = [server1mods, server2mods] |
| | | server1changetypes = ['replace'] |
| | | server2changetypes = ['delete'] |
| | | changetypes = [server1changetypes, server2changetypes] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : myEntry.getDn(), |
| | | 'listAttributes' : myEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : myEntry.getDn(), |
| | | 'listAttributes' : mods[i][0], |
| | | 'changetype' : changetypes[i][0] |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : myEntry.getDn(), |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'dsAttributes' : 'description', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </call> |
| | | |
| | | <!-- Delete added entry --> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [myEntry.getDn()] |
| | | } |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: add_child_del_parent |
| | | #@TestID add_child_del_parent |
| | | #@TestPurpose Add a child vs delete his parent |
| | | #@TestPreamble |
| | | #@TestSteps Add entry cn=P1 to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server2: add child cn=C1,cn=P1 |
| | | #@TestSteps server1: delete parent cn=P1 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_015" scope="local"> |
| | | <testcase name="getTestCaseName('add_child_del_parent')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: add_child_del_parent. \ |
| | | Add a child vs delete his parent' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | parentEntry = Entry('cn=P1') |
| | | parentEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | childEntry = Entry('cn=C1,cn=P1') |
| | | childEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | # addedEntries = [[], []] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : parentEntry.getDn(), |
| | | 'listAttributes' : parentEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Add child entry on server2 --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server2Host, |
| | | 'dsPath' : server2Path, |
| | | 'dsInstanceHost' : server2Host, |
| | | 'dsInstancePort' : server2.getPort(), |
| | | 'dsInstanceDn' : server2.getRootDn(), |
| | | 'dsInstancePswd' : server2.getRootPwd(), |
| | | 'DNToAdd' : childEntry.getDn(), |
| | | 'listAttributes' : childEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Delete parent entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [parentEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue 3891 |
| | | (Replication conflict: add child , delete parent) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | '3891' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: del_parent_add_child |
| | | #@TestID del_parent_add_child |
| | | #@TestPurpose Delete a parent vs add his child |
| | | #@TestPreamble |
| | | #@TestSteps Add entry cn=P2 to server1 |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: delete parent cn=P2 |
| | | #@TestSteps server2: add child cn=C2,cn=P2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_016" scope="local"> |
| | | <testcase name="getTestCaseName('del_parent_add_child')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: del_parent_add_child. \ |
| | | Delete a parent vs add his child' |
| | | </message> |
| | | |
| | | <!-- Add entry to server1 --> |
| | | <script> |
| | | parentEntry = Entry('cn=P2') |
| | | parentEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | childEntry = Entry('cn=C2,cn=P2') |
| | | childEntry.addAttr('givenname', 'DUMMY ENTRY') |
| | | # addedEntries = [[], []] |
| | | </script> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server1Host, |
| | | 'dsPath' : server1Path, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'DNToAdd' : parentEntry.getDn(), |
| | | 'listAttributes' : parentEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Delete parent entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [parentEntry.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Add child entry on server2 --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server2Host, |
| | | 'dsPath' : server2Path, |
| | | 'dsInstanceHost' : server2Host, |
| | | 'dsInstancePort' : server2.getPort(), |
| | | 'dsInstanceDn' : server2.getRootDn(), |
| | | 'dsInstancePswd' : server2.getRootPwd(), |
| | | 'DNToAdd' : childEntry.getDn(), |
| | | 'listAttributes' : childEntry.getAttrList() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue 4071 |
| | | (Replication conflict: delete parent, add child) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | '4071' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_add |
| | | #@TestID double_add |
| | | #@TestPurpose Double add (same dn, different uid) |
| | | #@TestPreamble |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add entry cn=F with uid=1 |
| | | #@TestSteps server2: add entry cn=F with uid=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_017" scope="local"> |
| | | <testcase name="getTestCaseName('double_add')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_add. \ |
| | | Double add (same dn, different uid)' |
| | | </message> |
| | | |
| | | <script> |
| | | entry1 = Entry('cn=F') |
| | | entry1.addAttr('uid', '1') |
| | | entry1.addAttr('givenname', 'DUMMY ENTRY') |
| | | entry2 = Entry('cn=F') |
| | | entry2.addAttr('uid', '2') |
| | | entry2.addAttr('givenname', 'DUMMY ENTRY') |
| | | |
| | | entriesToAdd = [entry1, entry2] |
| | | </script> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Add entry on one of the servers --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : entriesToAdd[i].getDn(), |
| | | 'listAttributes' : entriesToAdd[i].getAttrList() |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue OPENDJ-454 |
| | | (RFE: Solve naming conflict of 2 adds with same dn, different |
| | | attr value) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | 'OPENDJ-454' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | </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 Conflict Tests |
| | | #@TestName Replication: Conflict: double_add_single_del_1 |
| | | #@TestID double_add_single_del_1 |
| | | #@TestPurpose Add twice same dn, then delete it in one server |
| | | #@TestPreamble |
| | | #@TestSteps Disconnect Replication Servers |
| | | #@TestSteps server1: add entry cn=DN1 with uid=1 |
| | | #@TestSteps server2: add entry cn=DN1 with uid=2 |
| | | #@TestSteps Re-connect Replication Servers |
| | | #@TestSteps server1: delete entry cn=DN1 |
| | | #@TestSteps Check servers are synchronised |
| | | #@TestPostamble |
| | | #@TestResult Success if trees are synchronised |
| | | --> |
| | | <function name="replication_conflict_018" scope="local"> |
| | | <testcase name="getTestCaseName('double_add_single_del_1')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <message> |
| | | 'Replication: Conflict: double_add_single_del_1. \ |
| | | Add twice same dn, then delete it in one server' |
| | | </message> |
| | | |
| | | <script> |
| | | entry1 = Entry('cn=DN1') |
| | | entry1.addAttr('uid', '1') |
| | | entry1.addAttr('givenname', 'DUMMY ENTRY') |
| | | entry2 = Entry('cn=DN1') |
| | | entry2.addAttr('uid', '2') |
| | | entry2.addAttr('givenname', 'DUMMY ENTRY') |
| | | |
| | | entriesToAdd = [entry1, entry2] |
| | | </script> |
| | | |
| | | <!-- Disconnect Replication Servers --> |
| | | <call function="'disconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <iterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <!-- Add entry on one of the servers --> |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : entriesToAdd[i].getDn(), |
| | | 'listAttributes' : entriesToAdd[i].getAttrList() |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Check modifies have not been propagated --> |
| | | <paralleliterate var="server" in="[server1, server2]"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Reconnect Replication Servers --> |
| | | <call function="'reconnectReplicationServers'"> |
| | | [ clientHost, clientPath, [replServer1, replServer2] ] |
| | | </call> |
| | | |
| | | <!-- Delete entry on server1--> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server1Host, |
| | | 'dsInstancePort' : server1.getPort(), |
| | | 'dsInstanceDn' : server1.getRootDn(), |
| | | 'dsInstancePswd' : server1.getRootPwd(), |
| | | 'dsDn' : [entry1.getDn()] |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check conflict is resolved --> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <sequence> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : synchroSuffix, |
| | | 'dsFilter' : 'givenname=DUMMY ENTRY', |
| | | 'dsAttributes' : 'ds-sync-conflict uid cn', |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | <script> |
| | | resultDnList = [] |
| | | for line in searchResult.splitlines(): |
| | | if line.find('dn: ') != -1: |
| | | resultDn = line[len('dn: '):] |
| | | resultDnList.append(resultDn) |
| | | addedEntries[i] = resultDnList |
| | | </script> |
| | | </sequence> |
| | | <else> |
| | | <script> |
| | | addedEntries[i] = [] |
| | | </script> |
| | | </else> |
| | | </if> |
| | | |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : '%s/%s' \ |
| | | % (server.getDir(), OPENDSNAME), |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsBaseDN' : 'cn=monitor', |
| | | 'dsFilter' : monitorFilter, |
| | | 'dsAttributes' : monitorCounters, |
| | | 'logStderr' : False |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <if expr="resultLength != 0"> |
| | | <sequence> |
| | | <message> |
| | | '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \ |
| | | % (server.getHostname(), server.getPort(), searchResult) |
| | | </message> |
| | | </sequence> |
| | | </if> |
| | | </sequence> |
| | | </paralleliterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <!-- If the trees don't match, we may have come across Issue OPENDJ-454 |
| | | (RFE: Solve naming conflict of 2 adds with same dn, different |
| | | attr value) --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix, |
| | | 'OPENDJ-454' ] |
| | | </call> |
| | | |
| | | <!-- Delete added entries --> |
| | | <script> |
| | | list1 = addedEntries[0] |
| | | list2 = addedEntries[1] |
| | | toRemove = [] |
| | | # remove potential redundancies, to avoid deleting them twice |
| | | for addedEntry in list2: |
| | | if addedEntry in list1: |
| | | toRemove.append(addedEntry) |
| | | for ent in toRemove: |
| | | list2.remove(ent) |
| | | </script> |
| | | <paralleliterate var="server" |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | | </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> |
| | |
| | | ! 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. |
| | | ! trunk/opends/resource/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 |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! trunk/opends/resource/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 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! Copyright 2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <defaultcall function="replication_encryption"/> |
| | | |
| | | <function name="replication_encryption"> |
| | | |
| | | <function name="replication_encryption" scope="local"> |
| | | <sequence> |
| | | |
| | | <block name="'encryption'"> |
| | | |
| | | <sequence> |
| | | |
| | | <script> |
| | | if not CurrentTestPath.has_key('group'): |
| | | CurrentTestPath['group']='replication' |
| | | CurrentTestPath['suite']=STAXCurrentBlock |
| | | </script> |
| | | |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Encryption Tests |
| | | #@TestSuitePurpose Verify that replication can use an encrypted |
| | | channel. |
| | | #@TestSuiteID Encryption Tests |
| | | #@TestSuiteGroup Encryption |
| | | #@TestGroup Replication |
| | | #@TestScript replication_encryption.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'"> |
| | | { 'topologyFile' : '%s/3server_topology.txt' \ |
| | | % REPLICATION_CONFIG_DIR, |
| | | 'secureReplication': True, |
| | | 'dataFile' : 'Example.ldif', |
| | | 'label' : 'Replication Encryption' |
| | | } |
| | | </call> |
| | | |
| | | <script> |
| | | consumer = consumerList[0] |
| | | </script> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Add entry |
| | | #@TestID Add entry |
| | | #@TestPurpose Check entry add over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName('Add entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Add entry. Check entry add over \ |
| | | secured replication' |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | <block name="'replication_encryption'"> |
| | | <try> |
| | | <sequence> |
| | | <script> |
| | | CurrentTestPath['group'] = 'replication' |
| | | CurrentTestPath['suite'] = 'encryption' |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | _group=CurrentTestPath['group'] |
| | | _groupdir='%s/testcases/%s' % (TESTS_DIR,_group) |
| | | _label = 'Replication Encryption' |
| | | </script> |
| | | |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Add entry after restart |
| | | #@TestID Add entry after restart |
| | | #@TestPurpose Check entry add over secured replication after |
| | | server restart |
| | | #@TestPreamble |
| | | #@TestSteps Restart servers |
| | | #@TestSteps Add entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <testcase name="getTestCaseName('Add entry after restart')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Add entry after restart. \ |
| | | Check entry add over secured replication after server restart' |
| | | </message> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \ |
| | | (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Modify entry |
| | | #@TestID Modify entry |
| | | #@TestPurpose Check entry modify over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName('Modify entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Modify entry. Check entry modify \ |
| | | over secured replication' |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : userDn, |
| | | 'attributeName' : 'l', |
| | | 'newAttributeValue' : 'GEC', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix, ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Delete entry |
| | | #@TestID Delete entry |
| | | #@TestPurpose Check entry delete over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName('Delete entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Delete entry. Check delete modify \ |
| | | over secured replication' |
| | | </message> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Delete entry on one of the servers --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort() , |
| | | 'dsInstanceDn' : server.getRootDn() , |
| | | 'dsInstancePswd' : server.getRootPwd() , |
| | | 'dsBaseDN' : userDn |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - add |
| | | binary attribute |
| | | #@TestID Modify Entry - add binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - add binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Modify Entry - add binary attribute. \ |
| | | Check that an entry modify is well propagated by secured \ |
| | | replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_add_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo1.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'add' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - |
| | | replace binary attribute |
| | | #@TestID Modify Entry - replace binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - replace binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Modify Entry - replace binary \ |
| | | attribute. \ |
| | | Check that an entry modify is well propagated by secured \ |
| | | replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_replace_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo2.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'replace' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, |
| | | binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - |
| | | delete binary attribute |
| | | #@TestID Modify Entry - delete binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Modify Entry - delete binary attribute')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Modify Entry - delete binary \ |
| | | attribute. \ |
| | | Check that an entry modify is well propagated by secured \ |
| | | replication.' |
| | | </message> |
| | | |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'jpegPhoto' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix, ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Entry |
| | | #@TestID Rename Entry |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName('Rename Entry')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Rename Entry. Check that a rename \ |
| | | (modrdn) operation is well propagated by secured replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=kvaughan2' |
| | | newsuperior = None |
| | | deleteoldrdn = 1 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=kvaughan2, ou=People, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Entry |
| | | (preserving old rdn) |
| | | #@TestID Rename Entry (preserving old rdn) |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName |
| | | ('Rename Entry (preserving old rdn)')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Rename Entry (preserving old rdn). \ |
| | | Check that a rename (modrdn) operation is well propagated by \ |
| | | secured replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn_preserve.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=jwallace, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=igueye' |
| | | newsuperior = None |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=igueye, ou=People, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'uid=jwallace' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Subtree |
| | | #@TestID Rename Subtree |
| | | #@TestPurpose Check that a subtree rename (moddn) operation |
| | | is well propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <testcase name="getTestCaseName('Rename Subtree')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Encryption: Rename Subtree. Check that a \ |
| | | subtree rename (moddn) operation is well propagated by \ |
| | | secured replication.' |
| | | </message> |
| | | |
| | | <script> |
| | | filename = 'replication_moddn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'ou=People,%s' % synchroSuffix |
| | | newrdn = 'ou=Special People' |
| | | newsuperior = 'ou=Special Users,%s' % synchroSuffix |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=gfarmer, ou=Special People, |
| | | ou=Special Users, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=Special People, \ |
| | | ou=Special Users,%s' % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Verify the synchronization of the trees among the servers in |
| | | the topology --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, master, consumerList, synchroSuffix ] |
| | | </call> |
| | | |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'" > |
| | | { 'label' : 'Replication Encryption' } |
| | | </call> |
| | | |
| | | <call function="'testSuite_Postamble'"/> |
| | | <!--- Test Suite information |
| | | #@TestSuiteName Replication Encryption Tests |
| | | #@TestSuitePurpose Verify that the encrypted operations are replicated |
| | | correctly between two servers. |
| | | #@TestSuiteID Encryption Tests |
| | | #@TestSuiteGroup Encryption |
| | | #@TestGroup Replication |
| | | #@TestScript replication_encryption.xml |
| | | #@TestHTMLLink http://www.forgerock.org/ |
| | | --> |
| | | |
| | | </sequence> |
| | | <call function="'testSuite_Preamble'"/> |
| | | |
| | | <try> |
| | | <sequence> |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_setup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_setup'"> |
| | | { 'topologyFile' : '%s/3server_topology.txt' \ |
| | | % REPLICATION_CONFIG_DIR, |
| | | 'secureReplication': True, |
| | | 'dataFile' : 'Example.ldif', |
| | | 'label' : 'Replication Encryption' |
| | | } |
| | | </call> |
| | | |
| | | <!-- List of Import of Test Functions --> |
| | | <script> |
| | | importList=[] |
| | | importList.append('encryption/encryption_tests') |
| | | </script> |
| | | |
| | | <!-- Import the files for this test suite --> |
| | | <iterate var="_import" in="importList"> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/%s.xml' % (_groupdir,_import)"/> |
| | | </iterate> |
| | | |
| | | <!-- Specific to replication tests --> |
| | | <script> |
| | | msg1 = 'Replication: Encryption:' |
| | | consumer = consumerList[0] |
| | | </script> |
| | | |
| | | <!-- List of Test Cases --> |
| | | <script> |
| | | testsList=[] |
| | | testsList.append('replication_encryption_001') |
| | | testsList.append('replication_encryption_002') |
| | | testsList.append('replication_encryption_003') |
| | | testsList.append('replication_encryption_004') |
| | | testsList.append('replication_encryption_005') |
| | | testsList.append('replication_encryption_006') |
| | | testsList.append('replication_encryption_007') |
| | | testsList.append('replication_encryption_008') |
| | | testsList.append('replication_encryption_009') |
| | | testsList.append('replication_encryption_010') |
| | | </script> |
| | | |
| | | <!-- Execute the Tests --> |
| | | <iterate var="__test" in="testsList"> |
| | | <sequence> |
| | | <call function="'%s' % (__test)" /> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | </sequence> |
| | | |
| | | <catch exception="'STAFException.TestSuite.SetupException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'"> |
| | | 'Setup of test suite failed.' |
| | | </message> |
| | | <rethrow/> |
| | | </sequence> |
| | | </catch> |
| | | |
| | | <finally> |
| | | <message>'Test Cases Completed.'</message> |
| | | </finally> |
| | | |
| | | </try> |
| | | |
| | | </sequence> |
| | | |
| | | <finally> |
| | | <sequence> |
| | | <!-- Test Suite Cleanup --> |
| | | <message>'Finally: Replication Cleanup.'</message> |
| | | <try> |
| | | <sequence> |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |
| | | <call function="'replication_cleanup'"> |
| | | { 'label' : _label } |
| | | </call> |
| | | </sequence> |
| | | <catch exception="'STAFException'"> |
| | | <sequence> |
| | | <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message> |
| | | </sequence> |
| | | </catch> |
| | | <finally> |
| | | <call function="'testSuite_Postamble'"/> |
| | | </finally> |
| | | </try> |
| | | </sequence> |
| | | </finally> |
| | | |
| | | </try> |
| | | </block> |
| | | |
| | | </sequence> |
| | | |
| | | </function> |
| | | |
| | | </stax> |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| | | <!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd"> |
| | | <!-- |
| | | ! CDDL HEADER START |
| | | ! |
| | | ! The contents of this file are subject to the terms of the |
| | | ! Common Development and Distribution License, Version 1.0 only |
| | | ! (the "License"). You may not use this file except in compliance |
| | | ! with the License. |
| | | ! |
| | | ! You can obtain a copy of the license at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE |
| | | ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. |
| | | ! See the License for the specific language governing permissions |
| | | ! and limitations under the License. |
| | | ! |
| | | ! When distributing Covered Code, include this CDDL HEADER in each |
| | | ! file and include the License file at |
| | | ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, |
| | | ! add the following below this CDDL HEADER, with the fields enclosed |
| | | ! by brackets "[]" replaced with your own identifying information: |
| | | ! Portions Copyright [yyyy] [name of copyright owner] |
| | | ! |
| | | ! CDDL HEADER END |
| | | ! |
| | | ! Copyright 2007-2010 Sun Microsystems, Inc. |
| | | ! Portions Copyright 2011-2012 ForgeRock AS. |
| | | ! --> |
| | | <stax> |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Encryption Tests |
| | | #@TestName Replication: Encryption: Add entry |
| | | #@TestID Add entry |
| | | #@TestPurpose Check entry add over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_001" scope="local"> |
| | | <testcase name="getTestCaseName('Add entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check entry add over secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Add entry after restart |
| | | #@TestID Add entry after restart |
| | | #@TestPurpose Check entry add over secured replication after |
| | | server restart |
| | | #@TestPreamble |
| | | #@TestSteps Restart servers |
| | | #@TestSteps Add entry |
| | | #@TestPostamble |
| | | #@TestResult Success if trees synchronised over the topology |
| | | --> |
| | | <function name="replication_encryption_002" scope="local"> |
| | | <testcase name="getTestCaseName('Add entry after restart')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 } |
| | | </call> |
| | | |
| | | <!-- Stop the servers in the topology --> |
| | | <call function="'stopServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <!-- Start the servers in the topology --> |
| | | <call function="'startServers'"> |
| | | [_splitServerList] |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \ |
| | | (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Add entry to one of the other servers --> |
| | | <script> |
| | | listAttr = [] |
| | | listAttr.append('objectclass:top') |
| | | listAttr.append('objectclass:organizationalperson') |
| | | listAttr.append('objectclass:inetorgperson') |
| | | listAttr.append('objectclass:person') |
| | | listAttr.append('givenname:Izen-%s' % i) |
| | | listAttr.append('sn:Abizen-%s' % i) |
| | | listAttr.append('cn:Izen-%s Abizen-%s' % (i, i)) |
| | | listAttr.append('l:ICNC') |
| | | </script> |
| | | |
| | | <call function="'addAnEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToAdd' : userDn, |
| | | 'listAttributes' : listAttr |
| | | } |
| | | </call> |
| | | |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Modify entry |
| | | #@TestID Modify entry |
| | | #@TestPurpose Check entry modify over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_003" scope="local"> |
| | | <testcase name="getTestCaseName('Modify entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check entry modify secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Modify entry on one of the servers --> |
| | | <call function="'modifyAnAttribute'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'DNToModify' : userDn, |
| | | 'attributeName' : 'l', |
| | | 'newAttributeValue' : 'GEC', |
| | | 'changetype' : 'replace' |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Delete entry |
| | | #@TestID Delete entry |
| | | #@TestPurpose Check entry delete over secured replication |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_004" scope="local"> |
| | | <testcase name="getTestCaseName('Delete entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check delete entry secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <iterate var="server" in="_topologyServerList" indexvar="i"> |
| | | <sequence> |
| | | <script> |
| | | serverPath = '%s/%s' % (server.getDir(), OPENDSNAME) |
| | | userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix) |
| | | </script> |
| | | |
| | | <!-- Delete entry on one of the servers --> |
| | | <call function="'DeleteEntry'"> |
| | | { 'location' : server.getHostname(), |
| | | 'dsPath' : serverPath, |
| | | 'dsInstanceHost' : server.getHostname(), |
| | | 'dsInstancePort' : server.getPort() , |
| | | 'dsInstanceDn' : server.getRootDn() , |
| | | 'dsInstancePswd' : server.getRootPwd() , |
| | | 'dsBaseDN' : userDn |
| | | } |
| | | </call> |
| | | </sequence> |
| | | </iterate> |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - add |
| | | binary attribute |
| | | #@TestID Modify Entry - add binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_005" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - add binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_add_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo1.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'add' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - |
| | | replace binary attribute |
| | | #@TestID Modify Entry - replace binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_006" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - replace binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_replace_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | binaryFilePath = '%s/replication/photo2.uu' % source.data |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'replace' |
| | | attrType = 'jpegPhoto' |
| | | write_replication_mod_binary_ldif_file(filePath, dn, modif, |
| | | attrType, |
| | | binaryFilePath) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Modify Entry - |
| | | delete binary attribute |
| | | #@TestID Modify Entry - delete binary attribute |
| | | #@TestPurpose Check that an entry modify is well propagated |
| | | by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_007" scope="local"> |
| | | <testcase name="getTestCaseName('Modify Entry - delete binary attribute')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that an entry modify is well propagated by secured secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_mod_delete_binary.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=hmiller, ou=People,%s' % synchroSuffix |
| | | modif = 'delete' |
| | | attrType = 'jpegPhoto' |
| | | attrValue = None |
| | | write_replication_mod_ldif_file(filePath, dn, modif, attrType, |
| | | attrValue) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'jpegPhoto=*', |
| | | 'expectedRC' : 0 |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 0 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Entry |
| | | #@TestID Rename Entry |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_008" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Entry')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%sCheck that a rename entry (modrdn) operation is well propagated by secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=kvaughan2' |
| | | newsuperior = None |
| | | deleteoldrdn = 1 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=kvaughan2, ou=People, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Entry |
| | | (preserving old rdn) |
| | | #@TestID Rename Entry (preserving old rdn) |
| | | #@TestPurpose Check that a rename (modrdn) operation is well |
| | | propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_009" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a rename (modrdn) operation is well propagated by secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_modrdn_preserve.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'uid=jwallace, ou=People,%s' % synchroSuffix |
| | | newrdn = 'uid=igueye' |
| | | newsuperior = None |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() |
| | | } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=igueye, ou=People, |
| | | ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix, |
| | | 'dsFilter' : 'uid=jwallace' |
| | | } |
| | | </call> |
| | | <script> |
| | | searchRC = STAXResult[0][0] |
| | | searchResult = STAXResult[0][1] |
| | | resultLength = len(searchResult) > 0 |
| | | </script> |
| | | <call function="'checktestRC'"> |
| | | { 'returncode' : resultLength , |
| | | 'result' : searchResult , |
| | | 'expected' : 1 |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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 Encryption Tests |
| | | #@TestName Replication: Encryption: Rename Subtree |
| | | #@TestID Rename Subtree |
| | | #@TestPurpose Check that a subtree rename (moddn) operation |
| | | is well propagated by secured replication. |
| | | #@TestPreamble |
| | | #@TestSteps |
| | | #@TestPostamble |
| | | #@TestResult |
| | | --> |
| | | <function name="replication_encryption_010" scope="local"> |
| | | <testcase name="getTestCaseName('Rename Subtree')"> |
| | | <sequence> |
| | | <try> |
| | | <sequence> |
| | | |
| | | <call function="'testCase_Preamble'"/> |
| | | |
| | | <message> |
| | | 'Test Name = %s' % STAXCurrentTestcase |
| | | </message> |
| | | |
| | | <call function="'testStep'"> |
| | | { 'stepMessage' : '%s Check that a subtree rename (moddn) operation is well propagated by secured replication.' % msg1 } |
| | | </call> |
| | | |
| | | <script> |
| | | filename = 'replication_moddn.ldif' |
| | | filePath = '%s/%s' % (local.temp,filename) |
| | | dn = 'ou=People,%s' % synchroSuffix |
| | | newrdn = 'ou=Special People' |
| | | newsuperior = 'ou=Special Users,%s' % synchroSuffix |
| | | deleteoldrdn = 0 |
| | | write_replication_moddn_ldif_file(filePath, dn, newrdn, |
| | | newsuperior, deleteoldrdn) |
| | | </script> |
| | | |
| | | <!-- Copy the replication_mod ldif to client host --> |
| | | <message> |
| | | 'Copy %s file from %s to %s' % (filename,local.temp, |
| | | client.getTmpDir()) |
| | | </message> |
| | | <call function="'copyFile'"> |
| | | { 'srcfile' : filePath, |
| | | 'destfile' : '%s/%s' % (client.getTmpDir(),filename), |
| | | 'remotehost' : client.getHostname() } |
| | | </call> |
| | | |
| | | <!-- Modify "master" server --> |
| | | <call function="'ldapModifyWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename) |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- Check modify worked on "master" server --> |
| | | <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" |
| | | does NOT exist anymore --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \ |
| | | % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*', |
| | | 'expectedRC' : 32 |
| | | } |
| | | </call> |
| | | |
| | | <!-- check that new entry "uid=gfarmer, ou=Special People, |
| | | ou=Special Users, ${DIRECTORY_BASE}" exists --> |
| | | <call function="'ldapSearchWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | | 'dsInstanceHost' : masterHost , |
| | | 'dsInstancePort' : master.getPort() , |
| | | 'dsInstanceDn' : master.getRootDn() , |
| | | 'dsInstancePswd' : master.getRootPwd() , |
| | | 'dsBaseDN' : 'uid=gfarmer, ou=Special People, \ |
| | | ou=Special Users,%s' % synchroSuffix, |
| | | 'dsFilter' : 'objectclass=*' |
| | | } |
| | | </call> |
| | | |
| | | |
| | | <!-- 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> |
| opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml
opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml
opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml
opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml
opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml
opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml
opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml |