environment.xml revision 5616
3855N/A<?xml version="1.0" encoding="UTF-8" standalone="no"?>
3855N/A<!DOCTYPE stax SYSTEM "/stax.dtd">
3855N/A<!--
3855N/A ! CDDL HEADER START
3855N/A !
3855N/A ! The contents of this file are subject to the terms of the
3855N/A ! Common Development and Distribution License, Version 1.0 only
3855N/A ! (the "License"). You may not use this file except in compliance
3855N/A ! with the License.
3855N/A !
3855N/A ! You can obtain a copy of the license at
3855N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
3855N/A ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
3855N/A ! See the License for the specific language governing permissions
3855N/A ! and limitations under the License.
3855N/A !
3855N/A ! When distributing Covered Code, include this CDDL HEADER in each
3855N/A ! file and include the License file at
3855N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
3855N/A ! add the following below this CDDL HEADER, with the fields enclosed
3855N/A ! by brackets "[]" replaced with your own identifying information:
3855N/A ! Portions Copyright [yyyy] [name of copyright owner]
3855N/A !
3855N/A ! CDDL HEADER END
3855N/A !
3855N/A ! Copyright 2007-2010 Sun Microsystems, Inc.
4458N/A ! Portions Copyright 2011 ForgeRock AS.
3855N/A ! -->
3855N/A<stax>
3855N/A
3855N/A <function name="importSharedLibraries">
4711N/A <function-prolog>
4711N/A This function imports the shared function xml libraries.
4711N/A </function-prolog>
4711N/A
4711N/A <sequence>
4711N/A
4711N/A <!--- Import all the shared xml libraries -->
4711N/A
4711N/A <script>
4711N/A sharedLibs=[]
4711N/A sharedLibs.append('baselib.xml')
4711N/A sharedLibs.append('ldap.xml')
4711N/A sharedLibs.append('utils.xml')
4711N/A sharedLibs.append('stafcmd.xml')
4711N/A sharedLibs.append('staxcmd.xml')
4711N/A sharedLibs.append('dsadm.xml')
4711N/A sharedLibs.append('dsconfig.xml')
4711N/A sharedLibs.append('security.xml')
4711N/A sharedLibs.append('topology.xml')
4711N/A sharedLibs.append('signals.xml')
4711N/A sharedLibs.append('tools.xml')
4711N/A sharedLibs.append('webcontainer.xml')
4711N/A sharedLibs.append('snmp.xml')
4711N/A </script>
4711N/A
4711N/A <iterate var="sharedLib" in="sharedLibs">
3855N/A <import machine="STAF_LOCAL_HOSTNAME"
3855N/A file="'%s/%s' % (TESTS_FUNCTIONS_DIR,sharedLib)" />
3855N/A </iterate>
3855N/A
3855N/A </sequence>
3855N/A
3855N/A </function>
3855N/A
3855N/A <function name="importPythonLibraries">
3855N/A <function-prolog>
3855N/A This function imports the Python libraries and objects,
3855N/A both starndard and local shared ones.
3855N/A </function-prolog>
3855N/A
3855N/A <sequence>
3855N/A
3855N/A <!-- Load in any standard python libraries -->
3855N/A <script>
4458N/A import re
3855N/A import os
3855N/A import sys
3855N/A from org.python.core import PyString,PyUnicode,PyList,PyDictionary
3855N/A </script>
3855N/A
3855N/A <!-- Load in any additional Java classes -->
3855N/A <script>
3855N/A import java.io.FileNotFoundException
3855N/A </script>
3855N/A
3855N/A <!-- Load in any standard python functions -->
4458N/A <script>
3855N/A from time import localtime,strftime
3855N/A </script>
3855N/A
3855N/A <!-- Load in the local shared python objects from libraries -->
3855N/A <script>
3855N/A sys.path.append("%s/shared/python" % TESTS_ROOT )
3855N/A from common import *
3855N/A from security import *
3855N/A from replication import *
3855N/A from snmp import *
3855N/A from schema import *
3855N/A from objects import *
3855N/A </script>
3855N/A
3855N/A
3855N/A </sequence>
3855N/A </function>
3855N/A
3855N/A
3855N/A
3855N/A
3855N/A
3855N/A <function name="initialiseGlobalVariables">
3855N/A <function-prolog>
3855N/A This function initialises a set of global variables.
3855N/A </function-prolog>
3855N/A
3855N/A <sequence>
3855N/A <!-- Default LDAP Server Object -->
3855N/A <script>
3855N/A server=directory_server()
3855N/A server.location = STAF_REMOTE_HOSTNAME
3855N/A server.host = DIRECTORY_INSTANCE_HOST
3855N/A server.port = DIRECTORY_INSTANCE_PORT
3855N/A server.adminport = DIRECTORY_INSTANCE_ADMIN_PORT
3855N/A server.dn = DIRECTORY_INSTANCE_DN
3855N/A server.password = DIRECTORY_INSTANCE_PSWD
3855N/A server.suffix = DIRECTORY_INSTANCE_SFX
3855N/A server.backend = DIRECTORY_INSTANCE_BE
3855N/A
3855N/A TestSuiteStartTime = STAXGlobal([])
3855N/A </script>
3855N/A
3855N/A <!-- Set the signal handlers -->
3855N/A <call function="'signals'"/>
3855N/A
3855N/A <!-- Initialize any global variables -->
3855N/A <script>
3855N/A True = 1
3855N/A False = 0
3855N/A
3855N/A STAXLogMessage = 1
3855N/A if is_windows_platform(STAF_REMOTE_HOSTNAME):
3855N/A fileExt='.bat'
3855N/A scriptExt='.bat'
3855N/A fileFolder='bat'
3855N/A pathSeparator=';'
3855N/A newLine='\r\n'
3855N/A else:
3855N/A fileExt=''
3855N/A scriptExt='.sh'
3855N/A fileFolder='bin'
3855N/A pathSeparator=':'
3855N/A newLine='\n'
3855N/A
3855N/A if DIRECTORY_INSTANCE_BIN != DIRECTORY_INSTANCE_DIR:
3855N/A IPS_PKG = True
3862N/A else:
3855N/A IPS_PKG = False
3855N/A
3855N/A CurrentTestPath={}
3855N/A DSInfoServersDict={}
3855N/A
3855N/A # threshold set so that functions such as getFile may not cause staf
3855N/A # process to run out of memory (value in bytes)
3855N/A MAX_READABLE_SIZE = 104800
3855N/A
3855N/A # this function return a well-formatted testcase name
3855N/A def getTestCaseName(name):
3855N/A return '%s: %s: %s' % (CurrentTestPath['group'],CurrentTestPath['suite'],name)
3855N/A
3855N/A DSCONFIG = 'dsconfig'
3855N/A DSREPLICATION = 'dsreplication'
3855N/A
3855N/A AdminUID = 'admin'
3855N/A AdminPswd = 'admin'
3855N/A
3855N/A # Replication configuration default names
3855N/A MultimasterSync = 'Multimaster Synchronization'
3855N/A MultimasterType = 'multimaster'
3862N/A
3862N/A # Replication execution mode variables: if not defined, set "random"
3862N/A # values:
3862N/A # (day of the month % 4) == 0 --> (split servers, eclmode n/a)
3862N/A # (day of the month % 4) == 1 --> (don't split, opends eclmode)
3862N/A # (day of the month % 4) == 2 --> (don't split, draft eclmode)
3862N/A # (day of the month % 4) == 3 --> (don't split, eclmode n/a)
3862N/A import time
3862N/A monthday = time.localtime()[2]
3862N/A rewriteConfigFile = False
3862N/A
3862N/A if REPLICATION_SPLIT_SERVERS == '':
3862N/A rewriteConfigFile = True
3855N/A oldSplitConfig = """REPLICATION_SPLIT_SERVERS = ''"""
3855N/A if monthday % 4 == 0:
4711N/A REPLICATION_SPLIT_SERVERS = 'true'
4711N/A else:
4711N/A REPLICATION_SPLIT_SERVERS = 'false'
3855N/A newSplitConfig = """REPLICATION_SPLIT_SERVERS = '%s'""" % \
3855N/A REPLICATION_SPLIT_SERVERS
3855N/A else:
3855N/A newSplitConfig = """REPLICATION_SPLIT_SERVERS = '%s'""" % \
3855N/A REPLICATION_SPLIT_SERVERS
3855N/A oldSplitConfig = newSplitConfig
3855N/A
3855N/A if REPLICATION_ECL_MODE == '':
3855N/A rewriteConfigFile = True
3855N/A oldEclmodeConfig = """REPLICATION_ECL_MODE = ''"""
3855N/A if monthday % 4 == 1:
3855N/A REPLICATION_ECL_MODE = 'opends'
3855N/A 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>