1476N/A<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2887N/A<!DOCTYPE stax SYSTEM "/shared/stax.dtd">
1476N/A<!--
1476N/A ! CDDL HEADER START
1476N/A !
1476N/A ! The contents of this file are subject to the terms of the
1476N/A ! Common Development and Distribution License, Version 1.0 only
1476N/A ! (the "License"). You may not use this file except in compliance
1476N/A ! with the License.
1476N/A !
1476N/A ! You can obtain a copy of the license at
1476N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
1476N/A ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
1476N/A ! See the License for the specific language governing permissions
1476N/A ! and limitations under the License.
1476N/A !
1476N/A ! When distributing Covered Code, include this CDDL HEADER in each
1476N/A ! file and include the License file at
1476N/A ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
1476N/A ! add the following below this CDDL HEADER, with the fields enclosed
1476N/A ! by brackets "[]" replaced with your own identifying information:
1476N/A ! Portions Copyright [yyyy] [name of copyright owner]
1476N/A !
1476N/A ! CDDL HEADER END
1476N/A !
5073N/A ! Copyright 2007-2010 Sun Microsystems, Inc.
5822N/A ! Portions Copyright 2011-2012 ForgeRock AS.
1476N/A ! -->
1476N/A<stax>
1476N/A
1476N/A <defaultcall function="replication_setup"/>
1476N/A
1476N/A <function name="replication_setup">
1797N/A <function-map-args>
2913N/A <function-arg-def name="topologyFile"
2913N/A type="optional"
4458N/A default="'%s/basic_topology.txt' % REPLICATION_CONFIG_DIR">
1797N/A <function-arg-description>
1797N/A Pathname to file describing the topology.
1797N/A </function-arg-description>
1797N/A <function-arg-property name="type" value="filepath"/>
1797N/A </function-arg-def>
2913N/A <function-arg-def name="secureReplication"
2913N/A type="optional"
2913N/A default="None">
2913N/A <function-arg-description>
2913N/A Encrypt replication channels
2913N/A </function-arg-description>
2913N/A <function-arg-property name="type" value="boolean"/>
2913N/A </function-arg-def>
3269N/A <function-arg-def name="dataFile"
3269N/A type="optional"
3269N/A default="None">
3269N/A <function-arg-description>
3269N/A Name of the data file within shared/data/replication/ for suffix
3269N/A initialisation.
3269N/A If no filename provided (default), the topology won't be initialised.
3269N/A If a filename provided, after initialisation the suffix will be
3269N/A backuped under masterBackupDir.
3269N/A </function-arg-description>
3269N/A <function-arg-property name="type" value="filename"/>
3269N/A </function-arg-def>
3810N/A <function-arg-def name="isolateLdapServers"
3810N/A type="optional"
3810N/A default="None">
3810N/A <function-arg-description>
3810N/A Break the cross-reference between Ldap Servers and Replication Servers
3810N/A (i.e. make LS1 point to RS1 exclusively, LS2 to RS2, etc.)
3810N/A </function-arg-description>
3810N/A <function-arg-property name="type" value="boolean"/>
3810N/A </function-arg-def>
3810N/A <function-arg-def name="enableDebugLogs"
3810N/A type="optional"
3810N/A default="None">
3810N/A <function-arg-description>
3810N/A Enable de debug logs
3810N/A </function-arg-description>
3810N/A <function-arg-property name="type" value="boolean"/>
3810N/A </function-arg-def>
5822N/A <function-arg-def name="label"
5822N/A type="optional"
5822N/A default="'Replication'">
5822N/A <function-arg-description>
5822N/A Friendly label name
5822N/A </function-arg-description>
5822N/A <function-arg-property name="type" value="string"/>
5822N/A </function-arg-def>
2175N/A </function-map-args>
2175N/A
1476N/A <sequence>
1476N/A
1476N/A <block name="'replication-setup'">
1476N/A
5822N/A <testcase name="getTestCaseName('%s Setup' % label)">
1476N/A
5822N/A <try>
5822N/A
3269N/A <sequence>
5822N/A <call function="'testCase_Preamble'"/>
5822N/A
3269N/A <message>
5822N/A 'Create DS topology as described in %s' % topologyFile
3269N/A </message>
5822N/A
5822N/A <call function="'createTopology'">
5822N/A { 'topologyDescFile' : topologyFile,
5822N/A 'sharedDataFolder' : 'replication',
5822N/A 'splitReplicationServers' : globalSplitServers
5822N/A }
5822N/A </call>
5822N/A
5822N/A <call function="'checkRC'">
5822N/A { 'returncode' : RC ,
5822N/A 'result' : STAXResult
3269N/A }
3269N/A </call>
5822N/A
5822N/A <!-- Setup variables -->
5822N/A <script>
5822N/A client = _topologyServerList[0]
5822N/A clientHost = client.getHostname()
5822N/A clientPath = '%s/%s' % (client.getDir(),OPENDSNAME)
5822N/A
5822N/A server1 = _topologyServerList[0]
5822N/A server2 = _topologyServerList[1]
5822N/A
5822N/A master = _topologyServerList[0]
5822N/A masterHost = master.getHostname()
5822N/A masterReplicationServer = master.getChangelogServer()
5822N/A masterPath = '%s/%s' % (master.getDir(),OPENDSNAME)
5822N/A
5822N/A masterDataDir = '%s' % master.getDataDir()
5822N/A clientDataDir = '%s' % client.getDataDir()
5822N/A masterBackupDir = '%s' % master.getTmpDir()
5822N/A
5822N/A synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
5822N/A
5822N/A consumerList = _topologyServerList[1:]
5822N/A
5822N/A domainMap = STAXGlobal({})
5822N/A </script>
5822N/A
5822N/A <if expr="dataFile">
5822N/A <sequence>
2483N/A <script>
5822N/A importDataFile = '%s/replication/%s' % (masterDataDir, dataFile)
5822N/A </script>
4631N/A
2483N/A <message>
5822N/A 'Import data from %s into server %s:%s' \
5822N/A % (importDataFile, masterHost, master.getPort())
2483N/A </message>
5822N/A
5822N/A <!-- Import data into "master" Directory Server -->
5822N/A <call function="'ImportLdifWithScript'">
5822N/A { 'location' : masterHost,
5822N/A 'dsPath' : masterPath,
5822N/A 'backEnd' : DIRECTORY_INSTANCE_BE,
5822N/A 'ldifFile' : importDataFile
5822N/A }
2483N/A </call>
5822N/A
5822N/A <!-- Backup "master" server -->
5822N/A <call function="'backup'">
5822N/A { 'location' : masterHost,
5822N/A 'dsPath' : masterPath,
5822N/A 'backupDir' : masterBackupDir
5822N/A }
5822N/A </call>
2483N/A </sequence>
5822N/A </if>
5822N/A
5822N/A
5822N/A <!-- Start the servers in the topology -->
5822N/A <call function="'startServers'">
5822N/A [_splitServerList]
5822N/A </call>
5822N/A
5822N/A <if expr="len(_topologyReplServerList) != 0">
5822N/A <paralleliterate var="replServer" in="_topologyReplServerList">
5822N/A <!-- Remove userRoot backend from replication servers -->
5822N/A <sequence>
5822N/A <message>
5822N/A 'Remove userRoot backend from replication server %s:%s' % \
5822N/A (replServer.getHostname(), replServer.getPort())
5822N/A </message>
3810N/A
5822N/A <call function="'dsconfig'">
5822N/A { 'location' : replServer.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (replServer.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : replServer.getHostname(),
5822N/A 'dsInstanceAdminPort' : replServer.getAdminPort(),
5822N/A 'dsInstanceDn' : replServer.getRootDn(),
5822N/A 'dsInstancePswd' : replServer.getRootPwd(),
5822N/A 'subcommand' : 'delete-backend',
5822N/A 'objectType' : 'backend-name',
5822N/A 'objectName' : 'userRoot'
5822N/A }
5822N/A </call>
5822N/A </sequence>
5822N/A </paralleliterate>
5822N/A </if>
4631N/A
5822N/A <iterate var="server" in="_splitServerList[1:]">
5822N/A <sequence>
5822N/A <!-- Configure replication if required so by the server
5822N/A ! (i.e. server is a changelog server and/or has synchronized
5822N/A ! suffixes)
5822N/A -->
5822N/A <if expr="server.requiresSynchronization()">
5822N/A <sequence>
5822N/A <message>
5822N/A 'Instance requires REPLICATION configuration.'
5822N/A </message>
5822N/A
5822N/A <script>
5822N/A if master.isOnlyLdapServer():
5822N/A masterReplPort = None
5822N/A else:
5822N/A masterReplPort = masterReplicationServer.getPort()
5822N/A
5822N/A if server.isOnlyLdapServer():
5822N/A serverReplPort = None
5822N/A else:
5822N/A replicationServer = server.getChangelogServer()
5822N/A serverReplPort = replicationServer.getPort()
5822N/A
5822N/A if server.isOnlyReplServer():
5822N/A suffixServer = master
5822N/A else:
5822N/A suffixServer = server
5822N/A
5822N/A replicatedSuffixList = suffixServer.getSynchronizedSuffixList()
5822N/A replicatedDnList = []
5822N/A for suffix in replicatedSuffixList:
5822N/A replicatedDnList.append(suffix.getSuffixDn())
5822N/A </script>
5822N/A
5822N/A <message>
5822N/A 'Enable replication for server:\nHost: %s\nLdap port: %s\n\
5822N/A Replication port: %s\nReplicated DN list: %s' \
5822N/A % (server.getHostname(), server.getPort(),
5822N/A serverReplPort, replicatedDnList)
5822N/A </message>
5822N/A
5822N/A <call function="'enableReplication'">
5822N/A { 'location' : clientHost,
5822N/A 'dsPath' : clientPath,
5822N/A 'refInstanceHost' : masterHost,
5822N/A 'refInstanceAdminPort' : master.getAdminPort(),
5822N/A 'refInstanceDn' : master.getRootDn(),
5822N/A 'refInstancePswd' : master.getRootPwd(),
5822N/A 'refReplicationPort' : masterReplPort,
5822N/A 'refSecureReplication' : secureReplication,
5822N/A 'refOnlyLdapServer' : master.isOnlyLdapServer(),
5822N/A 'refOnlyReplServer' : master.isOnlyReplServer(),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'dsReplicationPort' : serverReplPort,
5822N/A 'dsSecureReplication' : secureReplication,
5822N/A 'dsOnlyLdapServer' : server.isOnlyLdapServer(),
5822N/A 'dsOnlyReplServer' : server.isOnlyReplServer(),
5822N/A 'replicationDnList' : replicatedDnList
5822N/A }
4319N/A </call>
4319N/A </sequence>
5822N/A </if>
5822N/A
5822N/A </sequence>
5822N/A </iterate>
5822N/A
5822N/A
5822N/A <if expr="isolateLdapServers">
5822N/A <!-- Make each Ldap Server point only to its own Replication
5822N/A ! Server.
5822N/A ! This is used by the Conflict testsuite, in order to be able
5822N/A ! to simulate conflict scenarios -->
5822N/A <paralleliterate var="server" in="_topologyServerList" indexvar="i">
4319N/A <sequence>
4319N/A <script>
5822N/A ldapServer = '%s:%s' % (server.getHostname(),
5822N/A server.getPort())
5822N/A </script>
5822N/A
5822N/A <!-- Retrieve replication-domain name -->
5822N/A <call function="'dsconfig'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'subcommand' : 'list-replication-domains',
5822N/A 'objectType' : 'provider-name',
5822N/A 'objectName' : 'Multimaster Synchronization',
5822N/A 'optionsString' : '--script-friendly'
5822N/A }
5822N/A </call>
5822N/A <if expr='RC == 0'>
5822N/A <script>
5822N/A replicationDomains = STAXResult[0][1]
5822N/A for line in replicationDomains.splitlines():
5822N/A if line.find(synchroSuffix) != -1:
5822N/A domain = line
5822N/A domainMap[ldapServer] = domain
5822N/A break
5822N/A </script>
5822N/A </if>
5822N/A
5822N/A <script>
5822N/A if globalSplitServers:
5822N/A splitServer = _topologyReplServerList[i]
5822N/A replicationServer = splitServer.getChangelogServer()
5822N/A replServer = '%s:%s' % (splitServer.getHostname(),
5822N/A replicationServer.getPort())
5822N/A else:
5822N/A replicationServer = server.getChangelogServer()
5822N/A replServer = '%s:%s' % (server.getHostname(),
5822N/A replicationServer.getPort())
5822N/A
5822N/A options = '--domain-name "%s" --set replication-server:%s' \
5822N/A % (domainMap[ldapServer], replServer)
4319N/A </script>
4319N/A <message>
5822N/A 'Removing references to other replication servers \nfor \
5822N/A domain: %s \nfrom server: %s \nkeep replication server: %s' \
5822N/A % (domain, ldapServer, replServer)
5822N/A </message>
5822N/A <!-- Remove peer RS from replicated domain -->
5822N/A <call function="'dsconfig'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'subcommand' : 'set-replication-domain-prop',
5822N/A 'objectType' : 'provider-name',
5822N/A 'objectName' : 'Multimaster Synchronization',
5822N/A 'optionsString' : options
5822N/A }
5822N/A </call>
5822N/A </sequence>
5822N/A </paralleliterate>
5822N/A </if>
5822N/A
5822N/A
5822N/A <script>
5822N/A assuredReplication = globalAssuredReplication
5822N/A </script>
5822N/A <if expr="assuredReplication">
5822N/A <paralleliterate var="server" in="_topologyServerList">
5822N/A <sequence>
5822N/A <script>
5822N/A ldapServer = '%s:%s' % (server.getHostname(),
5822N/A server.getPort())
5822N/A </script>
5822N/A
5822N/A <if expr="isolateLdapServers">
5822N/A <!-- this means the domainMap has already been filled up -->
5822N/A <script>
5822N/A domain = domainMap[ldapServer]
5822N/A </script>
5822N/A <else>
5822N/A <sequence>
5822N/A <!-- Retrieve replication-domain name -->
5822N/A <call function="'dsconfig'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'subcommand' : 'list-replication-domains',
5822N/A 'objectType' : 'provider-name',
5822N/A 'objectName' : 'Multimaster Synchronization',
5822N/A 'optionsString' : '--script-friendly'
5822N/A }
5822N/A </call>
5822N/A <if expr='RC == 0'>
5822N/A <script>
5822N/A replicationDomains = STAXResult[0][1]
5822N/A for line in replicationDomains.splitlines():
5822N/A if line.find(synchroSuffix) != -1:
5822N/A domain = line
5822N/A domainMap[ldapServer] = domain
5822N/A break
5822N/A </script>
5822N/A </if>
5822N/A </sequence>
5822N/A </else>
5822N/A </if>
5822N/A <script>
5822N/A options = '--domain-name "%s" --set assured-type:%s' \
5822N/A % (domain, assuredReplication)
5822N/A </script>
5822N/A <message>
5822N/A 'Setting replication assured-type to: %s for server: %s \
5822N/A domain: %s' % (assuredReplication, ldapServer, domain)
4319N/A </message>
4319N/A <!-- Set assured -->
4319N/A <call function="'dsconfig'">
4319N/A { 'location' : server.getHostname(),
4319N/A 'dsPath' : '%s/%s' \
4319N/A % (server.getDir(),OPENDSNAME),
4319N/A 'dsInstanceHost' : server.getHostname(),
4319N/A 'dsInstanceAdminPort' : server.getAdminPort(),
4319N/A 'dsInstanceDn' : server.getRootDn(),
4319N/A 'dsInstancePswd' : server.getRootPwd(),
4319N/A 'subcommand' : 'set-replication-domain-prop',
4319N/A 'objectType' : 'provider-name',
4319N/A 'objectName' : 'Multimaster Synchronization',
4319N/A 'optionsString' : options
4319N/A }
4319N/A </call>
5822N/A
5822N/A <if expr="assuredReplication == 'safe-data'">
5822N/A <sequence>
5822N/A <script>
5822N/A assuredDataLevel = len(_topologyServerList)
5822N/A options = '--domain-name "%s" --set assured-sd-level:%s' \
5822N/A % (domain, assuredDataLevel)
5822N/A </script>
5822N/A <message>
5822N/A 'Setting safe-data level to: %s for server: %s \
5822N/A domain: %s' % (assuredDataLevel, ldapServer, domain)
5822N/A </message>
5822N/A <!-- Set assured -->
5822N/A <call function="'dsconfig'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'subcommand' : 'set-replication-domain-prop',
5822N/A 'objectType' : 'provider-name',
5822N/A 'objectName' : 'Multimaster Synchronization',
5822N/A 'optionsString' : options
5822N/A }
5822N/A </call>
5822N/A </sequence>
5822N/A </if>
4319N/A </sequence>
5822N/A </paralleliterate>
5822N/A </if>
5822N/A
5822N/A <if expr="dataFile">
3810N/A <sequence>
5822N/A <message>
5822N/A 'Initialise topology from %s:%s' \
5822N/A % (masterHost, master.getPort())
5822N/A </message>
5822N/A
5822N/A <!-- Initialise the servers in the topology -->
5822N/A <call function="'initializeReplication'">
3853N/A { 'location' : clientHost,
3853N/A 'dsPath' : clientPath,
3853N/A 'sourceInstanceHost' : masterHost,
3853N/A 'sourceInstanceAdminPort' : master.getAdminPort(),
3853N/A 'replicationDnList' : [synchroSuffix]
3810N/A }
5822N/A </call>
5822N/A <if expr="0">
5822N/A <iterate var="server" in="consumerList">
5822N/A <sequence>
5822N/A <!-- <call function="'initializeReplication'">
5822N/A { 'location' : clientHost,
5822N/A 'dsPath' : clientPath,
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'sourceInstanceHost' : masterHost,
5822N/A 'sourceInstanceAdminPort' : master.getAdminPort(),
5822N/A 'replicationDnList' : [synchroSuffix]
5822N/A }
5822N/A </call> -->
5822N/A
5822N/A <!-- Search initialisation task to check its status -->
5822N/A <call function="'ldapSearchWithScript'">
5822N/A {
5822N/A 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(), OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstancePort' : server.getPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'dsBaseDN' : 'cn=Tasks',
5822N/A 'dsFilter' : 'ds-task-initialize-domain-dn=%s' \
5822N/A % synchroSuffix
5822N/A }
5822N/A </call>
5822N/A <script>
5822N/A searchRC = STAXResult[0][0]
5822N/A searchResult = STAXResult[0][1]
5822N/A resultLength = len(searchResult) > 0
5822N/A </script>
5822N/A <if expr="resultLength != 0">
5822N/A <sequence>
5822N/A <message>
5822N/A '++++++++ INITIALISATION TASK for %s:%s ++++++++\n%s' \
5822N/A % (server.getHostname(), server.getPort(), searchResult)
5822N/A </message>
5822N/A </sequence>
5822N/A </if>
5822N/A </sequence>
5822N/A </iterate>
5822N/A </if>
5822N/A
5822N/A </sequence>
5822N/A </if>
5822N/A
5822N/A <if expr="enableDebugLogs">
5822N/A <paralleliterate var="server" in="_topologyServerList">
5822N/A <sequence>
5822N/A <!-- Set the debug logger to "enabled" -->
5822N/A <call function="'dsconfigSet'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'objectName' : 'log-publisher',
5822N/A 'propertyType' : 'publisher',
5822N/A 'propertyName' : 'File-based Debug Logger',
5822N/A 'attributeName' : 'enabled',
5822N/A 'attributeValue' : 'true'
5822N/A }
5822N/A </call>
5822N/A <!-- Set the debug level to "info" -->
5822N/A <call function="'dsconfigSet'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'objectName' : 'log-publisher',
5822N/A 'propertyType' : 'publisher',
5822N/A 'propertyName' : 'File-based Debug Logger',
5822N/A 'attributeName' : 'default-debug-level',
5822N/A 'attributeValue' : 'info'
5822N/A }
5822N/A </call>
5822N/A <!-- Set the debug logger log file to "logs/errors" -->
5822N/A <call function="'dsconfigSet'">
5822N/A { 'location' : server.getHostname(),
5822N/A 'dsPath' : '%s/%s' \
5822N/A % (server.getDir(),OPENDSNAME),
5822N/A 'dsInstanceHost' : server.getHostname(),
5822N/A 'dsInstanceAdminPort' : server.getAdminPort(),
5822N/A 'dsInstanceDn' : server.getRootDn(),
5822N/A 'dsInstancePswd' : server.getRootPwd(),
5822N/A 'objectName' : 'log-publisher',
5822N/A 'propertyType' : 'publisher',
5822N/A 'propertyName' : 'File-based Debug Logger',
5822N/A 'attributeName' : 'log-file',
5822N/A 'attributeValue' : 'logs/errors'
5822N/A }
5822N/A </call>
5822N/A </sequence>
5822N/A </paralleliterate>
5822N/A </if>
3810N/A
5822N/A <tcstatus result="'pass'"></tcstatus>
5822N/A
5822N/A </sequence>
5822N/A
5822N/A <catch exception="'STAXException'" typevar="eType" var="eInfo">
3810N/A <sequence>
5822N/A <message log="1" level="'fatal'">
5822N/A '%s: Failed to cleanup. eInfo(%s)' % (eType,eInfo)
5822N/A </message>
5822N/A <throw exception="'STAFException.TestSuite.CleanupException'" />
3810N/A </sequence>
5822N/A </catch>
5822N/A <finally>
5822N/A <!-- Test Case postamble -->
5822N/A <call function="'testCase_Postamble'"/>
5822N/A </finally>
5822N/A
5822N/A </try>
3810N/A
5822N/A </testcase>
1476N/A
1476N/A </block>
1476N/A
1476N/A </sequence>
1476N/A
1476N/A </function>
1476N/A
1476N/A</stax>