Пример #1
0
  def test__getLastOrder(self):
    # no files
    req = RequestContainer()
    res = req._getLastOrder()
    self.assertEqual( res, 0 )

    self.assertEqual( req.subRequests, {} )

    req.addSubRequest( {'Attributes':{'Operation':'replicateAndRegister',
                                      'TargetSE':'SE', 'ExecutionOrder': 0}},
                      'transfer' )
    res = req._getLastOrder()
    self.assertEqual( res, 0 )

    req.addSubRequest( {'Attributes':{'Operation':'replicateAndRegister',
                                      'TargetSE':'SE', 'ExecutionOrder': 1}},
                      'transfer' )
    res = req._getLastOrder()
    self.assertEqual( res, 1 )

    del( req )

    # with files
    req = RequestContainer()
    res = req._getLastOrder( 'foo' )
    self.assertEqual( res, 0 )

    req.addSubRequest( {'Attributes':{'Operation':'replicateAndRegister',
                                      'TargetSE':'SE', 'ExecutionOrder': 1}},
                      'transfer' )
    res = req._getLastOrder( 'foo' )
    self.assertEqual( res, 0 )

    req.setSubRequestFiles( 0, 'transfer', [{'LFN':'foo', 'Status':'Waiting'}] )
    res = req._getLastOrder( 'foo' )
    self.assertEqual( res, 1 )


    req.addSubRequest( {'Attributes':{'Operation':'replicateAndRegister',
                                      'TargetSE':'SE', 'ExecutionOrder': 2}},
                      'removal' )
    res = req._getLastOrder( 'foo' )
    self.assertEqual( res, 1 )

    req.setSubRequestFiles( 0, 'removal', [{'LFN':'foo', 'Status':'Waiting'}] )
    res = req._getLastOrder( 'foo' )
    self.assertEqual( res, 2 )
Пример #2
0
    def test__getLastOrder(self):
        # no files
        req = RequestContainer()
        res = req._getLastOrder()
        self.assertEqual(res, 0)

        self.assertEqual(req.subRequests, {})

        req.addSubRequest(
            {"Attributes": {"Operation": "replicateAndRegister", "TargetSE": "SE", "ExecutionOrder": 0}}, "transfer"
        )
        res = req._getLastOrder()
        self.assertEqual(res, 0)

        req.addSubRequest(
            {"Attributes": {"Operation": "replicateAndRegister", "TargetSE": "SE", "ExecutionOrder": 1}}, "transfer"
        )
        res = req._getLastOrder()
        self.assertEqual(res, 1)

        del (req)

        # with files
        req = RequestContainer()
        res = req._getLastOrder("foo")
        self.assertEqual(res, 0)

        req.addSubRequest(
            {"Attributes": {"Operation": "replicateAndRegister", "TargetSE": "SE", "ExecutionOrder": 1}}, "transfer"
        )
        res = req._getLastOrder("foo")
        self.assertEqual(res, 0)

        req.setSubRequestFiles(0, "transfer", [{"LFN": "foo", "Status": "Waiting"}])
        res = req._getLastOrder("foo")
        self.assertEqual(res, 1)

        req.addSubRequest(
            {"Attributes": {"Operation": "replicateAndRegister", "TargetSE": "SE", "ExecutionOrder": 2}}, "removal"
        )
        res = req._getLastOrder("foo")
        self.assertEqual(res, 1)

        req.setSubRequestFiles(0, "removal", [{"LFN": "foo", "Status": "Waiting"}])
        res = req._getLastOrder("foo")
        self.assertEqual(res, 2)
Пример #3
0
  def test_addSubRequest( self ):
    rc_o = RequestContainer()
    op1_Index = rc_o.addSubRequest( {'Attributes': {'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743', 'Operation': 'op1'}},
                                    'someType' )
    op1_Index = op1_Index['Value']
    subRequestExpected = {'someType': [{'Files': [], 'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                                    'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                                    'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []}]}
    self.assertEqual( rc_o.subRequests, subRequestExpected )

    op2_index = rc_o.addSubRequest( {'Attributes': {'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743', 'Operation': 'op2'}},
                                    'someType' )
    op2_index = op2_index['Value']
    subRequestExpected = {
                          'someType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op2'},
                                        'Datasets': []
                                        }
                                      ]
                          }
    self.assertEqual( rc_o.subRequests, subRequestExpected )

    rc_o.addSubRequest( {'Attributes': {'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743', 'ExecutionOrder': 'last'}},
                        'someType' )
    subRequestExpected = {
                          'someType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op2'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 1,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        }
                                      ]
                          }
    self.assertEqual( rc_o.subRequests, subRequestExpected )


    rc_o.addSubRequest( {'Attributes': {'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743', 'ExecutionOrder': 'last'}},
                        'someOtherType' )
    subRequestExpected = {
                          'someType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op2'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 1,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        }
                                      ],
                          'someOtherType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 2,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        },
                                       ]
                          }
    self.assertEqual( rc_o.subRequests, subRequestExpected )

    fileDict = {'LFN':'foo', 'Status':'Waiting'}
    rc_o.setSubRequestFiles( op1_Index, 'someType', [fileDict] )

    subRequestExpected = {
                          'someType':
                                      [
                                       {
                                        'Files': [{'LFN':'foo', 'Status':'Waiting'}],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op2'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 1,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        }
                                      ],
                          'someOtherType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 2,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        },
                                       ]
                          }
    self.assertEqual( rc_o.subRequests, subRequestExpected )

    fileLastOp = rc_o._getLastOrder( 'foo' )
    rc_o.addSubRequest( {'Attributes': {'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743', 'ExecutionOrder': fileLastOp + 1}},
                        'someOtherType' )

    subRequestExpected = {
                          'someType':
                                      [
                                       {
                                        'Files': [{'LFN':'foo', 'Status':'Waiting'}],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op1'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 0,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': 'op2'},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 1,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        }
                                      ],
                          'someOtherType':
                                      [
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 2,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        },
                                       {
                                        'Files': [],
                                        'Attributes': {'Status': 'Waiting', 'LastUpdate': '', 'TargetSE': '', 'ExecutionOrder': 1,
                                                       'SubRequestID': 'x', 'CreationTime': '2012-06-06 14:53:43.763743',
                                                       'Catalogue': '', 'Error': '', 'Operation': ''},
                                        'Datasets': []
                                        },
                                       ]
                          }
    self.assertEqual( rc_o.subRequests, subRequestExpected )
Пример #4
0
class FailoverTransfer:

    #############################################################################
    def __init__(self, requestObject=False):
        """ Constructor function, can specify request object to instantiate 
        FailoverTransfer or a new request object is created.
    """
        self.log = gLogger.getSubLogger("FailoverTransfer")
        self.rm = ReplicaManager()
        self.request = requestObject

        if not self.request:
            self.request = RequestContainer()
            self.request.setRequestName('default_request.xml')
            self.request.setSourceComponent('FailoverTransfer')

    #############################################################################
    def transferAndRegisterFile(self,
                                fileName,
                                localPath,
                                lfn,
                                destinationSEList,
                                fileGUID=None,
                                fileCatalog=None):
        """Performs the transfer and register operation with failover.
    """
        errorList = []
        for se in destinationSEList:
            self.log.info(
                'Attempting rm.putAndRegister("%s","%s","%s",guid="%s",catalog="%s")'
                % (lfn, localPath, se, fileGUID, fileCatalog))
            result = self.rm.putAndRegister(lfn,
                                            localPath,
                                            se,
                                            guid=fileGUID,
                                            catalog=fileCatalog)
            self.log.verbose(result)
            if not result['OK']:
                self.log.error('rm.putAndRegister failed with message',
                               result['Message'])
                errorList.append(result['Message'])
                continue

            if not result['Value']['Failed']:
                self.log.info(
                    'rm.putAndRegister successfully uploaded %s to %s' %
                    (fileName, se))
                return S_OK({'uploadedSE': se, 'lfn': lfn})

            #Now we know something went wrong
            errorDict = result['Value']['Failed'][lfn]
            if not errorDict.has_key('register'):
                self.log.error('rm.putAndRegister failed with unknown error',
                               str(errorDict))
                errorList.append(
                    'Unknown error while attempting upload to %s' % se)
                continue

            fileDict = errorDict['register']
            #Therefore the registration failed but the upload was successful
            if not fileCatalog:
                fileCatalog = ''

            result = self.__setRegistrationRequest(fileDict['LFN'], se,
                                                   fileCatalog, fileDict)
            if not result['OK']:
                self.log.error(
                    'Failed to set registration request for: SE %s and metadata: \n%s'
                    % (se, fileDict))
                errorList.append(
                    'Failed to set registration request for: SE %s and metadata: \n%s'
                    % (se, fileDict))
                continue
            else:
                self.log.info(
                    'Successfully set registration request for: SE %s and metadata: \n%s'
                    % (se, fileDict))
                metadata = {}
                metadata['filedict'] = fileDict
                metadata['uploadedSE'] = se
                metadata['lfn'] = lfn
                metadata['registration'] = 'request'
                return S_OK(metadata)

        self.log.error(
            'Encountered %s errors during attempts to upload output data' %
            len(errorList))
        return S_ERROR('Failed to upload output data file')

    #############################################################################
    def transferAndRegisterFileFailover(self,
                                        fileName,
                                        localPath,
                                        lfn,
                                        targetSE,
                                        failoverSEList,
                                        fileGUID=None,
                                        fileCatalog=None):
        """Performs the transfer and register operation to failover storage and sets the
       necessary replication and removal requests to recover.
    """
        failover = self.transferAndRegisterFile(fileName, localPath, lfn,
                                                failoverSEList, fileGUID,
                                                fileCatalog)
        if not failover['OK']:
            self.log.error('Could not upload file to failover SEs',
                           failover['Message'])
            return failover

        #set removal requests and replication requests
        result = self.__setFileReplicationRequest(lfn, targetSE)
        if not result['OK']:
            self.log.error('Could not set file replication request',
                           result['Message'])
            return result

        lfn = failover['Value']['lfn']
        failoverSE = failover['Value']['uploadedSE']
        self.log.info(
            'Attempting to set replica removal request for LFN %s at failover SE %s'
            % (lfn, failoverSE))
        result = self.__setReplicaRemovalRequest(lfn, failoverSE)
        if not result['OK']:
            self.log.error('Could not set removal request', result['Message'])
            return result

        return S_OK('%s uploaded to a failover SE' % fileName)

    #############################################################################
    def getRequestObject(self):
        """Returns the potentially modified request object in order to propagate changes.
    """
        return S_OK(self.request)

    #############################################################################
    def __setFileReplicationRequest(self, lfn, se):
        """ Sets a registration request.
    """
        self.log.info('Setting replication request for %s to %s' % (lfn, se))
        lastOperationOnFile = self.request._getLastOrder(lfn)
        result = self.request.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicateAndRegister',
                    'TargetSE': se,
                    'ExecutionOrder': lastOperationOnFile + 1
                }
            }, 'transfer')
        if not result['OK']:
            return result

        index = result['Value']
        fileDict = {'LFN': lfn, 'Status': 'Waiting'}
        self.request.setSubRequestFiles(index, 'transfer', [fileDict])

        return S_OK()

    #############################################################################
    def __setRegistrationRequest(self, lfn, se, catalog, fileDict):
        """ Sets a registration request.
    """
        self.log.info('Setting registration request for %s at %s.' % (lfn, se))
        if not type(catalog) == types.ListType:
            catalog = [catalog]

        lastOperationOnFile = self.request._getLastOrder(lfn)
        i_catalog = lastOperationOnFile + 1
        for cat in catalog:
            result = self.request.addSubRequest(
                {
                    'Attributes': {
                        'Operation': 'registerFile',
                        'ExecutionOrder': i_catalog,
                        'TargetSE': se,
                        'Catalogue': cat
                    }
                }, 'register')
            if not result['OK']:
                return result

            i_catalog += 1

            index = result['Value']
            if not fileDict.has_key('Status'):
                fileDict['Status'] = 'Waiting'
            self.request.setSubRequestFiles(index, 'register', [fileDict])

        return S_OK()

    #############################################################################
    def __setReplicaRemovalRequest(self, lfn, se):
        """ Sets a removal request for a replica.
    """
        lastOperationOnFile = self.request._getLastOrder(lfn)
        result = self.request.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicaRemoval',
                    'TargetSE': se,
                    'ExecutionOrder': lastOperationOnFile + 1
                }
            }, 'removal')
        index = result['Value']
        fileDict = {'LFN': lfn, 'Status': 'Waiting'}
        self.request.setSubRequestFiles(index, 'removal', [fileDict])

        return S_OK()

    #############################################################################
    def __setFileRemovalRequest(self, lfn, se='', pfn=''):
        """ Sets a removal request for a file including all replicas.
    """
        lastOperationOnFile = self.request._getLastOrder(lfn)
        result = self.request.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'removeFile',
                    'TargetSE': se,
                    'ExecutionOrder': lastOperationOnFile + 1
                }
            }, 'removal')
        index = result['Value']
        fileDict = {'LFN': lfn, 'PFN': pfn, 'Status': 'Waiting'}
        self.request.setSubRequestFiles(index, 'removal', [fileDict])

        return S_OK()
Пример #5
0
    def test__getLastOrder(self):
        # no files
        req = RequestContainer()
        res = req._getLastOrder()
        self.assertEqual(res, 0)

        self.assertEqual(req.subRequests, {})

        req.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicateAndRegister',
                    'TargetSE': 'SE',
                    'ExecutionOrder': 0
                }
            }, 'transfer')
        res = req._getLastOrder()
        self.assertEqual(res, 0)

        req.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicateAndRegister',
                    'TargetSE': 'SE',
                    'ExecutionOrder': 1
                }
            }, 'transfer')
        res = req._getLastOrder()
        self.assertEqual(res, 1)

        del (req)

        # with files
        req = RequestContainer()
        res = req._getLastOrder('foo')
        self.assertEqual(res, 0)

        req.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicateAndRegister',
                    'TargetSE': 'SE',
                    'ExecutionOrder': 1
                }
            }, 'transfer')
        res = req._getLastOrder('foo')
        self.assertEqual(res, 0)

        req.setSubRequestFiles(0, 'transfer', [{
            'LFN': 'foo',
            'Status': 'Waiting'
        }])
        res = req._getLastOrder('foo')
        self.assertEqual(res, 1)

        req.addSubRequest(
            {
                'Attributes': {
                    'Operation': 'replicateAndRegister',
                    'TargetSE': 'SE',
                    'ExecutionOrder': 2
                }
            }, 'removal')
        res = req._getLastOrder('foo')
        self.assertEqual(res, 1)

        req.setSubRequestFiles(0, 'removal', [{
            'LFN': 'foo',
            'Status': 'Waiting'
        }])
        res = req._getLastOrder('foo')
        self.assertEqual(res, 2)
Пример #6
0
    def test_addSubRequest(self):
        rc_o = RequestContainer()
        op1_Index = rc_o.addSubRequest(
            {"Attributes": {"SubRequestID": "x", "CreationTime": "2012-06-06 14:53:43.763743", "Operation": "op1"}},
            "someType",
        )
        op1_Index = op1_Index["Value"]
        subRequestExpected = {
            "someType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                }
            ]
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)

        op2_index = rc_o.addSubRequest(
            {"Attributes": {"SubRequestID": "x", "CreationTime": "2012-06-06 14:53:43.763743", "Operation": "op2"}},
            "someType",
        )
        op2_index = op2_index["Value"]
        subRequestExpected = {
            "someType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op2",
                    },
                    "Datasets": [],
                },
            ]
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)

        rc_o.addSubRequest(
            {
                "Attributes": {
                    "SubRequestID": "x",
                    "CreationTime": "2012-06-06 14:53:43.763743",
                    "ExecutionOrder": "last",
                }
            },
            "someType",
        )
        subRequestExpected = {
            "someType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op2",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 1,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
            ]
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)

        rc_o.addSubRequest(
            {
                "Attributes": {
                    "SubRequestID": "x",
                    "CreationTime": "2012-06-06 14:53:43.763743",
                    "ExecutionOrder": "last",
                }
            },
            "someOtherType",
        )
        subRequestExpected = {
            "someType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op2",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 1,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
            ],
            "someOtherType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 2,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                }
            ],
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)

        fileDict = {"LFN": "foo", "Status": "Waiting"}
        rc_o.setSubRequestFiles(op1_Index, "someType", [fileDict])

        subRequestExpected = {
            "someType": [
                {
                    "Files": [{"LFN": "foo", "Status": "Waiting"}],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op2",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 1,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
            ],
            "someOtherType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 2,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                }
            ],
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)

        fileLastOp = rc_o._getLastOrder("foo")
        rc_o.addSubRequest(
            {
                "Attributes": {
                    "SubRequestID": "x",
                    "CreationTime": "2012-06-06 14:53:43.763743",
                    "ExecutionOrder": fileLastOp + 1,
                }
            },
            "someOtherType",
        )

        subRequestExpected = {
            "someType": [
                {
                    "Files": [{"LFN": "foo", "Status": "Waiting"}],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op1",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 0,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "op2",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 1,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
            ],
            "someOtherType": [
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 2,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
                {
                    "Files": [],
                    "Attributes": {
                        "Status": "Waiting",
                        "LastUpdate": "",
                        "TargetSE": "",
                        "ExecutionOrder": 1,
                        "SubRequestID": "x",
                        "CreationTime": "2012-06-06 14:53:43.763743",
                        "Catalogue": "",
                        "Error": "",
                        "Operation": "",
                    },
                    "Datasets": [],
                },
            ],
        }
        self.assertEqual(rc_o.subRequests, subRequestExpected)