<?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-2008 Sun Microsystems, Inc.
|
! -->
|
<stax>
|
|
<defaultcall function="replication_setup"/>
|
|
<function name="replication_setup">
|
<function-map-args>
|
<function-arg-def name="topologyFile"
|
type="optional"
|
default="'%s/config/replication/basic_topology.txt'
|
% TESTS_DIR">
|
<function-arg-description>
|
Pathname to file describing the topology.
|
</function-arg-description>
|
<function-arg-property name="type" value="filepath"/>
|
</function-arg-def>
|
<function-arg-def name="secureReplication"
|
type="optional"
|
default="None">
|
<function-arg-description>
|
Encrypt replication channels
|
</function-arg-description>
|
<function-arg-property name="type" value="boolean"/>
|
</function-arg-def>
|
<function-arg-def name="dataFile"
|
type="optional"
|
default="None">
|
<function-arg-description>
|
Name of the data file within shared/data/replication/ for suffix
|
initialisation.
|
If no filename provided (default), the topology won't be initialised.
|
If a filename provided, after initialisation the suffix will be
|
backuped under masterBackupDir.
|
</function-arg-description>
|
<function-arg-property name="type" value="filename"/>
|
</function-arg-def>
|
<function-arg-def name="isolateLdapServers"
|
type="optional"
|
default="None">
|
<function-arg-description>
|
Break the cross-reference between Ldap Servers and Replication Servers
|
(i.e. make LS1 point to RS1 exclusively, LS2 to RS2, etc.)
|
</function-arg-description>
|
<function-arg-property name="type" value="boolean"/>
|
</function-arg-def>
|
<function-arg-def name="enableDebugLogs"
|
type="optional"
|
default="None">
|
<function-arg-description>
|
Enable de debug logs
|
</function-arg-description>
|
<function-arg-property name="type" value="boolean"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
|
<block name="'replication-setup'">
|
|
<sequence>
|
|
<message>
|
'Create DS topology as described in %s' % topologyFile
|
</message>
|
|
<script>
|
try:
|
if REPLICATION_CONFIG_FILE:
|
topologyFile=REPLICATION_CONFIG_FILE
|
except NameError:
|
topologyFile=topologyFile
|
</script>
|
|
<call function="'createTopology'">
|
{ 'topologyDescFile' : topologyFile,
|
'sharedDataFolder' : 'replication'
|
}
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC ,
|
'result' : STAXResult
|
}
|
</call>
|
|
<!-- Setup variables -->
|
<script>
|
client = _topologyServerList[0]
|
clientHost = client.getHostname()
|
clientPath = '%s/%s' % (client.getDir(),OPENDSNAME)
|
clientDataDir = '%s/%s' % (client.getDir(),relativeDataDir)
|
|
server1 = _topologyServerList[0]
|
server2 = _topologyServerList[1]
|
|
master = _topologyServerList[0]
|
masterHost = master.getHostname()
|
masterReplicationServer = master.getChangelogServer()
|
masterPath = '%s/%s' % (master.getDir(),OPENDSNAME)
|
masterDataDir = '%s/%s' % (master.getDir(),relativeDataDir)
|
synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
|
masterBackupDir = '%s/replication/master_backup' % masterDataDir
|
|
consumerList = _topologyServerList[1:]
|
|
domainMap = {}
|
</script>
|
|
<if expr="dataFile">
|
<sequence>
|
<script>
|
importDataFile = '%s/replication/%s' % (masterDataDir, dataFile)
|
</script>
|
|
<message>
|
'Import data from %s into server %s:%s' \
|
% (importDataFile, masterHost, master.getPort())
|
</message>
|
|
<!-- Import data into "master" Directory Server -->
|
<call function="'ImportLdifWithScript'">
|
{ 'location' : masterHost,
|
'dsPath' : masterPath,
|
'dsBackEnd' : 'userRoot',
|
'dsLdifFile' : importDataFile
|
}
|
</call>
|
|
<!-- Backup "master" server -->
|
<call function="'backup'">
|
{ 'location' : masterHost,
|
'dsPath' : masterPath,
|
'backupDir' : masterBackupDir
|
}
|
</call>
|
</sequence>
|
</if>
|
|
|
<!-- Start the servers in the topology -->
|
<call function="'startServers'">
|
[_topologyServerList]
|
</call>
|
|
|
<iterate var="server" in="consumerList">
|
<sequence>
|
<!-- Configure replication if required so by the server
|
! (i.e. server is a changelog server and/or has synchronized
|
! suffixes)
|
-->
|
<if expr="server.requiresSynchronization()">
|
<sequence>
|
<message>
|
'Instance requires REPLICATION configuration.'
|
</message>
|
|
<script>
|
replicationServer = server.getChangelogServer()
|
replicatedSuffixList = server.getSynchronizedSuffixList()
|
replicatedDnList = []
|
for suffix in replicatedSuffixList:
|
replicatedDnList.append(suffix.getSuffixDn())
|
</script>
|
|
<message>
|
'Enable replication for server:\nHost: %s\nLdap port: %s\n\
|
Replication port: %s\nReplicated DN list: %s' \
|
% (server.getHostname(), server.getPort(),
|
replicationServer.getPort(), replicatedDnList)
|
</message>
|
|
<call function="'enableReplication'">
|
{ 'location' : clientHost,
|
'dsPath' : clientPath,
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'dsReplicationPort' : replicationServer.getPort(),
|
'dsSecureReplication' : secureReplication,
|
'refInstanceHost' : masterHost,
|
'refInstancePort' : master.getPort(),
|
'refInstanceDn' : master.getRootDn(),
|
'refInstancePswd' : master.getRootPwd(),
|
'refReplicationPort' : masterReplicationServer.getPort(),
|
'refSecureReplication' : secureReplication,
|
'replicationDnList' : replicatedDnList,
|
'useSecondServerAsSchemaSource' : True
|
}
|
</call>
|
</sequence>
|
</if>
|
|
</sequence>
|
</iterate>
|
|
|
<if expr="isolateLdapServers">
|
<!-- Make each Ldap Server point only to its own Replication
|
! Server.
|
! This is used by the Conflict testsuite, in order to be able
|
! to simulate conflict scenarios -->
|
<paralleliterate var="server" in="_topologyServerList">
|
<sequence>
|
<script>
|
ldapServer = '%s:%s' % (server.getHostname(),
|
server.getPort())
|
</script>
|
|
<!-- Retrieve replication-domain name -->
|
<call function="'dsconfig'">
|
{ 'location' : server.getHostname(),
|
'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'subcommand' : 'list-replication-domains',
|
'objectType' : 'provider-name',
|
'objectName' : 'Multimaster Synchronization',
|
'optionsString' : '--script-friendly'
|
}
|
</call>
|
<if expr='RC == 0'>
|
<script>
|
replicationDomains = STAXResult[0][1]
|
for line in replicationDomains.splitlines():
|
if line.find(synchroSuffix) != -1:
|
domain = line
|
domainMap[ldapServer] = domain
|
break
|
</script>
|
</if>
|
|
<script>
|
replicationServer = server.getChangelogServer()
|
replServer = '%s:%s' % (server.getHostname(),
|
replicationServer.getPort())
|
options = '--domain-name "%s" --set replication-server:%s' \
|
% (domainMap[ldapServer], replServer)
|
</script>
|
<message>
|
'Removing references to other replication servers \nfor \
|
domain: %s \nfrom server: %s \nkeep replication server: %s' \
|
% (domain, ldapServer, replServer)
|
</message>
|
<!-- Remove peer RS from replicated domain -->
|
<call function="'dsconfig'">
|
{ 'location' : server.getHostname(),
|
'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'subcommand' : 'set-replication-domain-prop',
|
'objectType' : 'provider-name',
|
'objectName' : 'Multimaster Synchronization',
|
'optionsString' : options
|
}
|
</call>
|
</sequence>
|
</paralleliterate>
|
</if>
|
|
|
<if expr="dataFile">
|
<sequence>
|
<message>
|
'Initialise topology from %s:%s' \
|
% (masterHost, master.getPort())
|
</message>
|
|
<!-- Initialise the servers in the topology -->
|
<call function="'initializeReplication'">
|
{ 'location' : clientHost,
|
'dsPath' : clientPath,
|
'sourceInstanceHost' : masterHost,
|
'sourceInstancePort' : master.getPort(),
|
'replicationDnList' : [synchroSuffix]
|
}
|
</call>
|
<if expr="0">
|
<iterate var="server" in="consumerList">
|
<sequence>
|
<!-- <call function="'initializeReplication'">
|
{ 'location' : clientHost,
|
'dsPath' : clientPath,
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'sourceInstanceHost' : masterHost,
|
'sourceInstancePort' : master.getPort(),
|
'replicationDnList' : [synchroSuffix]
|
}
|
</call> -->
|
|
<!-- Search initialisation task to check its status -->
|
<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=Tasks',
|
'dsFilter' : 'ds-task-initialize-domain-dn=%s' \
|
% synchroSuffix
|
}
|
</call>
|
<script>
|
searchRC = STAXResult[0][0]
|
searchResult = STAXResult[0][1]
|
resultLength = len(searchResult) > 0
|
</script>
|
<if expr="resultLength != 0">
|
<sequence>
|
<message>
|
'++++++++ INITIALISATION TASK for %s:%s ++++++++\n%s' \
|
% (server.getHostname(), server.getPort(), searchResult)
|
</message>
|
</sequence>
|
</if>
|
</sequence>
|
</iterate>
|
</if>
|
|
</sequence>
|
</if>
|
|
<if expr="enableDebugLogs">
|
<paralleliterate var="server" in="_topologyServerList">
|
<sequence>
|
<!-- Set the debug logger to "enabled" -->
|
<call function="'dsconfigSet'">
|
{ 'location' : server.getHostname(),
|
'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'objectName' : 'log-publisher',
|
'propertyType' : 'publisher',
|
'propertyName' : 'File-based Debug Logger',
|
'attributeName' : 'enabled',
|
'attributeValue' : 'true'
|
}
|
</call>
|
<!-- Set the debug level to "info" -->
|
<call function="'dsconfigSet'">
|
{ 'location' : server.getHostname(),
|
'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'objectName' : 'log-publisher',
|
'propertyType' : 'publisher',
|
'propertyName' : 'File-based Debug Logger',
|
'attributeName' : 'default-debug-level',
|
'attributeValue' : 'info'
|
}
|
</call>
|
<!-- Set the debug logger log file to "logs/errors" -->
|
<call function="'dsconfigSet'">
|
{ 'location' : server.getHostname(),
|
'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
|
'dsInstanceHost' : server.getHostname(),
|
'dsInstancePort' : server.getPort(),
|
'dsInstanceDn' : server.getRootDn(),
|
'dsInstancePswd' : server.getRootPwd(),
|
'objectName' : 'log-publisher',
|
'propertyType' : 'publisher',
|
'propertyName' : 'File-based Debug Logger',
|
'attributeName' : 'log-file',
|
'attributeValue' : 'logs/errors'
|
}
|
</call>
|
</sequence>
|
</paralleliterate>
|
</if>
|
|
</sequence>
|
|
</block>
|
|
</sequence>
|
|
</function>
|
|
</stax>
|