<?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
|
!
|
! Copyright 2007-2010 Sun Microsystems, Inc.
|
! Portions Copyright 2011 ForgeRock AS.
|
! -->
|
<stax>
|
|
<function name="importSharedLibraries">
|
<function-prolog>
|
This function imports the shared function xml libraries.
|
</function-prolog>
|
|
<sequence>
|
|
<!--- Import all the shared xml libraries -->
|
|
<script>
|
sharedLibs=[]
|
sharedLibs.append('baselib.xml')
|
sharedLibs.append('ldap.xml')
|
sharedLibs.append('utils.xml')
|
sharedLibs.append('stafcmd.xml')
|
sharedLibs.append('staxcmd.xml')
|
sharedLibs.append('dsadm.xml')
|
sharedLibs.append('dsconfig.xml')
|
sharedLibs.append('security.xml')
|
sharedLibs.append('topology.xml')
|
sharedLibs.append('signals.xml')
|
sharedLibs.append('tools.xml')
|
sharedLibs.append('webcontainer.xml')
|
sharedLibs.append('snmp.xml')
|
</script>
|
|
<iterate var="sharedLib" in="sharedLibs">
|
<import machine="STAF_LOCAL_HOSTNAME"
|
file="'%s/%s' % (TESTS_FUNCTIONS_DIR,sharedLib)" />
|
</iterate>
|
|
</sequence>
|
|
</function>
|
|
<function name="importPythonLibraries">
|
<function-prolog>
|
This function imports the Python libraries and objects,
|
both starndard and local shared ones.
|
</function-prolog>
|
|
<sequence>
|
|
<!-- Load in any standard python libraries -->
|
<script>
|
import re
|
import os
|
import sys
|
</script>
|
|
<!-- Load in any additional Java classes -->
|
<script>
|
import java.io.FileNotFoundException
|
</script>
|
|
<!-- Load in any standard python functions -->
|
<script>
|
from time import localtime,strftime
|
</script>
|
|
<!-- Load in the local shared python objects from libraries -->
|
<script>
|
sys.path.append("%s/shared/python" % TESTS_ROOT )
|
from common import *
|
from security import *
|
from replication import *
|
from snmp import *
|
from schema import *
|
from objects import *
|
</script>
|
|
|
</sequence>
|
</function>
|
|
|
|
|
|
<function name="initialiseGlobalVariables">
|
<function-prolog>
|
This function initialises a set of global variables.
|
</function-prolog>
|
|
<sequence>
|
<!-- Default LDAP Server Object -->
|
<script>
|
server=directory_server()
|
server.location = STAF_REMOTE_HOSTNAME
|
server.host = DIRECTORY_INSTANCE_HOST
|
server.port = DIRECTORY_INSTANCE_PORT
|
server.adminport = DIRECTORY_INSTANCE_ADMIN_PORT
|
server.dn = DIRECTORY_INSTANCE_DN
|
server.password = DIRECTORY_INSTANCE_PSWD
|
server.suffix = DIRECTORY_INSTANCE_SFX
|
server.backend = DIRECTORY_INSTANCE_BE
|
</script>
|
|
<!-- Set the signal handlers -->
|
<call function="'signals'"/>
|
|
<!-- Initialize any global variables -->
|
<script>
|
True = 1
|
False = 0
|
|
STAXLogMessage = 1
|
if is_windows_platform(STAF_REMOTE_HOSTNAME):
|
fileExt='.bat'
|
scriptExt='.bat'
|
fileFolder='bat'
|
pathSeparator=';'
|
newLine='\r\n'
|
else:
|
fileExt=''
|
scriptExt='.sh'
|
fileFolder='bin'
|
pathSeparator=':'
|
newLine='\n'
|
|
if DIRECTORY_INSTANCE_BIN != DIRECTORY_INSTANCE_DIR:
|
IPS_PKG = True
|
else:
|
IPS_PKG = False
|
|
CurrentTestPath={}
|
DSInfoServersDict={}
|
|
# threshold set so that functions such as getFile may not cause staf
|
# process to run out of memory (value in bytes)
|
MAX_READABLE_SIZE = 104800
|
|
# this function return a well-formatted testcase name
|
def getTestCaseName(name):
|
return '%s: %s: %s' % (CurrentTestPath['group'],CurrentTestPath['suite'],name)
|
|
DSCONFIG = 'dsconfig'
|
DSREPLICATION = 'dsreplication'
|
|
AdminUID = 'admin'
|
AdminPswd = 'admin'
|
|
# Replication configuration default names
|
MultimasterSync = 'Multimaster Synchronization'
|
MultimasterType = 'multimaster'
|
|
# Replication execution mode variables: if not defined, set "random"
|
# values:
|
# (day of the month % 4) == 0 --> (split servers, eclmode n/a)
|
# (day of the month % 4) == 1 --> (don't split, opends eclmode)
|
# (day of the month % 4) == 2 --> (don't split, draft eclmode)
|
# (day of the month % 4) == 3 --> (don't split, eclmode n/a)
|
import time
|
monthday = time.localtime()[2]
|
rewriteConfigFile = False
|
|
if REPLICATION_SPLIT_SERVERS == '':
|
rewriteConfigFile = True
|
oldSplitConfig = """REPLICATION_SPLIT_SERVERS = ''"""
|
if monthday % 4 == 0:
|
REPLICATION_SPLIT_SERVERS = 'true'
|
else:
|
REPLICATION_SPLIT_SERVERS = 'false'
|
newSplitConfig = """REPLICATION_SPLIT_SERVERS = '%s'""" % \
|
REPLICATION_SPLIT_SERVERS
|
else:
|
newSplitConfig = """REPLICATION_SPLIT_SERVERS = '%s'""" % \
|
REPLICATION_SPLIT_SERVERS
|
oldSplitConfig = newSplitConfig
|
|
if REPLICATION_ECL_MODE == '':
|
rewriteConfigFile = True
|
oldEclmodeConfig = """REPLICATION_ECL_MODE = ''"""
|
if monthday % 4 == 1:
|
REPLICATION_ECL_MODE = 'opends'
|
elif monthday % 4 == 2:
|
REPLICATION_ECL_MODE = 'draft'
|
else:
|
REPLICATION_ECL_MODE = 'n/a'
|
newEclmodeConfig = """REPLICATION_ECL_MODE = '%s'""" % \
|
REPLICATION_ECL_MODE
|
else:
|
newEclmodeConfig = """REPLICATION_ECL_MODE = '%s'""" % \
|
REPLICATION_ECL_MODE
|
oldEclmodeConfig = newEclmodeConfig
|
|
|
# Rewrite the randomly chosen variables in config.py file
|
if rewriteConfigFile == True :
|
import re
|
splitRegEx = re.compile(oldSplitConfig)
|
eclmodeRegEx = re.compile(oldEclmodeConfig)
|
|
configFile = STAXJobScriptFiles[0]
|
configInput = open(configFile, 'r')
|
c0 = configInput.read()
|
c1 = splitRegEx.sub(newSplitConfig, c0)
|
content = eclmodeRegEx.sub(newEclmodeConfig, c1)
|
configInput.close()
|
|
configOutput = open(configFile,'w')
|
configOutput.write(content)
|
configOutput.close()
|
|
# Create staf objects
|
LOCAL_STAF_ROOT = test_env.staf(STAF_LOCAL_HOSTNAME).root
|
REMOTE_STAF_ROOT = test_env.staf(STAF_REMOTE_HOSTNAME).root
|
</script>
|
|
</sequence>
|
</function>
|
|
<function name="GetDirectoryServerInformation">
|
<function-prolog>
|
This function gets information about the Directory Server
|
</function-prolog>
|
|
<try>
|
|
<sequence>
|
|
<script>
|
InstanceInstallDir= '%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)
|
</script>
|
|
<!-- Copy DS zip archive to remote host-->
|
<message>
|
'Copy DS zip archive to %s %s.zip.' % (STAF_REMOTE_HOSTNAME,InstanceInstallDir)
|
</message>
|
<call function="'copyFile'">
|
{ 'srcfile' : '%s/%s' % (ZIPPATH,ZIPNAME),
|
'destfile' : '%s.zip' % InstanceInstallDir,
|
'remotehost' : STAF_REMOTE_HOSTNAME }
|
</call>
|
|
<if expr="RC != 0">
|
<return>RC</return>
|
</if>
|
|
<!-- Install DS into temporary folder -->
|
<message>
|
'Extract temporary DS zip archive to %s %s.' % (STAF_REMOTE_HOSTNAME,DIRECTORY_INSTANCE_DIR)
|
</message>
|
<call function="'unZipFile'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'zipfile' : '%s.zip' % InstanceInstallDir,
|
'unzipdir' : '%s' % DIRECTORY_INSTANCE_DIR }
|
</call>
|
|
<if expr="RC != 0">
|
<return>RC</return>
|
</if>
|
|
<!-- Get Directory Server Variables -->
|
<call function="'GetDirectoryServerVars'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'dsPath' : '%s/%s' % (DIRECTORY_INSTANCE_BIN,OPENDSNAME) }
|
</call>
|
|
<if expr="RC != 0">
|
<throw exception="'TestExceptionResultFailed'">
|
'Invalid Result %s' % RC
|
</throw>
|
</if>
|
|
<!-- Set Directory Server Variables -->
|
<call function="'SetVar'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'type' : 'shared',
|
'variable' : 'Job%s_ServerInfo=%s' % (STAXJobID,DSInfoServersDict) }
|
</call>
|
|
<if expr="RC != 0">
|
<throw exception="'TestExceptionResultFailed'">
|
'Invalid Result %s' % RC
|
</throw>
|
</if>
|
|
<!-- Uninstall DS from temporary folder -->
|
<message>
|
'Remove temporary DS zip archive from %s %s' % (STAF_REMOTE_HOSTNAME,InstanceInstallDir)
|
</message>
|
|
<call function="'deleteFolder'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'foldername' : '%s' % InstanceInstallDir }
|
</call>
|
|
<call function="'deleteFile'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'filename' : '%s.zip' % InstanceInstallDir }
|
</call>
|
|
</sequence>
|
|
<catch exception="'TestExceptionResultFailed'" typevar="eType" var="eInfo">
|
<sequence>
|
<message>'caught %s with %s' % (eType,eInfo)</message>
|
<message>
|
'Remove temporary DS zip archive from %s %s' % (STAF_REMOTE_HOSTNAME,InstanceInstallDir)
|
</message>
|
<call function="'deleteFolder'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'foldername' : '%s' % InstanceInstallDir }
|
</call>
|
|
<call function="'deleteFile'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'filename' : '%s.zip' % InstanceInstallDir }
|
</call>
|
|
</sequence>
|
</catch>
|
|
</try>
|
|
</function>
|
|
<function name="SetFolders">
|
<function-prolog>
|
This function sets the folders to which test data are written.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="sourceDir" type="required">
|
<function-arg-description>
|
A locally accessable directory to the tests source
|
</function-arg-description>
|
<function-arg-property name="type" value="structure"/>
|
</function-arg-def>
|
<function-arg-def name="localDir" type="required">
|
<function-arg-description>
|
A locally accessable directory to write test information
|
</function-arg-description>
|
<function-arg-property name="type" value="structure"/>
|
</function-arg-def>
|
<function-arg-def name="remoteDir" type="required">
|
<function-arg-description>
|
A remotely accessable directory to write test information
|
</function-arg-description>
|
<function-arg-property name="type" value="structure"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
|
<script>
|
logs = test_env.logs(localDir)
|
source = test_env.source(sourceDir,TESTS_TYPE)
|
local = test_env.data(localDir)
|
remote = test_env.data(remoteDir)
|
|
if host_is_localhost(STAF_REMOTE_HOSTNAME):
|
local.set_data(source.data)
|
remote.set_data(source.data)
|
</script>
|
|
<message>'source.directory = %s' % source.directory</message>
|
<message>'local.directory = %s' % local.directory</message>
|
<message>'remote.directory = %s' % remote.directory</message>
|
<message>'logs.directory = %s' % logs.directory</message>
|
<message>'source.data = %s' % source.data</message>
|
<message>'local.data = %s' % local.data</message>
|
<message>'remote.data = %s' % remote.data</message>
|
|
<return>
|
local.directory
|
</return>
|
|
</sequence>
|
|
</function>
|
|
<function name="CreateFolders" scope="local">
|
<function-prolog>
|
This function sets the folders to which logs are written
|
</function-prolog>
|
|
<sequence>
|
|
<!-- Create folders -->
|
<message>'Create local folder %s' % logs.reports</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_LOCAL_HOSTNAME,
|
'foldername' : '%s' % logs.reports }
|
</call>
|
|
<message>'Create local folder %s' % local.temp</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_LOCAL_HOSTNAME,
|
'foldername' : '%s' % local.temp }
|
</call>
|
|
<message>'Create local folder %s' % logs.sut</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_LOCAL_HOSTNAME,
|
'foldername' : '%s' % logs.sut }
|
</call>
|
|
<message>'Create local folder %s' % logs.tests</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_LOCAL_HOSTNAME,
|
'foldername' : '%s' % logs.tests }
|
</call>
|
|
<message>'Create local folder %s' % local.testdata</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_LOCAL_HOSTNAME,
|
'foldername' : '%s' % local.testdata }
|
</call>
|
|
<message>'Create remote folder %s' % remote.temp</message>
|
<call function="'createFolder'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'foldername' : '%s' % remote.temp }
|
</call>
|
|
</sequence>
|
|
</function>
|
|
<function name="loadGlobalEnvironment">
|
<function-prolog>
|
This function loads the environment (libraries, functions, variables)
|
needed by the global test job farmer.
|
</function-prolog>
|
|
<sequence>
|
|
<message>
|
'Load environment for test suite execution.'
|
</message>
|
|
<call function="'importSharedLibraries'"/>
|
|
<call function="'importPythonLibraries'"/>
|
|
<call function="'initialiseGlobalVariables'"/>
|
|
<message>
|
'Remove files from previous runs under %s.' % DIRECTORY_INSTANCE_DIR
|
</message>
|
<call function="'deleteFolder'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'foldername' : '%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) }
|
</call>
|
<call function="'createFolder'">
|
{ 'location' : STAF_REMOTE_HOSTNAME ,
|
'foldername' : '%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) }
|
</call>
|
|
<call function="'GetDirectoryServerInformation'"/>
|
|
<!-- Set variables to build unique path to store data -->
|
<script>
|
# Private
|
logsArch=\
|
DSInfo.getServerArch(DSInfo.ServerDict['system os'])
|
logsOSName=\
|
DSInfo.getServerOSName(DSInfo.ServerDict['system os'])
|
logsOS='%s-%s' % (logsOSName,logsArch)
|
logsJvm=\
|
DSInfo.getServerJavaMajorMinor(DSInfo.ServerDict['java version'])
|
</script>
|
|
<call function="'SetFolders'">
|
{ 'sourceDir' : '%s' % TESTS_ROOT,
|
'localDir' : '%s' % LOGS_ROOT,
|
'remoteDir' : DIRECTORY_INSTANCE_DIR }
|
</call>
|
|
<call function="'SetVar'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'type' : 'shared',
|
'variable' : 'Job%s_LogsDir=%s' % (STAXJobID,local.directory) }
|
</call>
|
|
<!-- Create the local folders to store data -->
|
<call function="'CreateFolders'"/>
|
|
<!-- Create folders -->
|
<message>'Copy OpenDS css and png files under %s' % logs.reports</message>
|
<call function="'copyFile'">
|
{
|
'srcfile' : '%s/opends.css' % TESTS_RESOURCE_DIR,
|
'destfile' : '%s/opends.css' % logs.reports
|
}
|
</call>
|
<call function="'copyFile'">
|
{
|
'srcfile' : '%s/opendj_logo.png' % TESTS_RESOURCE_DIR,
|
'destfile' : '%s/opendj_logo.png' % logs.reports
|
}
|
</call>
|
|
<message>'Copy xsl files under %s' % logs.reports</message>
|
<call function="'copyFile'">
|
{
|
'srcfile' : '%s/gen-groups-report.xsl' % TESTS_XSL_DIR,
|
'destfile' : '%s/gen-groups-report.xsl' % logs.reports
|
}
|
</call>
|
</sequence>
|
|
</function>
|
|
<function name="loadJobEnvironment">
|
<function-prolog>
|
This function loads the environment (libraries, functions, variables)
|
needed by the test jobs.
|
</function-prolog>
|
<function-map-args>
|
<function-arg-def name="parent" type="optional" default="''">
|
<function-arg-description>
|
Location of target host
|
</function-arg-description>
|
<function-arg-property name="type" value="integer"/>
|
</function-arg-def>
|
</function-map-args>
|
|
<sequence>
|
|
<message>
|
'Load environment for test suite execution.'
|
</message>
|
|
<!-- All exceptions are logged to user log -->
|
<script>
|
STAXLogMessage = 1
|
</script>
|
|
<call function="'importSharedLibraries'"/>
|
|
<call function="'importPythonLibraries'"/>
|
|
<call function="'initialiseGlobalVariables'"/>
|
|
<call function="'GetVar'">
|
{ 'location' : STAF_REMOTE_HOSTNAME,
|
'type' : 'shared',
|
'variable' : 'Job%s_LogsDir' % parent }
|
</call>
|
|
<!-- TODO: defend against mangled STAFResult -->
|
<script>
|
parentsLogDir=STAFResult
|
</script>
|
|
<message>'%s' % parentsLogDir</message>
|
|
<call function="'SetFolders'">
|
{ 'sourceDir' : '%s' % TESTS_ROOT,
|
'localDir' : '%s' % parentsLogDir,
|
'remoteDir' : DIRECTORY_INSTANCE_DIR }
|
</call>
|
|
</sequence>
|
|
</function>
|
|
|
</stax>
|