Пример #1
0
  def getRequest( self, requestType ):
    """ Get a request of a given type eligible for execution
    """
    # RG: What if requestType is not given?
    # the first query will return nothing.
    # KC: maybe returning S_ERROR would be enough?
    # alternatively we should check if requestType is known (in 'transfer', 'removal', 'register' and 'diset') 

    if not requestType or type( requestType ) not in types.StringTypes:
      return S_ERROR( "Request type not given." )

    myRequestType = self._escapeString( requestType )
    if not myRequestType:
      return myRequestType

    myRequestType = myRequestType['Value']

    start = time.time()
    dmRequest = RequestContainer( init = False )
    requestID = 0
    subIDList = []

    fields = ['RequestID', 'SubRequestID', 'Operation', 'Arguments',
              'ExecutionOrder', 'SourceSE', 'TargetSE', 'Catalogue',
              'CreationTime', 'SubmissionTime', 'LastUpdate', 'Status', 'RequestType']
    # get the pending SubRequest sorted by ExecutionOrder and LastUpdate
    req = "SELECT `RequestID`,`ExecutionOrder`,`Status`,`RequestType`,`LastUpdate` FROM `SubRequests` "\
        "WHERE `Status` IN ( 'Waiting', 'Assigned' ) ORDER BY `ExecutionOrder`,`LastUpdate`"
    # now get sorted list of RequestID (according to the above)
    req = "SELECT * FROM ( %s ) as T1 GROUP BY `RequestID`" % req
    # and get the 100 oldest ones of Type requestType
    req = "SELECT `RequestID`,`ExecutionOrder` FROM ( %s ) as T2 WHERE `RequestType`=%s "\
        "ORDER BY `LastUpdate` LIMIT 100" % ( req, myRequestType )
    # and now get all waiting SubRequest for the selected RequestID and ExecutionOrder 
    req = "SELECT A.%s FROM SubRequests AS A, ( %s ) AS B WHERE " % ( ', A.'.join( fields ), req )
    req = "%s A.RequestID=B.RequestID AND A.ExecutionOrder=B.ExecutionOrder" % ( req )

    result = self._query( req )
    if not result['OK']:
      err = 'RequestDB._getRequest: Failed to retrieve Requests'
      return S_ERROR( '%s\n%s' % ( err, result['Message'] ) )
    if not result['Value']:
      return S_OK()

    # We get up to 10 Request candidates, to add some randomness 
    reqDict = {}
    for row in result['Value']:
      if ('"%s"' % row[-1]) != myRequestType:
        continue
      if row[-2] != 'Waiting':
        continue
      reqDict.setdefault( row[0], [] )
      reqDict[row[0]].append( row[1:-2] )

    reqIDList = reqDict.keys()
    random.shuffle( reqIDList )

    for reqID in reqIDList:
      sidList = [ x[0] for x in reqDict[reqID] ]
      for subID in sidList:
        req = "UPDATE SubRequests SET Status='Assigned' WHERE RequestID=%s AND SubRequestID=%s;" % ( reqID, subID )
        resAssigned = self._update( req )
        if not resAssigned['OK']:
          if subIDList:
            self.__releaseSubRequests( reqID, subIDList )
          return S_ERROR( 'Failed to assign subrequests: %s' % resAssigned['Message'] )
        if resAssigned['Value'] == 0:
          # Somebody has assigned this request
          gLogger.warn( 'Already assigned subrequest %d of request %d' % ( subID, reqID ) )
        else:
          subIDList.append( subID )
      if subIDList:
        # We managed to get some requests, can continue now
        requestID = reqID

        break
    # Haven't succeeded to get any request        
    if not requestID:
      return S_OK()

    dmRequest.setRequestID( requestID )

    fields = ['FileID', 'LFN', 'Size', 'PFN', 'GUID', 'Md5', 'Addler', 'Attempt', 'Status' ]
    for subRequestID, operation, arguments, executionOrder, sourceSE, targetSE, catalogue, \
          creationTime, submissionTime, lastUpdate in reqDict[requestID]:
      if not subRequestID in subIDList: continue
      res = dmRequest.initiateSubRequest( requestType )
      ind = res['Value']
      subRequestDict = {
                        'Status'        : 'Waiting',
                        'SubRequestID'  : subRequestID,
                        'Operation'     : operation,
                        'Arguments'     : arguments,
                        'ExecutionOrder': int( executionOrder ),
                        'SourceSE'      : sourceSE,
                        'TargetSE'      : targetSE,
                        'Catalogue'     : catalogue,
                        'CreationTime'  : creationTime,
                        'SubmissionTime': submissionTime,
                        'LastUpdate'    : lastUpdate
                       }
      res = dmRequest.setSubRequestAttributes( ind, requestType, subRequestDict )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set subRequest attributes for RequestID %s' % requestID
        self.__releaseSubRequests( requestID, subIDList )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

      req = "SELECT %s FROM `Files` WHERE `SubRequestID`=%s ORDER BY `FileID`;" % ( ', '.join( fields ), 
                                                                                    subRequestID )
      res = self._query( req )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to get File attributes for RequestID %s.%s' % ( requestID, 
                                                                                             subRequestID )
        self.__releaseSubRequests( requestID, subIDList )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
      files = []
      for fileID, lfn, size, pfn, guid, md5, addler, attempt, status in res['Value']:
        fileDict = {'FileID':fileID, 'LFN':lfn, 'Size':size, 'PFN':pfn, 'GUID':guid, 
                    'Md5':md5, 'Addler':addler, 'Attempt':attempt, 'Status':status}
        files.append( fileDict )
      res = dmRequest.setSubRequestFiles( ind, requestType, files )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set files into Request for RequestID %s.%s' % ( requestID, 
                                                                                                subRequestID )
        self.__releaseSubRequests( requestID, subIDList )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

      req = "SELECT Dataset,Status FROM Datasets WHERE SubRequestID = %s;" % subRequestID
      res = self._query( req )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to get Datasets for RequestID %s.%s' % ( requestID, subRequestID )
        self.__releaseSubRequests( requestID, subIDList )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
      datasets = []
      for dataset, status in res['Value']:
        datasets.append( dataset )
      res = dmRequest.setSubRequestDatasets( ind, requestType, datasets )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set datasets into Request for RequestID %s.%s' % ( requestID, 
                                                                                                   subRequestID )
        self.__releaseSubRequests( requestID, subIDList )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

    fields = ['RequestName', 'JobID', 'OwnerDN', 'OwnerGroup',
              'DIRACSetup', 'SourceComponent', 'CreationTime',
              'SubmissionTime', 'LastUpdate']

    req = "SELECT %s FROM `Requests` WHERE `RequestID`=%s;" % ( ', '.join( fields ), requestID )
    res = self._query( req )
    if not res['OK']:
      err = 'RequestDB._getRequest: Failed to retrieve max RequestID'
      self.__releaseSubRequests( requestID, subIDList )
      return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
    requestName, jobID, ownerDN, ownerGroup, diracSetup, sourceComponent, \
        creationTime, submissionTime, lastUpdate = res['Value'][0]
    dmRequest.setRequestName( requestName )
    dmRequest.setJobID( jobID )
    dmRequest.setOwnerDN( ownerDN )
    dmRequest.setOwnerGroup( ownerGroup )
    dmRequest.setDIRACSetup( diracSetup )
    dmRequest.setSourceComponent( sourceComponent )
    dmRequest.setCreationTime( str( creationTime ) )
    dmRequest.setLastUpdate( str( lastUpdate ) )
    res = dmRequest.toXML()
    if not res['OK']:
      err = 'RequestDB._getRequest: Failed to create XML for RequestID %s' % ( requestID )
      self.__releaseSubRequests( requestID, subIDList )
      return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
    requestString = res['Value']
    #still have to manage the status of the dataset properly
    resultDict = {}
    resultDict['RequestName'] = requestName
    resultDict['RequestString'] = requestString
    resultDict['JobID'] = jobID
    return S_OK( resultDict )
Пример #2
0
    def getRequest(self, requestType):
        """ Get a request of a given type eligible for execution
    """
        # RG: What if requestType is not given?
        # the first query will return nothing.
        # KC: maybe returning S_ERROR would be enough?
        # alternatively we should check if requestType is known (in 'transfer', 'removal', 'register' and 'diset')

        if not requestType or type(requestType) not in types.StringTypes:
            return S_ERROR("Request type not given.")

        myRequestType = self._escapeString(requestType)
        if not myRequestType:
            return myRequestType

        myRequestType = myRequestType['Value']

        start = time.time()
        dmRequest = RequestContainer(init=False)
        requestID = 0
        subIDList = []

        fields = [
            'RequestID', 'SubRequestID', 'Operation', 'Arguments',
            'ExecutionOrder', 'SourceSE', 'TargetSE', 'Catalogue',
            'CreationTime', 'SubmissionTime', 'LastUpdate'
        ]
        # get the pending SubRequest sorted by ExecutionOrder and LastUpdate
        req = "SELECT RequestID, ExecutionOrder, Status, RequestType, LastUpdate from SubRequests WHERE Status IN ( 'Waiting', 'Assigned' ) ORDER BY ExecutionOrder, LastUpdate"
        # now get sorted list of RequestID (according to the above)
        req = "SELECT * from ( %s ) as T1 GROUP BY RequestID" % req
        # and get the 100 oldest ones of Type requestType
        req = "SELECT RequestID, ExecutionOrder FROM ( %s ) as T2 WHERE RequestType = %s ORDER BY LastUpdate limit 100" % (
            req, myRequestType)
        # and now get all waiting SubRequest for the selected RequestID and ExecutionOrder
        req = "SELECT A.%s FROM SubRequests AS A, ( %s ) AS B WHERE " % (
            ', A.'.join(fields), req)
        req = "%s A.RequestID = B.RequestID AND A.ExecutionOrder = B.ExecutionOrder AND A.Status = 'Waiting' AND A.RequestType = %s;" % (
            req, myRequestType)

        result = self._query(req)
        if not result['OK']:
            err = 'RequestDB._getRequest: Failed to retrieve Requests'
            return S_ERROR('%s\n%s' % (err, result['Message']))
        if not result['Value']:
            return S_OK()

        # We get up to 10 Request candidates, to add some randomness
        reqDict = {}
        for row in result['Value']:
            reqDict.setdefault(row[0], [])
            reqDict[row[0]].append(row[1:])

        reqIDList = reqDict.keys()
        random.shuffle(reqIDList)

        for reqID in reqIDList:
            sidList = [x[0] for x in reqDict[reqID]]
            for subID in sidList:
                req = "UPDATE SubRequests SET Status='Assigned' WHERE RequestID=%s AND SubRequestID=%s;" % (
                    reqID, subID)
                resAssigned = self._update(req)
                if not resAssigned['OK']:
                    if subIDList:
                        self.__releaseSubRequests(reqID, subIDList)
                    return S_ERROR('Failed to assign subrequests: %s' %
                                   resAssigned['Message'])
                if resAssigned['Value'] == 0:
                    # Somebody has assigned this request
                    gLogger.warn(
                        'Already assigned subrequest %d of request %d' %
                        (subID, reqID))
                else:
                    subIDList.append(subID)
            if subIDList:
                # We managed to get some requests, can continue now
                requestID = reqID

                break
        # Haven't succeeded to get any request
        if not requestID:
            return S_OK()

        dmRequest.setRequestID(requestID)

        fields = [
            'FileID', 'LFN', 'Size', 'PFN', 'GUID', 'Md5', 'Addler', 'Attempt',
            'Status'
        ]
        for subRequestID, operation, arguments, executionOrder, sourceSE, targetSE, catalogue, creationTime, submissionTime, lastUpdate in reqDict[
                requestID]:
            if not subRequestID in subIDList: continue
            res = dmRequest.initiateSubRequest(requestType)
            ind = res['Value']
            subRequestDict = {
                'Status': 'Waiting',
                'SubRequestID': subRequestID,
                'Operation': operation,
                'Arguments': arguments,
                'ExecutionOrder': int(executionOrder),
                'SourceSE': sourceSE,
                'TargetSE': targetSE,
                'Catalogue': catalogue,
                'CreationTime': creationTime,
                'SubmissionTime': submissionTime,
                'LastUpdate': lastUpdate
            }
            res = dmRequest.setSubRequestAttributes(ind, requestType,
                                                    subRequestDict)
            if not res['OK']:
                err = 'RequestDB._getRequest: Failed to set subRequest attributes for RequestID %s' % requestID
                self.__releaseSubRequests(requestID, subIDList)
                return S_ERROR('%s\n%s' % (err, res['Message']))

            req = "SELECT %s FROM Files WHERE SubRequestID = %s ORDER BY FileID;" % (
                ', '.join(fields), subRequestID)
            res = self._query(req)
            if not res['OK']:
                err = 'RequestDB._getRequest: Failed to get File attributes for RequestID %s.%s' % (
                    requestID, subRequestID)
                self.__releaseSubRequests(requestID, subIDList)
                return S_ERROR('%s\n%s' % (err, res['Message']))
            files = []
            for fileID, lfn, size, pfn, guid, md5, addler, attempt, status in res[
                    'Value']:
                fileDict = {
                    'FileID': fileID,
                    'LFN': lfn,
                    'Size': size,
                    'PFN': pfn,
                    'GUID': guid,
                    'Md5': md5,
                    'Addler': addler,
                    'Attempt': attempt,
                    'Status': status
                }
                files.append(fileDict)
            res = dmRequest.setSubRequestFiles(ind, requestType, files)
            if not res['OK']:
                err = 'RequestDB._getRequest: Failed to set files into Request for RequestID %s.%s' % (
                    requestID, subRequestID)
                self.__releaseSubRequests(requestID, subIDList)
                return S_ERROR('%s\n%s' % (err, res['Message']))

            req = "SELECT Dataset,Status FROM Datasets WHERE SubRequestID = %s;" % subRequestID
            res = self._query(req)
            if not res['OK']:
                err = 'RequestDB._getRequest: Failed to get Datasets for RequestID %s.%s' % (
                    requestID, subRequestID)
                self.__releaseSubRequests(requestID, subIDList)
                return S_ERROR('%s\n%s' % (err, res['Message']))
            datasets = []
            for dataset, status in res['Value']:
                datasets.append(dataset)
            res = dmRequest.setSubRequestDatasets(ind, requestType, datasets)
            if not res['OK']:
                err = 'RequestDB._getRequest: Failed to set datasets into Request for RequestID %s.%s' % (
                    requestID, subRequestID)
                self.__releaseSubRequests(requestID, subIDList)
                return S_ERROR('%s\n%s' % (err, res['Message']))

        fields = [
            'RequestName', 'JobID', 'OwnerDN', 'OwnerGroup', 'DIRACSetup',
            'SourceComponent', 'CreationTime', 'SubmissionTime', 'LastUpdate'
        ]

        req = "SELECT %s from Requests WHERE RequestID = %s;" % (
            ', '.join(fields), requestID)
        res = self._query(req)
        if not res['OK']:
            err = 'RequestDB._getRequest: Failed to retrieve max RequestID'
            self.__releaseSubRequests(requestID, subIDList)
            return S_ERROR('%s\n%s' % (err, res['Message']))
        requestName, jobID, ownerDN, ownerGroup, diracSetup, sourceComponent, creationTime, submissionTime, lastUpdate = res[
            'Value'][0]
        dmRequest.setRequestName(requestName)
        dmRequest.setJobID(jobID)
        dmRequest.setOwnerDN(ownerDN)
        dmRequest.setOwnerGroup(ownerGroup)
        dmRequest.setDIRACSetup(diracSetup)
        dmRequest.setSourceComponent(sourceComponent)
        dmRequest.setCreationTime(str(creationTime))
        dmRequest.setLastUpdate(str(lastUpdate))
        res = dmRequest.toXML()
        if not res['OK']:
            err = 'RequestDB._getRequest: Failed to create XML for RequestID %s' % (
                requestID)
            self.__releaseSubRequests(requestID, subIDList)
            return S_ERROR('%s\n%s' % (err, res['Message']))
        requestString = res['Value']
        #still have to manage the status of the dataset properly
        resultDict = {}
        resultDict['RequestName'] = requestName
        resultDict['RequestString'] = requestString
        resultDict['JobID'] = jobID
        return S_OK(resultDict)
Пример #3
0
  def getRequest( self, requestType = '' ):
    """ Get a request of a given type
    """
    # RG: What if requestType is not given?
    # the first query will return nothing.
    start = time.time()
    dmRequest = RequestContainer( init = False )
    requestID = 0
    req = "SELECT RequestID,SubRequestID FROM SubRequests WHERE Status = 'Waiting' AND RequestType = '%s' ORDER BY LastUpdate ASC LIMIT 50;" % requestType
    res = self._query( req )
    if not res['OK']:
      err = 'RequestDB._getRequest: Failed to retrieve max RequestID'
      return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
    if not res['Value']:
      return S_OK()

    reqIDList = [ x[0] for x in res['Value'] ]
    random.shuffle( reqIDList )
    count = 0
    for reqID in reqIDList:
      count += 1
      if requestType:
        req = "SELECT SubRequestID,Operation,Arguments,ExecutionOrder,SourceSE,TargetSE,Catalogue,CreationTime,SubmissionTime,LastUpdate \
        from SubRequests WHERE RequestID=%s AND RequestType='%s' AND Status='%s'" % ( reqID, requestType, 'Waiting' )
      else:
        # RG: What if requestType is not given?
        # we should never get there, and it misses the "AND Status='Waiting'"
        req = "SELECT SubRequestID,Operation,Arguments,ExecutionOrder,SourceSE,TargetSE,Catalogue,CreationTime,SubmissionTime,LastUpdate \
        from SubRequests WHERE RequestID=%s" % reqID
      res = self._query( req )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to retrieve SubRequests for RequestID %s' % reqID
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

      subIDList = []
      for tuple in res['Value']:
        subID = tuple[0]
        # RG: We should set the condition "AND Status='Waiting'"
        # if the subrequest has got assigned it will failed
        req = "UPDATE SubRequests SET Status='Assigned' WHERE RequestID=%s AND SubRequestID=%s;" % ( reqID, subID )
        resAssigned = self._update( req )
        if not resAssigned['OK']:
          if subIDList:
            self.__releaseSubRequests( reqID, subIDList )
          return S_ERROR( 'Failed to assign subrequests: %s' % resAssigned['Message'] )
        if resAssigned['Value'] == 0:
          # Somebody has assigned this request
          gLogger.warn( 'Already assigned subrequest %d of request %d' % ( subID, reqID ) )
        else:
          subIDList.append( subID )

        # RG: We need to check that all subRequest with smaller ExecutionOrder are "Done"

      if subIDList:
        # We managed to get some requests, can continue now
        requestID = reqID
        break

    # Haven't succeeded to get any request        
    if not requestID:
      return S_OK()

    dmRequest.setRequestID( requestID )
    # RG: We have this list in subIDList, can different queries get part of the subrequets of the same type?
    subRequestIDs = []

    for subRequestID, operation, arguments, executionOrder, sourceSE, targetSE, catalogue, creationTime, submissionTime, lastUpdate in res['Value']:
      if not subRequestID in subIDList: continue
      subRequestIDs.append( subRequestID )
      # RG: res['Value'] is the range of the loop and it gets redefined here !!!!!!
      res = dmRequest.initiateSubRequest( requestType )
      ind = res['Value']
      subRequestDict = {
                        'Status'        : 'Waiting',
                        'SubRequestID'  : subRequestID,
                        'Operation'     : operation,
                        'Arguments'     : arguments,
                        'ExecutionOrder': int( executionOrder ),
                        'SourceSE'      : sourceSE,
                        'TargetSE'      : targetSE,
                        'Catalogue'     : catalogue,
                        'CreationTime'  : creationTime,
                        'SubmissionTime': submissionTime,
                        'LastUpdate'    : lastUpdate
                       }
      res = dmRequest.setSubRequestAttributes( ind, requestType, subRequestDict )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set subRequest attributes for RequestID %s' % requestID
        self.__releaseSubRequests( requestID, subRequestIDs )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

      req = "SELECT FileID,LFN,Size,PFN,GUID,Md5,Addler,Attempt,Status \
      from Files WHERE SubRequestID = %s ORDER BY FileID;" % subRequestID
      res = self._query( req )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to get File attributes for RequestID %s.%s' % ( requestID, subRequestID )
        self.__releaseSubRequests( requestID, subRequestIDs )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
      files = []
      for fileID, lfn, size, pfn, guid, md5, addler, attempt, status in res['Value']:
        fileDict = {'FileID':fileID, 'LFN':lfn, 'Size':size, 'PFN':pfn, 'GUID':guid, 'Md5':md5, 'Addler':addler, 'Attempt':attempt, 'Status':status}
        files.append( fileDict )
      res = dmRequest.setSubRequestFiles( ind, requestType, files )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set files into Request for RequestID %s.%s' % ( requestID, subRequestID )
        self.__releaseSubRequests( requestID, subRequestIDs )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

      req = "SELECT Dataset,Status FROM Datasets WHERE SubRequestID = %s;" % subRequestID
      res = self._query( req )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to get Datasets for RequestID %s.%s' % ( requestID, subRequestID )
        self.__releaseSubRequests( requestID, subRequestIDs )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
      datasets = []
      for dataset, status in res['Value']:
        datasets.append( dataset )
      res = dmRequest.setSubRequestDatasets( ind, requestType, datasets )
      if not res['OK']:
        err = 'RequestDB._getRequest: Failed to set datasets into Request for RequestID %s.%s' % ( requestID, subRequestID )
        self.__releaseSubRequests( requestID, subRequestIDs )
        return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )

    req = "SELECT RequestName,JobID,OwnerDN,OwnerGroup,DIRACSetup,SourceComponent,CreationTime,SubmissionTime,LastUpdate from Requests WHERE RequestID = %s;" % requestID
    res = self._query( req )
    if not res['OK']:
      err = 'RequestDB._getRequest: Failed to retrieve max RequestID'
      self.__releaseSubRequests( requestID, subRequestIDs )
      return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
    requestName, jobID, ownerDN, ownerGroup, diracSetup, sourceComponent, creationTime, submissionTime, lastUpdate = res['Value'][0]
    dmRequest.setRequestName( requestName )
    dmRequest.setJobID( jobID )
    dmRequest.setOwnerDN( ownerDN )
    dmRequest.setOwnerGroup( ownerGroup )
    dmRequest.setDIRACSetup( diracSetup )
    dmRequest.setSourceComponent( sourceComponent )
    dmRequest.setCreationTime( str( creationTime ) )
    dmRequest.setLastUpdate( str( lastUpdate ) )
    res = dmRequest.toXML()
    if not res['OK']:
      err = 'RequestDB._getRequest: Failed to create XML for RequestID %s' % ( requestID )
      self.__releaseSubRequests( requestID, subRequestIDs )
      return S_ERROR( '%s\n%s' % ( err, res['Message'] ) )
    requestString = res['Value']
    #still have to manage the status of the dataset properly
    resultDict = {}
    resultDict['RequestName'] = requestName
    resultDict['RequestString'] = requestString
    resultDict['JobID'] = jobID
    return S_OK( resultDict )
Пример #4
0
    def getRequestForSubRequest(self, itself, subRequestID):
        """ 
    Select Request given SubRequestID.

    :param self: plugin reference
    :param itself: patient reference for injection
    :param int subRequestID: SubRequests.SubRequestID
    :warn: function has to be injected to RequestDBMySQL instance

    """

        ## get RequestID
        requestID = "SELECT RequestID FROM SubRequests WHERE SubRequestID = %s;" % str(
            subRequestID)
        requestID = self._query(requestID)
        if not requestID["OK"]:
            return requestID
        requestID = requestID["Value"][0]

        ## create RequestContainer
        requestContainer = RequestContainer(init=False)
        requestContainer.setRequestID(requestID)

        ## put some basic infos in
        requestInfo = "SELECT RequestName, JobID, OwnerDN, OwnerGroup, DIRACSetup, SourceComponent, CreationTime, SubmissionTime, LastUpdate, Status "
        requestInfo += "FROM Requests WHERE RequestID = %d;" % requestID
        requestInfo = self._query(requestInfo)
        if not requestInfo["OK"]:
            return requestInfo

        requestName, jobID, ownerDN, ownerGroup, diracSetup, sourceComponent, creationTime, submissionTime, lastUpdate, status = requestInfo[
            'Value'][0]
        requestContainer.setRequestName(requestName)
        requestContainer.setJobID(jobID)
        requestContainer.setOwnerDN(ownerDN)
        requestContainer.setOwnerGroup(ownerGroup)
        requestContainer.setDIRACSetup(diracSetup)
        requestContainer.setSourceComponent(sourceComponent)
        requestContainer.setCreationTime(str(creationTime))
        requestContainer.setLastUpdate(str(lastUpdate))
        requestContainer.setStatus(status)

        ## get sub-requests
        subRequests = "SELECT SubRequestID, Status, RequestType, Operation, Arguments, ExecutionOrder, SourceSE, "
        subRequests += "TargetSE, Catalogue, CreationTime, SubmissionTime, LastUpdate FROM SubRequests WHERE RequestID=%s;" % requestID
        subRequests = self._query(subRequests)
        if not subRequests["OK"]:
            return subRequests
        ## loop over sub requests
        for subRequestID, status, requestType, operation, arguments, executionOrder, sourceSE, targetSE, catalogue, creationTime, submissionTime, lastUpdate in subRequests[
                "Value"]:
            res = requestContainer.initiateSubRequest(requestType)
            ind = res["Value"]
            subRequestDict = {
                "Status": status,
                "SubRequestID": subRequestID,
                "Operation": operation,
                "Arguments": arguments,
                "ExecutionOrder": int(executionOrder),
                "SourceSE": sourceSE,
                "TargetSE": targetSE,
                "Catalogue": catalogue,
                "CreationTime": creationTime,
                "SubmissionTime": submissionTime,
                "LastUpdate": lastUpdate
            }
            res = requestContainer.setSubRequestAttributes(
                ind, requestType, subRequestDict)
            if not res["OK"]:
                return res

            ## get files for this subrequest
            req = "SELECT FileID, LFN, Size, PFN, GUID, Md5, Addler, Attempt, Status FROM Files WHERE SubRequestID = %s ORDER BY FileID;" % str(
                subRequestID)
            res = self._query(req)
            if not res["OK"]:
                return res
            files = []
            for fileID, lfn, size, pfn, guid, md5, addler, attempt, status in res[
                    "Value"]:
                fileDict = {
                    "FileID": fileID,
                    "LFN": lfn,
                    "Size": size,
                    "PFN": pfn,
                    "GUID": guid,
                    "Md5": md5,
                    "Addler": addler,
                    "Attempt": attempt,
                    "Status": status
                }
                files.append(fileDict)
            res = requestContainer.setSubRequestFiles(ind, requestType, files)
            if not res["OK"]:
                return res

        ## dump request to XML
        res = requestContainer.toXML()
        if not res["OK"]:
            return res
        requestString = res["Value"]

        ## return dictonary with all info in at least
        return S_OK({
            "RequestName": requestName,
            "RequestString": requestString,
            "JobID": jobID,
            "RequestContainer": requestContainer
        })
  def getRequestForSubRequest(self, itself, subRequestID ):
    """ 
    Select Request given SubRequestID.

    :param self: plugin reference
    :param itself: patient reference for injection
    :param int subRequestID: SubRequests.SubRequestID
    :warn: function has to be injected to RequestDBMySQL instance

    """

    ## get RequestID
    requestID = "SELECT RequestID FROM SubRequests WHERE SubRequestID = %s;" % str(subRequestID)
    requestID = self._query( requestID )
    if not requestID["OK"]:
      return requestID
    requestID = requestID["Value"][0]

    ## create RequestContainer
    requestContainer = RequestContainer( init = False )
    requestContainer.setRequestID( requestID )
    
    ## put some basic infos in 
    requestInfo  = "SELECT RequestName, JobID, OwnerDN, OwnerGroup, DIRACSetup, SourceComponent, CreationTime, SubmissionTime, LastUpdate, Status "
    requestInfo += "FROM Requests WHERE RequestID = %d;" % requestID
    requestInfo = self._query( requestInfo )
    if not requestInfo["OK"]:
      return requestInfo

    requestName, jobID, ownerDN, ownerGroup, diracSetup, sourceComponent, creationTime, submissionTime, lastUpdate, status = requestInfo['Value'][0]
    requestContainer.setRequestName( requestName )
    requestContainer.setJobID( jobID )
    requestContainer.setOwnerDN( ownerDN )
    requestContainer.setOwnerGroup( ownerGroup )
    requestContainer.setDIRACSetup( diracSetup )
    requestContainer.setSourceComponent( sourceComponent )
    requestContainer.setCreationTime( str( creationTime ) )
    requestContainer.setLastUpdate( str( lastUpdate ) )
    requestContainer.setStatus( status )
    
    ## get sub-requests 
    subRequests = "SELECT SubRequestID, Status, RequestType, Operation, Arguments, ExecutionOrder, SourceSE, "
    subRequests += "TargetSE, Catalogue, CreationTime, SubmissionTime, LastUpdate FROM SubRequests WHERE RequestID=%s;" % requestID
    subRequests = self._query( subRequests )
    if not  subRequests["OK"]:
      return subRequests
    ## loop over sub requests
    for subRequestID, status, requestType, operation, arguments, executionOrder, sourceSE, targetSE, catalogue, creationTime, submissionTime, lastUpdate in  subRequests["Value"]:
      res = requestContainer.initiateSubRequest( requestType )
      ind = res["Value"]
      subRequestDict = { "Status" : status, "SubRequestID"  : subRequestID, "Operation" : operation, "Arguments" : arguments,
                         "ExecutionOrder" : int( executionOrder ), "SourceSE" : sourceSE, "TargetSE" : targetSE,
                         "Catalogue" : catalogue, "CreationTime" : creationTime, "SubmissionTime" : submissionTime,
                         "LastUpdate" : lastUpdate }
      res = requestContainer.setSubRequestAttributes( ind, requestType, subRequestDict )
      if not res["OK"]:
        return res
    
      ## get files for this subrequest
      req = "SELECT FileID, LFN, Size, PFN, GUID, Md5, Addler, Attempt, Status FROM Files WHERE SubRequestID = %s ORDER BY FileID;" % str(subRequestID)
      res = self._query( req )
      if not res["OK"]:
        return res
      files = []
      for fileID, lfn, size, pfn, guid, md5, addler, attempt, status in res["Value"]:
        fileDict = { "FileID" : fileID, "LFN" : lfn, "Size" : size, 
                     "PFN" : pfn, "GUID" : guid, "Md5" : md5, 
                     "Addler" : addler, "Attempt" : attempt, 
                     "Status" : status }
        files.append( fileDict )
      res = requestContainer.setSubRequestFiles( ind, requestType, files )
      if not res["OK"]:
        return res

    ## dump request to XML
    res = requestContainer.toXML()
    if not res["OK"]:
      return res
    requestString = res["Value"]
    
    ## return dictonary with all info in at least
    return S_OK( { 
      "RequestName" : requestName,
      "RequestString" : requestString,
      "JobID" : jobID,
      "RequestContainer" : requestContainer 
      } )