| | |
| | | <!-- ============================================== --> |
| | | <!-- ============================================== --> |
| | | |
| | | |
| | | <!--- Test Case information |
| | | #@TestMarker Replication Conflict Tests |
| | | #@TestName Replication: Conflict: Basic check |
| | |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : addedEntries[i] |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | |
| | | in="[server1, server2]" |
| | | indexvar="i"> |
| | | <if expr="len(addedEntries[i]) != 0"> |
| | | <paralleliterate var="entryToDelete" in="addedEntries[i]"> |
| | | <call function="'ldapDeleteWithScript'"> |
| | | { 'location' : clientHost, |
| | | 'dsPath' : clientPath, |
| | |
| | | 'dsInstancePort' : server.getPort(), |
| | | 'dsInstanceDn' : server.getRootDn(), |
| | | 'dsInstancePswd' : server.getRootPwd(), |
| | | 'dsDn' : addedEntries[i] |
| | | 'dsDn' : [entryToDelete] |
| | | } |
| | | </call> |
| | | </paralleliterate> |
| | | </if> |
| | | </paralleliterate> |
| | | |
| | |
| | | </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, [server1, server2] ] |
| | | </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, [server1, server2] ] |
| | | </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 --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </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> |
| | | |
| | | <script> |
| | | knownIssue(3401) |
| | | </script> |
| | | |
| | | <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')"> |
| | | <sequence> |
| | | <call function="'testCase_Preamble'"/> |
| | | <message> |
| | | 'Replication: Conflict: double_add. \ |
| | | Double add (same dn, different uid)' |
| | | </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, [server1, server2] ] |
| | | </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, [server1, server2] ] |
| | | </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 --> |
| | | <call function="'verifyTrees'"> |
| | | [ clientHost, clientPath, server1, [server2], synchroSuffix ] |
| | | </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> |
| | | |
| | | <script> |
| | | knownIssue(3401) |
| | | </script> |
| | | |
| | | <call function="'testCase_Postamble'"/> |
| | | </sequence> |
| | | </testcase> |
| | | |
| | | |
| | | |
| | | <import machine="STAF_LOCAL_HOSTNAME" |
| | | file="'%s/testcases/replication/replication_cleanup.xml' |
| | | % (TESTS_DIR)"/> |