From f9e774927cb8654ba3adede4761fcf18a9327570 Mon Sep 17 00:00:00 2001
From: andrug <andrug@localhost>
Date: Fri, 11 Apr 2008 09:13:17 +0000
Subject: [PATCH] rework configuration_opends and allow tuning replication purge delay
---
opends/tests/system-tests/phases/parser/parser.py | 47 ++---
opends/tests/system-tests/scenario/conf.dtd | 7
opends/tests/system-tests/phases/configuration/configuration_opends.xml | 485 ++++++++++++++++++++++++++++++++++++++++++-----------
3 files changed, 407 insertions(+), 132 deletions(-)
diff --git a/opends/tests/system-tests/phases/configuration/configuration_opends.xml b/opends/tests/system-tests/phases/configuration/configuration_opends.xml
index 08eafa0..94eae9d 100755
--- a/opends/tests/system-tests/phases/configuration/configuration_opends.xml
+++ b/opends/tests/system-tests/phases/configuration/configuration_opends.xml
@@ -52,6 +52,82 @@
<sequence>
<!-- ===== Start instances ===== -->
+ <call function="'startInstances'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+
+
+ <!-- ==== Configure sequentially replication on intances ==== -->
+ <if expr="len(topoInstances) > 1">
+ <sequence>
+ <call function="'enableReplications'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+ <call function="'initializeReplications'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+ <!--== OpenDS Instance tuning : Replication purge delay ==-->
+ <call function="'tunePurgeDelay'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+ </sequence>
+ </if>
+
+
+ <!--== OpenDS Instance tuning : DB Cache ==-->
+ <call function="'tuneDBCache'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+
+
+ <!-- == Post operations == -->
+ <call function="'configureOpendsPostamble'">
+ {
+ 'topoInstances' : topoInstances,
+ 'filePrefix' : filePrefix
+ }
+ </call>
+
+
+ </sequence>
+ </function>
+
+
+
+ <!-- ************************************************************ -->
+ <function name="startInstances" scope="local">
+ <function-prolog>
+ This function starts all instances.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
<paralleliterate in="topoInstances" var="instance">
<sequence>
<call function="'getLogFileName'">
@@ -71,6 +147,7 @@
str = '%s port=\"%s\"' % (str, instance.getLDAPPort())
str = '%s product=\"opends\">\n' % str
cFileFd.write(str)
+
</script>
<call function="'isAlive'">
@@ -96,16 +173,36 @@
</if>
<script>
cFileFd.close()
- cFileFd = ''
</script>
</sequence>
</paralleliterate>
-
-
- <!-- ==== Configure sequentially replication on intances ==== -->
- <!-- configure replication with topoInstances[0] and each -->
- <!-- other instances in the topoInstances list -->
- <!-- do not use parrallel run -->
+ </sequence>
+ </function>
+
+
+ <!-- ************************************************************ -->
+ <!-- ==== Configure sequentially replication on intances ==== -->
+ <!-- configure replication with topoInstances[0] and each -->
+ <!-- other instances in the topoInstances list -->
+ <!-- do not use parrallel run -->
+ <function name="enableReplications" scope="local">
+ <function-prolog>
+ This function enables replication between servers using dsreplication.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
<iterate in="topoInstances" var="instance">
<sequence>
<script>
@@ -195,99 +292,14 @@
</if>
<script>
cFileFd.close()
- cFileFd = ''
</script>
</sequence>
</iterate>
-
-
- <!--== Initialize replication (totalUpdate) ==-->
- <iterate in="topoInstances" var="instance">
- <sequence>
- <call function="'getLogFileName'">
- { 'type' : 'instance',
- 'object' : instance,
- 'prefix' : filePrefix
- }
- </call>
- <script>
- logFile = STAXResult
- # reopen existing files, no need to add in fileList variable
- # as it has already been added
- cFileFd = open(logFile,'a')
- </script>
- <script>
- foundInstance = FALSE
- foundTotalUpdate = FALSE
-
- # try to get the instance objectclass
- # of the current instance suffix topology
- result = suffix.getElementFromTopology(instance.getName())
- foundInstance = result[0]
- topoElement = result[1]
-
- # if the current instance is in the suffix topology,
- # then check if need to do a totalupdate
- if foundInstance == TRUE:
- if topoElement.getInitRule().lower() == "totalupdate":
- foundTotalUpdate = TRUE
- sourceInstanceName = topoElement.getInstanceSourceName()
- for tmpInstance in topoInstances:
- if sourceInstanceName == tmpInstance.getName():
- sourceInstance = tmpInstance
- break
- </script>
-
- <!--== If sourceInstanceName is defined ==-->
- <!--== then we have to run totalupdate ==-->
- <if expr="foundTotalUpdate == TRUE">
- <sequence>
- <message>
- ' ** Initialize replication between %s and %s (source)' % \
- (instance.getName(),sourceInstance.getName())
- </message>
- <call function="'initializeReplication'">
- {
- 'location' : instance.getHost(),
- 'dsPath' : instance.getInstallDir(),
- 'dsInstanceHost' : instance.getHost(),
- 'dsInstancePort' : instance.getLDAPPort(),
- 'sourceInstanceHost' : sourceInstance.getHost(),
- 'sourceInstancePort' : sourceInstance.getLDAPPort(),
- 'replicationDnList' : [suffix.getSuffixDn()],
- 'fileFd' : cFileFd
- }
- </call>
- </sequence>
- </if>
-
- <!-- == Post operations == -->
- <message>
- '%s on %s : configuration done' % \
- (instance.getName(),instance.getHost())
- </message>
-
- <script>
- cFileFd.write('</instance>\n')
- cFileFd.close()
- cFileFd = ''
- </script>
-
-
- </sequence>
- </iterate>
-
-
</sequence>
</function>
-
-
-
-
-
-
+ <!-- ************************************************************ -->
<!-- Enable replication between servers using dsreplication -->
<function name="enableReplication" scope="local">
<function-prolog>
@@ -509,13 +521,100 @@
</return>
</sequence>
</function>
-
-
-
-
-
-
-
+
+
+
+
+
+ <!-- ************************************************************ -->
+ <function name="initializeReplications" scope="local">
+ <function-prolog>
+ This function intializes between all servers in the topology
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <!--== Initialize replication (totalUpdate) ==-->
+ <iterate in="topoInstances" var="instance">
+ <sequence>
+ <call function="'getLogFileName'">
+ { 'type' : 'instance',
+ 'object' : instance,
+ 'prefix' : filePrefix
+ }
+ </call>
+ <script>
+ logFile = STAXResult
+ # reopen existing files, no need to add in fileList variable
+ # as it has already been added
+ cFileFd = open(logFile,'a')
+ </script>
+ <script>
+ foundInstance = FALSE
+ foundTotalUpdate = FALSE
+
+ # try to get the instance objectclass
+ # of the current instance suffix topology
+ result = suffix.getElementFromTopology(instance.getName())
+ foundInstance = result[0]
+ topoElement = result[1]
+
+ # if the current instance is in the suffix topology,
+ # then check if need to do a totalupdate
+ if foundInstance == TRUE:
+ if topoElement.getInitRule().lower() == "totalupdate":
+ foundTotalUpdate = TRUE
+ sourceInstanceName = topoElement.getInstanceSourceName()
+ for tmpInstance in topoInstances:
+ if sourceInstanceName == tmpInstance.getName():
+ sourceInstance = tmpInstance
+ break
+ </script>
+
+ <!--== If sourceInstanceName is defined ==-->
+ <!--== then we have to run totalupdate ==-->
+ <if expr="foundTotalUpdate == TRUE">
+ <sequence>
+ <message>
+ ' ** Initialize replication between %s and %s (source)' % \
+ (instance.getName(),sourceInstance.getName())
+ </message>
+ <call function="'initializeReplication'">
+ {
+ 'location' : instance.getHost(),
+ 'dsPath' : instance.getInstallDir(),
+ 'dsInstanceHost' : instance.getHost(),
+ 'dsInstancePort' : instance.getLDAPPort(),
+ 'sourceInstanceHost' : sourceInstance.getHost(),
+ 'sourceInstancePort' : sourceInstance.getLDAPPort(),
+ 'replicationDnList' : [suffix.getSuffixDn()],
+ 'fileFd' : cFileFd
+ }
+ </call>
+ </sequence>
+ </if>
+ <script>
+ cFileFd.close()
+ cFileFd = ''
+ </script>
+ </sequence>
+ </iterate>
+ </sequence>
+ </function>
+
+
<!-- Initialize replicated suffix with the contents -->
<!-- of a source server using dsreplication -->
<function name="initializeReplication" scope="local">
@@ -588,7 +687,7 @@
Expected return code value. Default value is 0
</function-arg-description>
</function-arg-def>
-
+
<function-arg-def name="fileFd" type="required">
<function-arg-description>
output file descriptor
@@ -683,11 +782,193 @@
<return>
STAXReason
</return>
-
+ </sequence>
+ </function>
+
+
+ <!-- ************************************************************ -->
+ <function name="tuneDBCache" scope="local">
+ <function-prolog>
+ This function tunes purge delay.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <paralleliterate in="topoInstances" var="instance">
+ <sequence>
+ <call function="'getLogFileName'">
+ { 'type' : 'instance',
+ 'object' : instance,
+ 'prefix' : filePrefix
+ }
+ </call>
+ <script>
+ logFile = STAXResult
+ # reopen existing files, no need to add in fileList variable
+ # as it has already been added
+ cFileFd = open(logFile,'a')
+
+ tuning = instance.getTuning()
+ </script>
+ <if expr="tuning.getDatabaseCachePercentage() != NOT_DEFINED">
+ <sequence>
+ <message>
+ ' ** Tune DB Cache for %s' % instance.getName()
+ </message>
+ <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+ file="'%s/opendscfg.xml' % (SHARED_FUNC_DIR)"/>
+ <call function="'dsconfig'">
+ {
+ 'location' : instance.getHost(),
+ 'dsPath' : instance.getInstallDir(),
+ 'dsInstanceHost' : instance.getHost(),
+ 'dsInstancePort' : instance.getLDAPPort(),
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-backend-prop',
+ 'objectType' : 'backend-name',
+ 'objectName' : 'userRoot',
+ 'optionsString' : '--set db-cache-percent:%s' % \
+ tuning.getDatabaseCachePercentage(),
+ 'fileFd' : cFileFd
+ }
+ </call>
+ </sequence>
+ </if>
+ <script>
+ cFileFd.close()
+ </script>
+ </sequence>
+ </paralleliterate>
</sequence>
</function>
+ <!-- ************************************************************ -->
+ <function name="tunePurgeDelay" scope="local">
+ <function-prolog>
+ This function tunes purge delay.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <paralleliterate in="topoInstances" var="instance">
+ <sequence>
+ <call function="'getLogFileName'">
+ { 'type' : 'instance',
+ 'object' : instance,
+ 'prefix' : filePrefix
+ }
+ </call>
+ <script>
+ logFile = STAXResult
+ # reopen existing files, no need to add in fileList variable
+ # as it has already been added
+ cFileFd = open(logFile,'a')
+
+ tuning = instance.getTuning()
+ </script>
+ <if expr="tuning.getReplicationPurgeDelay() != NOT_DEFINED">
+ <sequence>
+ <message>
+ ' ** Tune Replication Purge delay for %s' % instance.getName()
+ </message>
+ <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+ file="'%s/opendscfg.xml' % (SHARED_FUNC_DIR)"/>
+ <call function="'dsconfig'">
+ {
+ 'location' : instance.getHost(),
+ 'dsPath' : instance.getInstallDir(),
+ 'dsInstanceHost' : instance.getHost(),
+ 'dsInstancePort' : instance.getLDAPPort(),
+ 'dsInstanceDn' : DIRECTORY_INSTANCE_DN,
+ 'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
+ 'subcommand' : 'set-replication-server-prop',
+ 'objectType' : 'provider-name',
+ 'objectName' : MultimasterSync,
+ 'optionsString' : '--set "replication-purge-delay:%s"' % \
+ tuning.getReplicationPurgeDelay(),
+ 'fileFd' : cFileFd
+ }
+ </call>
+ </sequence>
+ </if>
+ <script>
+ cFileFd.close()
+ </script>
+ </sequence>
+ </paralleliterate>
+ </sequence>
+ </function>
+
+
+ <!-- ************************************************************ -->
+ <function name="configureOpendsPostamble" scope="local">
+ <function-prolog>
+ This function closes all log files.
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="topoInstances" type="required">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ </function-arg-def>
+ <function-arg-def name="filePrefix" type="required">
+ <function-arg-description>
+ prefix for output files
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+ <paralleliterate in="topoInstances" var="instance">
+ <sequence>
+ <call function="'getLogFileName'">
+ { 'type' : 'instance',
+ 'object' : instance,
+ 'prefix' : filePrefix
+ }
+ </call>
+ <script>
+ logFile = STAXResult
+ # reopen existing files, no need to add in fileList variable
+ # as it has already been added
+ cFileFd = open(logFile,'a')
+ cFileFd.write('</instance>\n')
+ cFileFd.close()
+ </script>
+ <message>
+ '%s on %s : configuration done' % \
+ (instance.getName(),instance.getHost())
+ </message>
+ </sequence>
+ </paralleliterate>
+ </sequence>
+ </function>
diff --git a/opends/tests/system-tests/phases/parser/parser.py b/opends/tests/system-tests/phases/parser/parser.py
index 96b4815..9158ab9 100755
--- a/opends/tests/system-tests/phases/parser/parser.py
+++ b/opends/tests/system-tests/phases/parser/parser.py
@@ -196,7 +196,7 @@
"Describes tuning informations for OpenDS instance"
def __init__(self,isJava,xms,xmx,xxNewSize,xxMaxNewSize,\
xxSurvivorRatio,xxPermSize,xxMaxPermSize,xxUseConcMarkSweepGC,\
- isDataBase,databaseCachePercentage):
+ databaseCachePercentage,replicationPurgeDelay):
self.isJava = isJava
self.javaArgs = NOT_DEFINED
self.xms = xms
@@ -207,8 +207,8 @@
self.xxPermSize = xxPermSize
self.xxMaxPermSize = xxMaxPermSize
self.xxUseConcMarkSweepGC = xxUseConcMarkSweepGC
- self.isDataBase = isDataBase
self.databaseCachePercentage = databaseCachePercentage
+ self.replicationPurgeDelay = replicationPurgeDelay
def getIsJava(self):
return self.isJava
@@ -243,12 +243,11 @@
def getXxUseConcMarkSweepGC(self):
return self.xxUseConcMarkSweepGC
- def getIsDataBase(self):
- return self.isDataBase
-
def getDatabaseCachePercentage(self):
return self.databaseCachePercentage
+ def getReplicationPurgeDelay(self):
+ return self.replicationPurgeDelay
#
# Class for instance
@@ -473,20 +472,6 @@
# FUNCTIONS
#
-def getRefObjectByName(myName,myList):
- """This function returns the reference of a object specified
- by myName if it exist in myList"""
- found = FALSE
- msg = ''
- for myObject in myList:
- if myObject.getName() == myName:
- found = TRUE
- break
- if found == FALSE:
- msg = 'ERROR, getRefObjectByName(): cant find object reference for name %s'%\
- myName
- return [msg,myObject]
-
def _getPropValue(myNode):
"This function get the first node text value of a node"
@@ -668,9 +653,10 @@
cXxSurvivorRatio = NOT_DEFINED
cXxPermSize = NOT_DEFINED
cXxMaxPermSize = NOT_DEFINED
- cXxUseConcMarkSweepGC = NOT_DEFINED
- cIsDataBase = 'false'
- cDatabaseCachePercentage = NOT_DEFINED
+ cXxUseConcMarkSweepGC = NOT_DEFINED
+ cDatabaseCachePercentage = NOT_DEFINED
+ cReplicationPurgeDelay = NOT_DEFINED
+ cReplicationPurgeDelayUnit = NOT_DEFINED
#
# Parsing second level : host,ports,...
@@ -751,11 +737,17 @@
'xxUseConcMarkSweepGC')
elif (thisTuning.getNodeType() == Node.ELEMENT_NODE and
- thisTuning.getNodeName() == 'databaseCache'):
- cIsDataBase = 'true'
- cDatabaseCachePercentage = _getAttributeNode(thisTuning,
- 'percentage')
+ thisTuning.getNodeName() == 'databaseCachePercentage'):
+ cDatabaseCachePercentage = _getPropValue(thisTuning)
+ elif (thisTuning.getNodeType() == Node.ELEMENT_NODE and
+ thisTuning.getNodeName() == 'replicationPurgeDelay'):
+ cReplicationPurgeDelayUnit = _getAttributeNode(thisTuning,'unit')
+ if cReplicationPurgeDelayUnit == NOT_DEFINED:
+ msg = '%s\n ERROR: instance %s: unknown unit purge delay'%msg
+ cReplicationPurgeDelay = _getPropValue(thisTuning)
+ cReplicationPurgeDelay = '%s %s' % (cReplicationPurgeDelay,\
+ cReplicationPurgeDelayUnit)
# must be at the end of the if case
elif (thisSubChild.getNodeType() == Node.TEXT_NODE or
@@ -778,7 +770,8 @@
cOpendsTuning = OpendsTuning(cIsJava,cXms,cXmx,cXxNewSize,cXxMaxNewSize,\
cXxSurvivorRatio,cXxPermSize,cXxMaxPermSize,\
cXxUseConcMarkSweepGC,\
- cIsDataBase,cDatabaseCachePercentage)
+ cDatabaseCachePercentage,\
+ cReplicationPurgeDelay)
cInstallDir = '%s/%s/%s' % (cInstallDir,cName,opendsName)
return [msg,OpendsInstance(cId,cName,cProduct,cRole,cHost,cInstallDir,\
diff --git a/opends/tests/system-tests/scenario/conf.dtd b/opends/tests/system-tests/scenario/conf.dtd
index 3f9ae0a..19db411 100755
--- a/opends/tests/system-tests/scenario/conf.dtd
+++ b/opends/tests/system-tests/scenario/conf.dtd
@@ -58,7 +58,7 @@
sslEnabled ( true | false ) "false"
certificate ( generateSelfSigned ) "generateSelfSigned"
startTlsEnabled ( true | false ) "false">
- <!ELEMENT tuning (java?,databaseCache?)>
+ <!ELEMENT tuning (java?,databaseCachePercentage?,replicationPurgeDelay?)>
<!ELEMENT java EMPTY>
<!ATTLIST java
xms NMTOKEN #IMPLIED
@@ -69,8 +69,9 @@
xxPermSize NMTOKEN #IMPLIED
xxMaxPermSize NMTOKEN #IMPLIED
xxUseConcMarkSweepGC NMTOKEN #IMPLIED>
- <!ELEMENT databaseCache EMPTY>
- <!ATTLIST databaseCache percentage NMTOKEN #REQUIRED>
+ <!ELEMENT databaseCachePercentage (#PCDATA)>
+ <!ELEMENT replicationPurgeDelay (#PCDATA)>
+ <!ATTLIST replicationPurgeDelay unit ( s | m | h ) "s">
<!-- ========== SUFFIX NODE ========================= -->
--
Gitblit v1.10.0