<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<!DOCTYPE stax SYSTEM "../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-2007 Sun Microsystems, Inc.
|
! -->
|
<stax>
|
<function name="createTopology">
|
<function-prolog>
|
This function creates the topology required by the Test Group/Suite.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="topologyDescFile" type="optional" default="None">
|
<function-arg-description>
|
Topology Description file
|
</function-arg-description>
|
<function-arg-property name="type" value="filePath"/>
|
</function-arg-def>
|
<function-arg-def name="initialiseInstance" type="optional" default="False">
|
<function-arg-description>
|
Specifies whether the instance should be initialised with some default data.
|
</function-arg-description>
|
<function-arg-property name="type" value="boolean"/>
|
</function-arg-def>
|
<function-arg-def name="sharedDataFolder" type="optional" default="''">
|
<function-arg-description>
|
Specifies a relative folder that holds the shared data for the tests
|
</function-arg-description>
|
<function-arg-property name="type" value="string"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
<script>
|
if not sharedDataFolder and CurrentTestPath.has_key('group'):
|
sharedDataFolder=CurrentTestPath['group']
|
</script>
|
|
<call function="'prepareInstanceCreation'">
|
{ 'groupDataDir' : sharedDataFolder }
|
</call>
|
|
<if expr="topologyDescFile == None">
|
<!-- SINGLE instance deployment: read parameters from config.py (done by default) -->
|
<sequence>
|
<message>
|
'SINGLE instance deployment: read parameters from config.py'
|
</message>
|
<call function="'createInstance'" />
|
<if expr="RC == 0 and initialiseInstance == True">
|
<sequence>
|
<!-- Load the server with default data -->
|
<import machine="STAF_LOCAL_HOSTNAME"
|
file="'%s/testcases/quickstart/quickstart.xml' % (TESTS_DIR)" />
|
<call function="'main_quickstart'"/>
|
</sequence>
|
</if>
|
</sequence>
|
<else>
|
<!-- MULTIPLE instance deployment: read parameters from topologyDescFile -->
|
<sequence>
|
<message>
|
'MULTIPLE instance deployment: read parameters from %s' % topologyDescFile
|
</message>
|
|
<!-- Parse the topology description file and set _topologyServerList -->
|
<call function="'readTopology'">
|
{ 'file' : topologyDescFile }
|
</call>
|
|
<message>
|
'Number of server instances required by the deployment: %s' % len(_topologyServerList)
|
</message>
|
|
<iterate var="server" in="_topologyServerList">
|
<sequence>
|
<!-- Create the instance-->
|
<call function="'createInstance'">
|
{ 'dsHost' : server.getHostname(),
|
'dsDir' : server.getDir(),
|
'dsPort' : server.getPort(),
|
'dsSslPort' : server.getSslPort(),
|
'dsJmxPort' : server.getJmxPort(),
|
'dsBindDN' : server.getRootDn(),
|
'dsBindPwd' : server.getRootPwd(),
|
'dsBaseDN' : server.getBaseDn()
|
}
|
</call>
|
|
<!-- 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>
|
<call function="'configureReplication'">
|
[server]
|
</call>
|
</sequence>
|
</if>
|
-->
|
</sequence>
|
</iterate>
|
</sequence>
|
</else>
|
</if>
|
</sequence>
|
</function>
|
|
|
|
<function name="prepareInstanceCreation">
|
<function-prolog>
|
This function prepares locally the necessary
|
files to create an instance: data zip file and OpenDS zip file.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="groupDataDir" type="optional" default="''">
|
<function-arg-description>
|
Specifies a relative folder that holds the shared data for the test group
|
</function-arg-description>
|
<function-arg-property name="type" value="string"/>
|
</function-arg-def>
|
</function-map-args>
|
<sequence>
|
<!-- ON LOCAL HOST: get data ready to copy to remote host -->
|
<script>
|
testsGroupDir='%s/%s/%s' % (TESTS_DIR,relativeDataDir,groupDataDir)
|
localTestsGroupDir='%s/%s' % (logsLocalDataDir,groupDataDir)
|
remoteTestsGroupDir='%s/%s' % (logsRemoteDataDir,groupDataDir)
|
</script>
|
|
<call function="'GetEntry'">
|
{ 'location' : STAXServiceMachine,
|
'entry' : localTestsGroupDir,
|
'attribute' : 'TYPE' }
|
</call>
|
|
<!-- If the test data is already created then don't redo it -->
|
<if expr="RC == 48">
|
<sequence>
|
|
<!-- Locally copy static data files to temporary staging area -->
|
<!-- LDIF (.ldif) test data files -->
|
<message>
|
'Copy ldif data files locally to %s.' % localTestsGroupDir
|
</message>
|
<call function="'CopyFolderByExtension'">
|
{ 'location' : STAXServiceMachine,
|
'srcfolder' : testsGroupDir,
|
'destfolder' : localTestsGroupDir,
|
'extension' : 'ldif'
|
}
|
</call>
|
|
<!-- LDIF (.ldif) files for quickinstall -->
|
<script>
|
quickStartGroupDir='%s/%s/quickstart' % (TESTS_DIR,relativeDataDir)
|
quickStartLocalTestsGroupDir='%s/quickstart' % (logsLocalDataDir)
|
</script>
|
<message>
|
'Copy ldif data files locally to %s.' % quickStartLocalTestsGroupDir
|
</message>
|
<call function="'CopyFolderByExtension'">
|
{ 'location' : STAXServiceMachine,
|
'srcfolder' : quickStartGroupDir,
|
'destfolder' : quickStartLocalTestsGroupDir,
|
'extension' : 'ldif'
|
}
|
</call>
|
|
<!-- PWD (.pwd) files -->
|
<message>
|
'Copy pwd data files locally to %s.' % localTestsGroupDir
|
</message>
|
<call function="'CopyFolderByExtension'">
|
{ 'location' : STAXServiceMachine,
|
'srcfolder' : testsGroupDir,
|
'destfolder' : localTestsGroupDir,
|
'extension' : 'pwd'
|
}
|
</call>
|
|
<!-- Archive (.gz) files -->
|
<message>
|
'Copy gz data files locally to %s.' % localTestsGroupDir
|
</message>
|
<call function="'CopyFolderByExtension'">
|
{ 'location' : STAXServiceMachine,
|
'srcfolder' : testsGroupDir,
|
'destfolder' : localTestsGroupDir,
|
'extension' : 'gz'
|
}
|
</call>
|
|
<!-- Archive java (.class) files -->
|
<script>
|
javaSharedDir='%s' % (TESTS_JAVA_DIR)
|
javaLocalDir='%s/shared/java' % (logsTestDataDir)
|
</script>
|
<message>
|
'Copy java class files locally to %s.' % javaLocalDir
|
</message>
|
<call function="'CopyFolderByExtension'">
|
{ 'location' : STAXServiceMachine,
|
'srcfolder' : javaSharedDir,
|
'destfolder' : javaLocalDir,
|
'extension' : 'class'
|
}
|
</call>
|
|
<!-- Delete the any existing testdata archive -->
|
<message>
|
'Delete %s/testdata.zip' % logsTempDir
|
</message>
|
<call function="'deleteFile'">
|
{ 'location' : STAXServiceMachine,
|
'filename' : '%s/testdata.zip' % logsTempDir
|
}
|
</call>
|
|
<!-- Zip up contents of tests directory -->
|
<message>
|
'Zip up local data directory to %s/testdata.zip' % logsTempDir
|
</message>
|
<call function="'zipUpFile'">
|
{ 'location' : STAXServiceMachine,
|
'zipfile' : '%s/testdata.zip' % logsTempDir ,
|
'folder' : '%s' % localTestsGroupDir ,
|
'relativeto' : logsTestDataDir
|
}
|
</call>
|
|
<message>
|
'Zip up local quickstart directory to %s/testdata.zip' % logsTempDir
|
</message>
|
<call function="'zipUpFile'">
|
{ 'location' : STAXServiceMachine,
|
'zipfile' : '%s/testdata.zip' % logsTempDir ,
|
'folder' : '%s' % quickStartLocalTestsGroupDir ,
|
'relativeto' : logsTestDataDir
|
}
|
</call>
|
|
<message>
|
'Zip up local java class files to %s/testdata.zip' % logsTempDir
|
</message>
|
<call function="'zipUpFile'">
|
{ 'location' : STAXServiceMachine,
|
'zipfile' : '%s/testdata.zip' % logsTempDir ,
|
'folder' : '%s' % javaLocalDir ,
|
'relativeto' : logsTestDataDir
|
}
|
</call>
|
|
</sequence>
|
<else>
|
<message>
|
'Test data is already created.'
|
</message>
|
</else>
|
</if>
|
</sequence>
|
</function>
|
|
|
|
<function name="createInstance">
|
<function-prolog>
|
This function creates an instance on a given host.
|
It copies both data and OpenDS zip files onto the host,
|
unzips them, and configures OpenDS.
|
</function-prolog>
|
|
<function-map-args>
|
<function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
|
<function-arg-description>
|
Hostname where the instance is to be created
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname"/>
|
</function-arg-def>
|
<function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
|
<function-arg-description>
|
Directory where OpenDS will be installed
|
</function-arg-description>
|
<function-arg-property name="type" value="filepath"/>
|
</function-arg-def>
|
<function-arg-def name="dsPort" type="optional" default="DIRECTORY_INSTANCE_PORT">
|
<function-arg-description>
|
Directory Server port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number"/>
|
</function-arg-def>
|
<function-arg-def name="dsSslPort" type="optional" default="DIRECTORY_INSTANCE_SSL_PORT">
|
<function-arg-description>
|
Directory Server SSL port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number"/>
|
</function-arg-def>
|
<function-arg-def name="dsJmxPort" type="optional" default="None">
|
<function-arg-description>
|
Directory Server JMX port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number"/>
|
</function-arg-def>
|
<function-arg-def name="dsBindDN" type="optional" default="DIRECTORY_INSTANCE_DN">
|
<function-arg-description>
|
Directory Manager DN
|
</function-arg-description>
|
<function-arg-property name="type" value="DN"/>
|
</function-arg-def>
|
<function-arg-def name="dsBindPwd" type="optional" default="DIRECTORY_INSTANCE_PSWD">
|
<function-arg-description>
|
Directory Server SSL port number
|
</function-arg-description>
|
<function-arg-property name="type" value="string"/>
|
</function-arg-def>
|
<function-arg-def name="dsBaseDN" type="optional" default="DIRECTORY_INSTANCE_SFX">
|
<function-arg-description>
|
Directory Server base suffix dn
|
</function-arg-description>
|
<function-arg-property name="type" value="DN"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
<message>
|
'Create instance in host %s at directory %s' % (dsHost,dsDir)
|
</message>
|
|
<!-- ON REMOTE HOST: copy files, unzip, configure instance -->
|
<!--- Delete folder if it exists on remote host-->
|
<message>
|
'Delete folder %s/%s on host %s' % (dsDir,OPENDSNAME,dsHost)
|
</message>
|
<call function="'deleteFolder'">
|
{ 'location' : dsHost,
|
'foldername' : '%s/%s' % (dsDir,OPENDSNAME)
|
}
|
</call>
|
|
<!--- Create folder on remote host -->
|
<message>
|
'Create folder %s on host %s' % (dsDir,dsHost)
|
</message>
|
<call function="'createFolder'">
|
{ 'location' : dsHost,
|
'foldername' : '%s' % dsDir
|
}
|
</call>
|
|
<!--- Copy staging data to remote host -->
|
<message>
|
'Copy %s/testdata.zip to %s on %s' % (logsTestDataDir,dsDir,dsHost)
|
</message>
|
<call function="'copyFile'">
|
{ 'srcfile' : '%s/testdata.zip' % logsTempDir,
|
'destfile' : '%s/testdata.zip' % dsDir,
|
'remotehost' : dsHost
|
}
|
</call>
|
|
<!--- Unzip contents of staging data on remote host -->
|
<message>
|
'Extract contents of test data %s on %s' % (dsDir,dsHost)
|
</message>
|
<call function="'unZipFile'">
|
{ 'location' : dsHost,
|
'zipfile' : '%s/testdata.zip' % dsDir,
|
'unzipdir' : dsDir
|
}
|
</call>
|
|
<!--- Install DS Copy zip file -->
|
<message>
|
'Copy DS zip archive %s/%s to %s' % (logsTempDir,ZIPNAME,dsHost)
|
</message>
|
<call function="'copyFile'">
|
{ 'srcfile' : '%s/%s' % (ZIPPATH,ZIPNAME),
|
'destfile' : '%s/%s' % (dsDir,ZIPNAME),
|
'remotehost' : dsHost
|
}
|
</call>
|
|
<!--- Install DS Extract zip file -->
|
<message>
|
'Extract DS zip archive to %s on %s' % (dsDir,dsHost)
|
</message>
|
<call function="'unZipFile'">
|
{ 'location' : dsHost,
|
'zipfile' : '%s/%s' % (dsDir,ZIPNAME),
|
'unzipdir' : dsDir
|
}
|
</call>
|
|
<!-- fixMe: Windows Services are not enabled -->
|
<if expr="isWindows">
|
<script>
|
enableWindowsService=''
|
</script>
|
<else>
|
<script>
|
enableWindowsService=''
|
</script>
|
</else>
|
</if>
|
|
<!-- configure the coverage dump file -->
|
<script>
|
mylog="::coverage - checking for %s/lib/emma.jar\n" % dsPath
|
if os.path.exists('%s/lib/emma.jar' % dsPath):
|
mylog+=" ::coverage on\n"
|
if not os.path.exists('%s/coverage' % TMPDIR):
|
os.mkdir('%s/coverage' % TMPDIR)
|
mylog+=" ::mkdir %s/coverage on\n" % TMPDIR
|
if not os.path.exists('%s/coverage/%s' % (TMPDIR,CurrentTestPath['group'])):
|
os.mkdir('%s/coverage/%s' % (TMPDIR,CurrentTestPath['group']))
|
mylog+=" ::mkdir %s/coverage/%s on\n" % (TMPDIR,CurrentTestPath['group'])
|
mylog+=" ::writing to %s/classes/emma.properties" % dsPath
|
coveragefh = open( '%s/classes/emma.properties' % dsPath, 'w' )
|
coveragefh.write( 'coverage.out.file=%s/coverage/%s/coverage.ec\n' % (TMPDIR,CurrentTestPath['group']) )
|
coveragefh.close()
|
|
</script>
|
|
<message>mylog</message>
|
<!--- Set up DS -->
|
<message>
|
'Set up DS on %s : %s/%s' % (dsHost,dsDir,OPENDSNAME)
|
</message>
|
|
<call function="'SetUpDsWithScript'">
|
{ 'location' : dsHost,
|
'dsPath' : '%s/%s' % (dsDir, OPENDSNAME),
|
'dsPort' : dsPort,
|
'dsJmxPort' : dsJmxPort,
|
'dsBindDN' : dsBindDN,
|
'dsBindPwd' : dsBindPwd,
|
'dsBaseDN' : dsBaseDN,
|
'dsEnableWindowsService' : enableWindowsService,
|
'dsDoNotStart' : 'true'
|
}
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC ,
|
'result' : STAXResult
|
}
|
</call>
|
|
<if expr="returncode == 0">
|
<message>
|
'Instance created.'
|
</message>
|
<else>
|
<message>
|
'Failed to create instance.'
|
</message>
|
</else>
|
</if>
|
</sequence>
|
</function>
|
|
|
|
<function name="DEPRECATEDconfigureReplication">
|
<function-prolog>
|
This function configures replication in a given server.
|
</function-prolog>
|
|
<function-list-args>
|
<function-arg-def name="syncserverMap" type="required">
|
<function-arg-description>
|
Map containing a Server class instance representing the server to configure.
|
</function-arg-description>
|
<function-arg-property name="type" value="map"/>
|
</function-arg-def>
|
</function-list-args>
|
|
<sequence>
|
<script>
|
syncserver = syncserverMap['instance']
|
|
filename = 'replication_conf.ldif'
|
filePath = '%s/%s' % (logsTestDataDir,filename)
|
dataDir = '%s/%s' % (syncserver.getDir(),relativeDataDir)
|
|
write_replication_conf_ldif_file(filePath, syncserver)
|
</script>
|
|
<message>
|
'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
|
</message>
|
|
<!-- Copy the replication_conf ldif to remote host -->
|
<message>
|
'Copy %s file from %s to %s' % (filename,logsTestDataDir,dataDir)
|
</message>
|
<call function="'copyFile'">
|
{ 'srcfile' : filePath,
|
'destfile' : '%s/%s' % (dataDir,filename),
|
'remotehost' : syncserver.getHostname()
|
}
|
</call>
|
|
<!--- Add replication configuration entries to config.ldif in server -->
|
<script>
|
remoteFilePath = '%s/%s' % (dataDir, filename)
|
syncserverPath = '%s/%s' % (syncserver.getDir(),OPENDSNAME)
|
</script>
|
|
<!--- Start DS -->
|
<call function="'StartDsWithScript'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath
|
}
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC ,
|
'result' : STAXResult
|
}
|
</call>
|
|
<message>
|
'Add replication configuration entries in %s' % remoteFilePath
|
</message>
|
|
<call function="'addEntry'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsInstanceHost' : syncserver.getHostname(),
|
'dsInstancePort' : syncserver.getPort(),
|
'dsInstanceDn' : syncserver.getRootDn(),
|
'dsInstancePswd' : syncserver.getRootPwd(),
|
'entryToBeAdded' : remoteFilePath
|
}
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC,
|
'result' : STAXResult
|
}
|
</call>
|
|
<!--- Stop DS -->
|
<call function="'StopDsWithScript'">
|
{ 'location' : syncserver.getHostname(),
|
'dsHost' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsPort' : syncserver.getPort(),
|
'dsBindDN' : syncserver.getRootDn(),
|
'dsBindPwd' : syncserver.getRootPwd()
|
}
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC ,
|
'result' : STAXResult
|
}
|
</call>
|
</sequence>
|
</function>
|
|
|
<function name="configureReplication">
|
<function-prolog>
|
This function configures replication in a given server.
|
</function-prolog>
|
|
<function-list-args>
|
<function-arg-def name="syncserver" type="required">
|
<function-arg-description>
|
Server class instance representing the server to configure.
|
</function-arg-description>
|
<function-arg-property name="type" value="Server"/>
|
</function-arg-def>
|
</function-list-args>
|
|
<sequence>
|
<!--- Configure replication using dsconfig -->
|
<message>
|
'Configure replication on server on host %s at directory %s' % (syncserver.getHostname(),syncserver.getDir())
|
</message>
|
|
<script>
|
syncserverPath = '%s/%s' % (syncserver.getDir(),OPENDSNAME)
|
</script>
|
|
<!--- Start DS -->
|
<call function="'StartDsWithScript'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath
|
}
|
</call>
|
|
<!-- WORK-AROUND for issue #2201 -->
|
<call function="'addEntry'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsInstanceHost' : syncserver.getHostname(),
|
'dsInstancePort' : syncserver.getPort(),
|
'dsInstanceDn' : syncserver.getRootDn(),
|
'dsInstancePswd' : syncserver.getRootPwd(),
|
'entryToBeAdded' : '%s/%s/replication/workaround-2201.ldif' % (syncserver.getDir(), relativeDataDir) }
|
</call>
|
|
<message>
|
'List synchronization providers'
|
</message>
|
|
<call function="'listSyncProviders'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsInstanceHost' : syncserver.getHostname(),
|
'dsInstancePort' : syncserver.getPort(),
|
'dsInstanceDn' : syncserver.getRootDn(),
|
'dsInstancePswd' : syncserver.getRootPwd()
|
}
|
</call>
|
|
<script>
|
replicationServer = syncserver.getChangelogServer()
|
replicatedSuffixList = syncserver.getSynchronizedSuffixList()
|
</script>
|
|
<if expr="replicationServer">
|
<sequence>
|
<message>
|
'Create replication server listening on port: %s' % replicationServer.getPort()
|
</message>
|
<call function="'createReplicationServer'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsInstanceHost' : syncserver.getHostname(),
|
'dsInstancePort' : syncserver.getPort(),
|
'dsInstanceDn' : syncserver.getRootDn(),
|
'dsInstancePswd' : syncserver.getRootPwd(),
|
'replicationPort' : replicationServer.getPort(),
|
'replicationServerId' : replicationServer.getId(),
|
'replicationServerList' : replicationServer.getChangelogServerList()
|
}
|
</call>
|
</sequence>
|
</if>
|
|
<iterate var="suffix" in="replicatedSuffixList" indexvar="i">
|
<sequence>
|
<message>
|
'Create domain name for suffix: %s' % suffix.getSuffixDn()
|
</message>
|
<call function="'createMultimasterDomain'">
|
{ 'location' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsInstanceHost' : syncserver.getHostname(),
|
'dsInstancePort' : syncserver.getPort(),
|
'dsInstanceDn' : syncserver.getRootDn(),
|
'dsInstancePswd' : syncserver.getRootPwd(),
|
'domainName' : 'SUFFIX-%s' % i,
|
'replicationDn' : suffix.getSuffixDn(),
|
'serverId' : suffix.getId(),
|
'replicationServerList' : suffix.getChangelogServerList()
|
}
|
</call>
|
</sequence>
|
</iterate>
|
|
<!--- Stop DS -->
|
<call function="'StopDsWithScript'">
|
{ 'location' : syncserver.getHostname(),
|
'dsHost' : syncserver.getHostname(),
|
'dsPath' : syncserverPath,
|
'dsPort' : syncserver.getPort(),
|
'dsBindDN' : syncserver.getRootDn(),
|
'dsBindPwd' : syncserver.getRootPwd()
|
}
|
</call>
|
</sequence>
|
</function>
|
|
|
|
|
<!-- Enable replication between servers using dsreplication -->
|
<function name="enableReplication">
|
<function-prolog>
|
This function enables replication between servers using dsreplication.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="location"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Location of target host
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="dsPath"
|
type="optional"
|
default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
|
<function-arg-description>
|
Pathname to installation root
|
</function-arg-description>
|
<function-arg-property name="type" value="filepath" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstanceHost"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Directory server hostname or IP address
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstancePort" type="required">
|
<function-arg-description>
|
Directory server port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstanceDn" type="required">
|
<function-arg-description>
|
Bind DN
|
</function-arg-description>
|
<function-arg-property name="type" value="DN" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstancePswd" type="required">
|
<function-arg-description>
|
Bind password
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
|
<function-arg-def name="dsReplicationPort" type="required">
|
<function-arg-description>
|
Replication port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="refInstanceHost"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Reference Directory server hostname or IP address
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="refInstancePort" type="required">
|
<function-arg-description>
|
Reference Directory server port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="refInstanceDn" type="required">
|
<function-arg-description>
|
Reference server Bind DN
|
</function-arg-description>
|
<function-arg-property name="type" value="DN" />
|
</function-arg-def>
|
|
<function-arg-def name="refInstancePswd" type="required">
|
<function-arg-description>
|
Reference server Bind password
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
|
<function-arg-def name="refReplicationPort" type="required">
|
<function-arg-description>
|
Reference server Replication port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="replicationDnList" type="required">
|
<function-arg-description>
|
DN of the replicated suffix
|
</function-arg-description>
|
<function-arg-property name="type" value="DN list" />
|
</function-arg-def>
|
|
<function-arg-def name="adminUID"
|
type="optional"
|
default="AdminUID">
|
<function-arg-description>
|
Global Administrator UID
|
</function-arg-description>
|
<function-arg-property name="type" value="UID" />
|
</function-arg-def>
|
|
<function-arg-def name="adminPswd"
|
type="optional"
|
default="AdminPswd">
|
<function-arg-description>
|
Global Administrator password
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
|
<function-arg-def name="expectedRC" type="optional" default="0">
|
<function-arg-description>
|
Expected return code value. Default value is 0
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
</function-map-args>
|
<sequence>
|
<!-- Local variables -->
|
<script>
|
mylocation=location
|
STAFCmdParams=''
|
STAFCmd=''
|
|
if dsPath:
|
dsBinPath='%s/%s' % (dsPath,fileFolder)
|
STAFCmd='%s/%s%s' % (dsBinPath,DSREPLICATION,fileExt)
|
|
STAFCmdParamsList=[]
|
STAFCmdParamsList.append('enable')
|
STAFCmdParamsList.append('-n')
|
STAFCmdParamsList.append('-Q')
|
|
if dsInstanceHost:
|
STAFCmdParamsList.append('-h %s' % dsInstanceHost)
|
|
if dsInstancePort:
|
STAFCmdParamsList.append('-p %s' % dsInstancePort)
|
|
if dsInstanceDn:
|
STAFCmdParamsList.append('-D "%s"' % dsInstanceDn)
|
|
if dsInstancePswd:
|
STAFCmdParamsList.append('--bindPassword1 "%s"' % dsInstancePswd)
|
|
if dsReplicationPort:
|
STAFCmdParamsList.append('-r %s' % dsReplicationPort)
|
|
if refInstanceHost:
|
STAFCmdParamsList.append('-O %s' % refInstanceHost)
|
|
if refInstancePort:
|
STAFCmdParamsList.append('--port2 %s' % refInstancePort)
|
|
if refInstanceDn:
|
STAFCmdParamsList.append('--bindDN2 "%s"' % refInstanceDn)
|
|
if refInstancePswd:
|
STAFCmdParamsList.append('--bindPassword2 "%s"' % refInstancePswd)
|
|
if refReplicationPort:
|
STAFCmdParamsList.append('-R %s' % refReplicationPort)
|
|
if replicationDnList:
|
for dn in replicationDnList:
|
STAFCmdParamsList.append('-b "%s"' % dn)
|
|
if adminUID:
|
STAFCmdParamsList.append('-I "%s"' % adminUID)
|
|
if adminPswd:
|
STAFCmdParamsList.append('-w "%s"' % adminPswd)
|
|
STAFCmdParams=' '.join(STAFCmdParamsList)
|
</script>
|
<call function="'runCommand'">
|
{ 'name' : 'Enable Replication',
|
'location' : location,
|
'command' : STAFCmd,
|
'arguments' : STAFCmdParams
|
}
|
</call>
|
<script>
|
STAXCode=RC
|
STAXReason=STAXResult
|
</script>
|
<call function="'checktestRC'">
|
{ 'returncode' : STAXCode,
|
'result' : STAXReason,
|
'expected' : expectedRC
|
}
|
</call>
|
<return>
|
STAXReason
|
</return>
|
</sequence>
|
</function>
|
|
|
|
<!-- Initialize replicated suffix with the contents of a source server using dsreplication -->
|
<function name="initializeReplication">
|
<function-prolog>
|
This function initializes replicated suffixes with the contents
|
of a source server using dsreplication.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="location"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Location of target host
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="dsPath"
|
type="optional"
|
default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
|
<function-arg-description>
|
Pathname to installation root
|
</function-arg-description>
|
<function-arg-property name="type" value="filepath" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstanceHost"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Directory server hostname or IP address
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="dsInstancePort" type="required">
|
<function-arg-description>
|
Directory server port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="sourceInstanceHost"
|
type="optional"
|
default="STAF_REMOTE_HOSTNAME">
|
<function-arg-description>
|
Source Directory server hostname or IP address
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname" />
|
</function-arg-def>
|
|
<function-arg-def name="sourceInstancePort" type="required">
|
<function-arg-description>
|
Source Directory server port number
|
</function-arg-description>
|
<function-arg-property name="type" value="Port number" />
|
</function-arg-def>
|
|
<function-arg-def name="replicationDnList" type="required">
|
<function-arg-description>
|
DN of the replicated suffix
|
</function-arg-description>
|
<function-arg-property name="type" value="DN list" />
|
</function-arg-def>
|
|
<function-arg-def name="adminUID"
|
type="optional"
|
default="AdminUID">
|
<function-arg-description>
|
Global Administrator UID
|
</function-arg-description>
|
<function-arg-property name="type" value="UID" />
|
</function-arg-def>
|
|
<function-arg-def name="adminPswd"
|
type="optional"
|
default="AdminPswd">
|
<function-arg-description>
|
Global Administrator password
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
|
<function-arg-def name="expectedRC" type="optional" default="0">
|
<function-arg-description>
|
Expected return code value. Default value is 0
|
</function-arg-description>
|
<function-arg-property name="type" value="string" />
|
</function-arg-def>
|
</function-map-args>
|
<sequence>
|
<!-- Local variables -->
|
<script>
|
mylocation=location
|
STAFCmdParams=''
|
STAFCmd=''
|
|
if dsPath:
|
dsBinPath='%s/%s' % (dsPath,fileFolder)
|
STAFCmd='%s/%s%s' % (dsBinPath,DSREPLICATION,fileExt)
|
|
STAFCmdParamsList=[]
|
STAFCmdParamsList.append('initialize')
|
STAFCmdParamsList.append('-n')
|
STAFCmdParamsList.append('-Q')
|
|
if dsInstanceHost:
|
STAFCmdParamsList.append('-O %s' % dsInstanceHost)
|
|
if dsInstancePort:
|
STAFCmdParamsList.append('--portDestination %s' % dsInstancePort)
|
|
if sourceInstanceHost:
|
STAFCmdParamsList.append('-h %s' % sourceInstanceHost)
|
|
if sourceInstancePort:
|
STAFCmdParamsList.append('-p %s' % sourceInstancePort)
|
|
if replicationDnList:
|
for dn in replicationDnList:
|
STAFCmdParamsList.append('-b "%s"' % dn)
|
|
if adminUID:
|
STAFCmdParamsList.append('-I "%s"' % adminUID)
|
|
if adminPswd:
|
STAFCmdParamsList.append('-w "%s"' % adminPswd)
|
|
STAFCmdParams=' '.join(STAFCmdParamsList)
|
</script>
|
<call function="'runCommand'">
|
{ 'name' : 'Initialize Replication',
|
'location' : location,
|
'command' : STAFCmd,
|
'arguments' : STAFCmdParams
|
}
|
</call>
|
<script>
|
STAXCode=RC
|
STAXReason=STAXResult
|
</script>
|
<call function="'checktestRC'">
|
{ 'returncode' : STAXCode,
|
'result' : STAXReason,
|
'expected' : expectedRC
|
}
|
</call>
|
<return>
|
STAXReason
|
</return>
|
</sequence>
|
</function>
|
|
|
|
|
<function name="readTopology">
|
<function-prolog>
|
This function reads the topology from a given file.
|
It parses the topology description file and sets _topologyServerList, a list of the servers
|
that form the topology.
|
</function-prolog>
|
|
<function-map-args>
|
<function-arg-def name="file" type="required">
|
<function-arg-description>
|
File containing the topology description.
|
</function-arg-description>
|
<function-arg-property name="type" value="filePath"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
<message>
|
'Parse file %s for topology parameters' % file
|
</message>
|
|
<script>
|
_topologyServerList = []
|
|
f = open(file, 'r')
|
|
hostname = None
|
dir = None
|
port = None
|
sslport = None
|
jmxport = None
|
rootDn = None
|
rootPwd = None
|
baseDn = None
|
changelogport = None
|
suffixList = []
|
changelogList = []
|
serverId = 1
|
|
fileLines = f.readlines()
|
for line in fileLines:
|
|
if line.startswith('#'):
|
continue
|
elif line.find('Hostname') != -1:
|
hostname = line[line.find('Hostname') + 9:].strip()
|
elif line.find('Directory') !=-1:
|
dir = line[line.find('Directory') + 10:].strip()
|
elif line.find('Port') != -1:
|
port = line[line.find('Port') + 5:].strip()
|
elif line.find('Sslport') != -1:
|
sslport = line[line.find('Sslport') + 8:].strip()
|
elif line.find('Jmxport') != -1:
|
jmxport = line[line.find('Jmxport') + 8:].strip()
|
elif line.find('RootDn') != -1:
|
rootDn = line[line.find('RootDn') + 7:].strip()
|
elif line.find('RootPwd') != -1:
|
rootPwd = line[line.find('RootPwd') + 8:].strip()
|
elif line.find('BaseDn') != -1:
|
baseDn = line[line.find('BaseDn') + 7:].strip()
|
elif line.find('Changelogport') != -1:
|
changelogport = line[line.find('Changelogport') + 14:].strip()
|
elif line.find('SynchronizedSuffix') != -1:
|
suffixList.append( line[line.find('SynchronizedSuffix') + 19:].strip() )
|
elif line.find('ChangelogServer') != -1:
|
changelogList.append( line[line.find('ChangelogServer') + 16:].strip() )
|
elif (line.isspace()) or (len(line) == 0):
|
server = Server(hostname, dir, port, sslport, jmxport, rootDn, rootPwd, baseDn)
|
|
if changelogport != None:
|
changelogServer = ChangelogServer(changelogport, serverId)
|
for item in changelogList:
|
srv = item[:item.find(':')]
|
prt = item[item.find(':') + 1:]
|
changelogServer.addChangelogServer(srv, prt)
|
server.addChangelogServer(changelogServer)
|
|
for suffix in suffixList:
|
synchroSuffix = SynchronizedSuffix(suffix, serverId)
|
for item in changelogList:
|
srv = item[:item.find(':')]
|
prt = item[item.find(':') + 1:]
|
synchroSuffix.addChangelogServer(srv, prt)
|
server.addSynchronizedSuffix(synchroSuffix)
|
|
_topologyServerList.append(server)
|
|
hostname = None
|
dir = None
|
port = None
|
sslport = None
|
jmxport = None
|
rootDn = None
|
rootPwd = None
|
baseDn = None
|
changelogport = None
|
suffixList = []
|
changelogList = []
|
serverId += 1
|
|
if hostname != None:
|
server = Server(hostname, dir, port, sslport, jmxport, rootDn, rootPwd, baseDn)
|
|
if changelogport != None:
|
changelogServer = ChangelogServer(changelogport, serverId)
|
for item in changelogList:
|
srv = item[:item.find(':')]
|
prt = item[item.find(':') + 1:]
|
changelogServer.addChangelogServer(srv, prt)
|
server.addChangelogServer(changelogServer)
|
|
for suffix in suffixList:
|
synchroSuffix = SynchronizedSuffix(suffix, serverId)
|
for item in changelogList:
|
srv = item[:item.find(':')]
|
prt = item[item.find(':') + 1:]
|
synchroSuffix.addChangelogServer(srv, prt)
|
server.addSynchronizedSuffix(synchroSuffix)
|
|
_topologyServerList.append(server)
|
|
f.close()
|
</script>
|
</sequence>
|
</function>
|
|
|
|
<function name="removeInstance">
|
<function-prolog>
|
This function removes an instance on a given host.
|
</function-prolog>
|
|
<function-map-args>
|
<function-arg-def name="dsHost" type="optional" default="DIRECTORY_INSTANCE_HOST">
|
<function-arg-description>
|
Hostname where the instance is to be created
|
</function-arg-description>
|
<function-arg-property name="type" value="hostname"/>
|
</function-arg-def>
|
<function-arg-def name="dsDir" type="optional" default="DIRECTORY_INSTANCE_DIR">
|
<function-arg-description>
|
Directory where OpenDS will be installed
|
</function-arg-description>
|
<function-arg-property name="type" value="filepath"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
<message>
|
'Removing instance %s/%s on host %s' % (dsDir,OPENDSNAME,dsHost)
|
</message>
|
|
<!-- ON REMOTE HOST: remove files and folders -->
|
<!--- Delete staging data file on remote host-->
|
<message>
|
'Delete staging data file %s/testdata.zip' % dsDir
|
</message>
|
<call function="'deleteFile'">
|
{ 'location' : dsHost,
|
'filename' : '%s/testdata.zip' % dsDir
|
}
|
</call>
|
|
<!--- Delete staging data folder on remote host -->
|
<message>
|
'Delete staging data folder %s/shared' % dsDir
|
</message>
|
<call function="'deleteFolder'">
|
{ 'location' : dsHost,
|
'foldername' : '%s/shared' % dsDir
|
}
|
</call>
|
|
<!--- Delete OPENDS zip file on remote host-->
|
<message>
|
'Delete OPENDS zip file %s/%s' % (dsDir,ZIPNAME)
|
</message>
|
<call function="'deleteFile'">
|
{ 'location' : dsHost,
|
'filename' : '%s/%s' % (dsDir,ZIPNAME) }
|
</call>
|
|
<call function="'checkRC'">
|
{ 'returncode' : RC ,
|
'result' : STAXResult
|
}
|
</call>
|
<if expr="returncode == 0">
|
<message>
|
'Instance removed.'
|
</message>
|
<else>
|
<message>
|
'Failed to remove instance.'
|
</message>
|
</else>
|
</if>
|
</sequence>
|
</function>
|
|
|
|
<function name="removeTopology">
|
<function-prolog>
|
This function removes the topology created for the Test Group/Suite.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="multipleInstanceTopology" type="optional" default="False">
|
<function-arg-description>
|
Tells whether it is a single (i.e. parameters read from config.py) or
|
a multiple-instance topology (i.e. parameters read from topology desc file).
|
</function-arg-description>
|
<function-arg-property name="type" value="boolean"/>
|
</function-arg-def>
|
</function-map-args>
|
<sequence>
|
<if expr="multipleInstanceTopology == False">
|
<!-- SINGLE instance deployment: parameters read from config.py (done by default) -->
|
<call function="'removeInstance'" />
|
<else>
|
<!-- MULTIPLE instance deployment: parameters read from topologyDescFile -->
|
<iterate var="server" in="_topologyServerList">
|
<call function="'removeInstance'">
|
{ 'dsHost' : server.getHostname(),
|
'dsDir' : server.getDir()
|
}
|
</call>
|
</iterate>
|
</else>
|
</if>
|
</sequence>
|
</function>
|
</stax>
|