mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

ugaston
24.24.2008 4e3a54d26414fec6c1bcbd6b17968ec5b7c48c79
New testcases for indexes testsuite (for Issue #1480)
6 files modified
479 ■■■■■ changed files
opendj-sdk/opends/tests/functional-tests/testcases/indexes/after-add.filters 2 ●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/functional-tests/testcases/indexes/after-remove.filters 2 ●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/functional-tests/testcases/indexes/before-add.filters 2 ●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/functional-tests/testcases/indexes/before-remove.filters 2 ●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/functional-tests/testcases/indexes/indexes.xml 274 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/shared/functions/dsadm.xml 197 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/tests/functional-tests/testcases/indexes/after-add.filters
@@ -26,7 +26,7 @@
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 INDEXED
l presence l=* 0 INDEXED
l presence (l=*) 0 INDEXED
l equality l=Cupertino 0 INDEXED
l equality (l=Cupertino) 0 INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
opendj-sdk/opends/tests/functional-tests/testcases/indexes/after-remove.filters
@@ -26,7 +26,7 @@
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 NOT-INDEXED
l presence l=* 0 NOT-INDEXED
l presence (l=*) 0 NOT-INDEXED
l equality l=Cupertino 0 NOT-INDEXED
l equality (l=Cupertino) 0 NOT-INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
opendj-sdk/opends/tests/functional-tests/testcases/indexes/before-add.filters
@@ -26,7 +26,7 @@
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 NOT-INDEXED
l presence l=* 0 NOT-INDEXED
l presence (l=*) 0 NOT-INDEXED
l equality l=Cupertino 0 NOT-INDEXED
l equality (l=Cupertino) 0 NOT-INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
opendj-sdk/opends/tests/functional-tests/testcases/indexes/before-remove.filters
@@ -26,7 +26,7 @@
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 INDEXED
l presence l=* 0 INDEXED
l presence (l=*) 0 INDEXED
l equality l=Cupertino 0 INDEXED
l equality (l=Cupertino) 0 INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
opendj-sdk/opends/tests/functional-tests/testcases/indexes/indexes.xml
@@ -33,9 +33,12 @@
        <script>
          CurrentTestPath={'group':'indexes','suite':'indexes'}
          envAlreadyLoaded='true'
          _setupSteps=['testGroup_Preamble','testSuite_Preamble','indexes_setup']
          _testSteps=['indexes_search','indexes_add','indexes_remove']
          _cleanupSteps=['indexes_cleanup','testSuite_Postamble','testGroup_Postamble']
          _setupSteps=['testGroup_Preamble','testSuite_Preamble',
                       'indexes_setup']
          _testSteps=['indexes_search', 'indexes_dynamic_modify',
                      'indexes_dynamic_add', 'indexes_remove', 'indexes_add']
          _cleanupSteps=['indexes_cleanup','testSuite_Postamble',
                         'testGroup_Postamble']
        </script>
        <!---
          #@TestSuiteName      Indexes
@@ -55,10 +58,14 @@
            </iterate>
          </sequence>
          <catch exception="'STAXException.Topology.CreationException'">
            <message log="1" level="'fatal'">'Could not create the topology. Bailing out.'</message>
            <message log="1" level="'fatal'">
              'Could not create the topology. Bailing out.'
            </message>
          </catch>
          <catch exception="'STAXException.Topology.StartException'">
            <message log="1" level="'fatal'">'Could not start at least one server in the topology. Bailing out.'</message>
            <message log="1" level="'fatal'">
              'Could not start at least one server in the topology.Bailing out.'
            </message>
          </catch>
          <finally>
            <iterate in="_cleanupSteps" var="_cleanupStep">
@@ -119,7 +126,9 @@
            <call function="'runFunction'">
              { 'functionName'      : 'modifyIndex',
                'functionException' : 'LDAP.ModifyException',
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock ) ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock ) ,
                'functionMessage'   : 'Adding substring index to attribute uid' ,
                'functionArguments' : { 'operation'          : 'add'            ,
                                        'indexAttribute'     : 'uid'            ,
@@ -144,7 +153,8 @@
                'functionException' : 'CLI.RebuildIndex'  ,
                'functionFailureTC' : 'Indexes - Modify'  ,
                'functionArguments' : { 'baseDN'     : DIRECTORY_INSTANCE_SFX ,
                                        'attributes' : [ 'uid' ]              }
                                        'attributes' : [ 'uid' ]
                                      }
              }
            </call>
            <call function="'runFunction'">
@@ -159,19 +169,96 @@
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.ModifyException'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to alter index for attribute uid'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to alter index for attribute uid'
            </message>
          </catch>
          <catch exception="'STAXException.CLI.RebuildIndex'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to rebuild index for attribute uid'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to rebuild index for attribute uid'
            </message>
          </catch>
        </try>
      </sequence>
    </block>
  </function>
  <function name="indexes_dynamic_modify" scope="local">
    <!--
      This test alters dynamically the uid default index so that it does
      subString search and then verifies that it worked
      #@TestMarker                indexes
      #@TestName                  indexes_dynamic_modify
      #@TestIssue                 1480
      #@TestPurpose               harden the default indexes
      #@TestPreamble              none
      #@TestStep                  iterate through file search.filters
      #@TestPostamble             none
      #@TestResult                Success if entry are indexed correctly
    -->
    <block name="'Modify'">
      <sequence>
        <try>
          <sequence>
            <call function="'loopThroughFilters'">
              { 'filters' : 'before-modify' }
            </call>
            <call function="'runFunction'">
              { 'functionName'      : 'modifyIndex',
                'functionException' : 'LDAP.ModifyException',
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock ) ,
                'functionMessage'   : 'Adding substring index to attribute uid',
                'functionArguments' : { 'operation'          : 'add',
                                        'indexAttribute'     : 'uid',
                                        'indexProperty'      : 'index-type',
                                        'indexPropertyValue' : 'substring'
                                      }
              }
            </call>
            <call function="'runFunction'">
              { 'functionName'      : 'rebuildIndexTask' ,
                'functionException' : 'CLI.RebuildIndex'  ,
                'functionFailureTC' : 'Indexes - Dynamic Modify'  ,
                'functionArguments' :
                  { 'location'       : STAF_REMOTE_HOSTNAME,
                    'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
                    'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
                    'dsInstanceDn'   : DIRECTORY_INSTANCE_DN,
                    'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
                    'taskID'         : 'rebuild uid index task',
                    'baseDN'         : DIRECTORY_INSTANCE_SFX ,
                    'attributes'     : [ 'uid' ]
                  }
              }
            </call>
            <call function="'loopThroughFilters'">
              { 'filters' : 'after-modify' }
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.ModifyException'">
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to alter index for attribute uid'
            </message>
          </catch>
          <catch exception="'STAXException.CLI.RebuildIndex'">
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to rebuild index for attribute uid'
            </message>
          </catch>
        </try>
      </sequence>
    </block>
  </function>
  <function name="indexes_add" scope="local">
    <!--
      This test does a bunch of searches on the
      This test adds a new presence and equality index for l attribute
      and then verifies that it worked
      #@TestMarker                indexes
      #@TestName                  indexes_add
@@ -195,9 +282,11 @@
              { 'functionName'      : 'addIndex'                             ,
                'functionException' : 'LDAP.AddIndexException'               ,
                'functionFailureTC' : 'Indexes - Add'                        ,
                'functionMessage'   : 'Adding presence and equality index to attribute st',
                'functionMessage'   : 'Adding presence and equality index to \
                                       attribute l',
                'functionArguments' : { 'indexAttribute'    : 'l'         ,
                                        'indexTypes'        : [ 'presence', 'equality' ]
                                        'indexTypes'        : [ 'presence',
                                                                'equality' ]
                                      }
              }
            </call>
@@ -205,7 +294,9 @@
            <call function="'runFunction'">
              { 'functionName'      : 'StopDsWithScript' ,
                'functionException' : 'CLI.stop-ds'      ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock ) ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock ) ,
                'functionArguments' : { 'location'  : STAF_REMOTE_HOSTNAME    ,
                                        'dsHost'    : DIRECTORY_INSTANCE_HOST,
                                        'dsPort'    : DIRECTORY_INSTANCE_PORT,
@@ -235,10 +326,86 @@
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.AddIndexException'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to add index for attribute l'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to add index for attribute l'
            </message>
          </catch>
          <catch exception="'STAXException.CLI.RebuildIndex'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to rebuild index for attribute l'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to rebuild index for attribute l'
            </message>
          </catch>
        </try>
      </sequence>
    </block>
  </function>
  <function name="indexes_dynamic_add" scope="local">
    <!--
      This test adds dynamically a new presence and equality index for l
      attribute and then verifies that it worked
      #@TestMarker              indexes
      #@TestName                indexes_dynamic_add
      #@TestIssue               1480
      #@TestPurpose             check if the user can add her own indexes
                                dynamically
      #@TestPreamble            none
      #@TestStep                iterate through filters prior to adding indexes
      #@TestStep                add the indexes
      #@TestStep                iterate through filters after to adding indexes
      #@TestPostamble           none
      #@TestResult              Success if entry are indexed correctly
    -->
    <block name="'Add'">
      <sequence>
        <try>
          <sequence>
            <call function="'loopThroughFilters'">
              { 'filters' : 'before-add' }
            </call>
            <call function="'runFunction'">
              { 'functionName'      : 'addIndex',
                'functionException' : 'LDAP.AddIndexException',
                'functionFailureTC' : 'Indexes - Add',
                'functionMessage'   : 'Adding presence and equality index to \
                                       attribute l',
                'functionArguments' : { 'indexAttribute'    : 'l',
                                        'indexTypes'        : [ 'presence',
                                                                'equality' ]
                                      }
              }
            </call>
            <call function="'runFunction'">
              { 'functionName'      : 'rebuildIndexTask' ,
                'functionException' : 'CLI.RebuildIndex'  ,
                'functionFailureTC' : 'Indexes - Dynamic Add'  ,
                'functionArguments' :
                  { 'location'       : STAF_REMOTE_HOSTNAME,
                    'dsInstanceHost' : DIRECTORY_INSTANCE_HOST,
                    'dsInstancePort' : DIRECTORY_INSTANCE_PORT,
                    'dsInstanceDn'   : DIRECTORY_INSTANCE_DN,
                    'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD,
                    'taskID'         : 'rebuild l index task',
                    'baseDN'         : DIRECTORY_INSTANCE_SFX ,
                    'attributes'     : [ 'l' ]
                  }
              }
            </call>
            <call function="'loopThroughFilters'">
              { 'filters' : 'after-add' }
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.AddIndexException'">
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to add index for attribute l'
            </message>
          </catch>
          <catch exception="'STAXException.CLI.RebuildIndex'">
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to rebuild index for attribute l'
            </message>
          </catch>
        </try>
      </sequence>
@@ -271,7 +438,9 @@
            <call function="'runFunction'">
              { 'functionName'      : 'removeIndex'                           ,
                'functionException' : 'LDAP.RemoveIndexException'             ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock),
                'functionMessage'   : 'Removing index on attribute l' ,
                'functionArguments' : { 'indexAttribute'    : 'l' }
              }
@@ -281,7 +450,9 @@
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.RemoveIndexException'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to remove index for attribute l'
            </message>
          </catch>
        </try>
      </sequence>
@@ -313,8 +484,11 @@
            <call function="'runFunction'">
              { 'functionName'      : 'modifyIndex'                                ,
                'functionException' : 'LDAP.ModifyIndexException'                  ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
                'functionMessage'   : 'Modify index entry limit on attribute uid'  ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock),
                'functionMessage'   : 'Modify index entry limit on attribute \
                                       uid'  ,
                'functionArguments' : { 'operation'          : 'set'               ,
                                        'indexAttribute'     : 'uid'               ,
                                        'indexProperty'      : 'index-entry-limit' ,
@@ -327,7 +501,9 @@
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.RemoveIndexException'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to remove index for attribute l'
            </message>
          </catch>
        </try>
      </sequence>
@@ -339,7 +515,7 @@
      This test does a bunch of searches on the 
      and then verifies that it worked
      #@TestMarker                indexes
      #@TestName                  indexes_remove
      #@TestName                indexes_vlv_add
      #@TestIssue                 TODO: look up the issue in issue tracker
      #@TestPurpose               Check if the user can remove indexes
      #@TestPreamble              none
@@ -359,8 +535,11 @@
            <call function="'runFunction'">
              { 'functionName'      : 'modifyIndex'                                ,
                'functionException' : 'LDAP.ModifyIndexException'                  ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
                'functionMessage'   : 'Modify index entry limit on attribute uid'  ,
                'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'],
                                                      CurrentTestPath['suite'],
                                                      STAXCurrentBlock),
                'functionMessage'   : 'Modify index entry limit on attribute \
                                       uid'  ,
                'functionArguments' : { 'operation'          : 'set'               ,
                                        'indexAttribute'     : 'uid'               ,
                                        'indexProperty'      : 'index-entry-limit' ,
@@ -373,7 +552,9 @@
            </call>
          </sequence>
          <catch exception="'STAXException.LDAP.RemoveIndexException'">
            <message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
            <message log="1" level="'fatal'">
              'Fatal Error: Failed to remove index for attribute l'
            </message>
          </catch>
        </try>
      </sequence>
@@ -388,7 +569,8 @@
    <sequence>
      <script>
        class indexTest:
          "Describes an index test with indexed attribute, filter to test with and expected behaviour"
          "Describes an index test with indexed attribute, filter to test with \
           and expected behaviour"
          def __init__(self, attribute, testName, filter, expectedValue, isIndexed):
            self.attribute = attribute
            self.name = testName
@@ -437,7 +619,8 @@
            continue
          else: 
            testLine = line.split(' ')
            indexTests.append(indexTest(testLine[0], testLine[1], testLine[2], testLine[3], testLine[4]))
            indexTests.append(indexTest(testLine[0], testLine[1], testLine[2],
                              testLine[3], testLine[4]))
          
        indexTestNumber=0
        previousTestName=''
@@ -452,33 +635,47 @@
            testNumber=0
            
          </script>
          <testcase name="'%s: %d.%s: %03d-%03d.%s: %s%02d' % ( CurrentTestPath['group'], len(_testSteps)-_testStepNumber, filters, len(indexTests)-indexTestNumber, indexTestNumber, test.getAttribute(), test.getName(), testNumber)" >
          <testcase name="'%s: %d.%s: %03d-%03d.%s: %s%02d'
            % ( CurrentTestPath['group'], len(_testSteps)-_testStepNumber,
                filters, len(indexTests)-indexTestNumber, indexTestNumber,
                test.getAttribute(), test.getName(), testNumber)" >
            <sequence>
              <call function="'testCase_Preamble'" />
              <message log="1" level="'trace'">
                'Searching attribute [%s] with filter[%s]' % (test.getAttribute(),test.getFilter())
                'Searching attribute [%s] with filter[%s]' \
                 % (test.getAttribute(),test.getFilter())
              </message>
              <call function="'SearchObject'">
                { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST                            ,
                  'dsInstancePort'   : DIRECTORY_INSTANCE_PORT                            ,
                  'dsInstanceDn'     : DIRECTORY_INSTANCE_DN                              ,
                  'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD                            ,
                  'dsBaseDN'         : 'ou=People,dc=example,%s' % DIRECTORY_INSTANCE_SFX ,
                  'dsBaseDN'         : 'ou=People,dc=example,%s' \
                                        % DIRECTORY_INSTANCE_SFX ,
                  'dsFilter'         : '%s' % test.getFilter()                            ,
                  'attributes'       : 'debugsearchindex'                                 ,
                  'expectedRC'       : 'noCheck'                                          }
                  'expectedRC'       : 'noCheck'
                }
              </call>
              <script>
                searchReturnCode, searchResultString = STAXResult[0]
                # chop off the first line that contains the dn
                searchResultString = re.compile(r'^dn:.*\n?').sub('',searchResultString)
                searchResultString = re.compile(r'^dn:.*\n?').sub('',
                                                             searchResultString)
                # join multiple lines into a single one
                searchResultString = re.compile(r'[ \t]*\r?\n[ \t]*').sub('',searchResultString)
                searchResultString = re.compile(r'[ \t]*\r?\n[ \t]*').sub('',
                                                             searchResultString)
                srt=searchResultString.split('[')[1]
                if (str(searchReturnCode) == str(test.getRC())) and srt.startswith(test.getSearchString()):
                if (str(searchReturnCode) == str(test.getRC())) and \
                    srt.startswith(test.getSearchString()):
                  test.pass()
              </script>
              <message level="'trace'">'%s\nsearchReturnCode=[%s]\nldapsearch return string=[%s]\nchunk to parse=[%s]\nstring looked for=[%s]' % (test.desc(), searchReturnCode, searchResultString, srt, test.getSearchString())</message>
              <message level="'trace'">
                '%s\nsearchReturnCode=[%s]\nldapsearch return \
                 string=[%s]\nchunk to parse=[%s]\nstring looked for=[%s]' \
                 % (test.desc(), searchReturnCode, searchResultString, srt,
                    test.getSearchString())
              </message>
              <tcstatus result="test.getStatus()" />
              <call function="'testCase_Postamble'" />
              <script>
@@ -503,7 +700,8 @@
      </call>
      <call function="'runFunction'">
        { 'functionName'      : 'StartDsWithScript'                                      ,
          'functionMessage'   : 'Start DS to run on port %s' % (DIRECTORY_INSTANCE_PORT) ,
          'functionMessage'   : 'Start DS to run on port %s' \
                                 % (DIRECTORY_INSTANCE_PORT) ,
          'functionArguments' : { 'location' : STAF_REMOTE_HOSTNAME }
        }
      </call>
@@ -512,7 +710,8 @@
          'functionMessage'   : 'Checking if the server is available' ,
          'functionException' : 'Topology.StartException'             ,
          'functionArguments' : { 'noOfLoops'        : 5    ,
                                  'noOfMilliSeconds' : 2000 }
                                  'noOfMilliSeconds' : 2000
                                }
        }
      </call>
    </sequence>
@@ -523,7 +722,8 @@
    <sequence>
      <call function="'runFunction'">
        { 'functionName'      : 'StopDsWithScript' ,
          'functionMessage'   : 'Stop DS running on port %s' % (DIRECTORY_INSTANCE_PORT),
          'functionMessage'   : 'Stop DS running on port %s' \
                                 % (DIRECTORY_INSTANCE_PORT),
          'functionArguments' : { 'location'  : STAF_REMOTE_HOSTNAME    ,
                                  'dsHost'    : DIRECTORY_INSTANCE_HOST ,
                                  'dsPort'    : DIRECTORY_INSTANCE_PORT ,
opendj-sdk/opends/tests/shared/functions/dsadm.xml
@@ -3563,4 +3563,201 @@
    </sequence>
  </function>
                                                   
  <!-- Rebuild index Task Function -->
  <function name="rebuildIndexTask">
    <function-prolog>
        This function performs an on line rebuild index task
    </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="pathname"/>
      </function-arg-def>
      <function-arg-def name="dsInstanceHost" type="optional">
        <function-arg-description>
          Directory server host name
        </function-arg-description>
        <function-arg-property name="type" value="integer"/>
      </function-arg-def>
      <function-arg-def name="dsInstancePort" type="optional">
        <function-arg-description>
          Directory server port number
        </function-arg-description>
        <function-arg-property name="type" value="integer"/>
      </function-arg-def>
      <function-arg-def name="dsInstanceDn" type="optional">
        <function-arg-description>
          Bind DN
        </function-arg-description>
        <function-arg-property name="type" value="dn"/>
      </function-arg-def>
      <function-arg-def name="dsInstancePswd" type="optional">
        <function-arg-description>
          Bind password
        </function-arg-description>
      </function-arg-def>
      <function-arg-def name="taskID" type="optional">
        <function-arg-description>
          The identifier for the task
        </function-arg-description>
        <function-arg-property name="type" value="string"/>
      </function-arg-def>
      <function-arg-def name="baseDN" type="required">
        <function-arg-description>
          The base Dn for which the index will be rebuilt
        </function-arg-description>
        <function-arg-property name="type" value="dn"/>
      </function-arg-def>
      <function-arg-def name="attributes" type="required">
        <function-arg-description>
          List of the attributes to re-index: e.g. ['cn','l']
        </function-arg-description>
        <function-arg-property name="type" value="list"/>
      </function-arg-def>
      <function-arg-def name="maxThreads"
                        type="optional"
                        default="5">
        <function-arg-description>
          Number of threads that should be used for the rebuild operation
        </function-arg-description>
        <function-arg-property name="type" value="integer"/>
      </function-arg-def>
    </function-map-args>
    <sequence>
       <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='rebuildIndex-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
        taskDN='ds-task-id=%s,cn=Scheduled Tasks,cn=Tasks' % taskID
      </script>
      <!-- Build the restore task configuration object -->
      <script>
        ldifLines=[]
        ldifLines.append('dn: %s' % taskDN)
        ldifLines.append('objectclass: top')
        ldifLines.append('objectclass: ds-task')
        ldifLines.append('objectclass: ds-task-rebuild')
        ldifLines.append('ds-task-class-name: org.opends.server.tasks.RebuildTask')
        ldifLines.append('ds-task-id: %s' % taskID)
        ldifLines.append('ds-task-rebuild-base-dn: %s' % baseDN )
        ldifLines.append('ds-task-rebuild-max-threads: %s' % maxThreads )
        for indexType in attributes:
          ldifLines.append('ds-task-rebuild-index: %s' % indexType )
      </script>
      <!-- Write out the restore-task ldif -->
      <script>
        outfile = open(tmpTaskLdif,"w")
        for line in ldifLines:
          outfile.write("%s\n" % line)
        outfile.close()
      </script>
      <!-- Copy the rebuildIndex-task ldif to remote host -->
      <message>'Copy rebuildIndex task ldif file.'</message>
      <call function="'copyFile'">
        { 'location'   : STAXServiceMachine,
          'srcfile'    : tmpTaskLdif,
          'destfile'   : taskLdif,
          'remotehost' : myLocation }
      </call>
      <script>
        STAXCode, STAXReason=STAXResult
      </script>
      <if expr="STAXCode != 0">
        <sequence>
          <message level="'error'">
            'Copy of totalupdate task failed (STAXCode=%s)' % STAXCode
          </message>
          <return>[STAXCode, STAXReason]</return>
        </sequence>
      </if>
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'     : myPath,
          'taskLabel'  : 'Online Rebuild Index Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
          'dsBindDn'   : dsInstanceDn,
          'dsBindPswd' : dsInstancePswd,
          'dsTaskLdif' : taskLdif }
      </call>
      <script>
        STAXCode, STAXReason=STAXResult
      </script>
      <if expr="STAXCode != 0">
        <sequence>
          <message>
            'Start of rebuild index task failed (Code=%s)' % STAXCode
          </message>
          <return>[STAXCode, STAXReason]</return>
        </sequence>
      </if>
      <!-- Check that the ldap task is completed -->
      <sequence>
        <call function="'CheckLdapTask'">
          { 'location'   : myLocation,
            'dsPath'     :  myPath,
            'dsTaskDn'   : taskDN,
            'dsHost'     : dsInstanceHost,
            'dsPort'     : dsInstancePort,
            'dsBindDn'   : dsInstanceDn,
            'dsBindPswd' : dsInstancePswd
          }
        </call>
      </sequence>
      <script>
        STAXCode, STAXReason=STAXResult
      </script>
      <if expr="STAXCode != 0">
        <sequence>
          <message>
            'Check of rebuild index task failed (Code=%s)' % STAXCode
          </message>
          <return>[STAXCode, STAXReason]</return>
        </sequence>
      </if>
      <script>
        STAXCode=0
        STAXReason='%s: Success' % STAXCurrentFunction
      </script>
      <return>[STAXCode, STAXReason]</return>
    </sequence>
  </function>
</stax>