Esempio n. 1
0
    def testReReco_initialize_clone(self):
        """
        Test the basics of initialize_clone for a ReReco request. 
        """
        # test overwrite of original values
        requestArgs = {
            'TimePerEvent': 21,
            'Multicore': 1,
            'SkimName1': 'new_skim_name'
        }
        originalArgs = deepcopy(rerecoOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {
            'DQMUploadProxy': 'test_file',
            'RequestNumEvents': 1,
            'DQMSequences': ['a', 'b']
        }
        originalArgs = deepcopy(rerecoOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestNumEvents': 1, 'DQMSequences': []}
        originalArgs = deepcopy(rerecoOriginalArgs)
        originalArgs.update(badJob='whatever', WMCore={'YouFool': True})
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))
Esempio n. 2
0
    def testInvalidKeys_initialize_clone(self):
        """
        Test some undefined/assignment user arguments in initialize_clone
        """
        # test with unknown key
        requestArgs = {'Multicore': 1, 'WRONG': 'Alan'}
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            MonteCarloWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # test with assignment key
        requestArgs = {'Multicore': 1, 'TrustSitelists': False}
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            MonteCarloWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # test mix of StepChain and TaskChain args (it passes the initial filter but raises factory exception)
        requestArgs = {'SubRequestType': "RelVal", "Step2": {"LumisPerJob": 5, "Campaign": "Step2Camp"}}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            TaskChainWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # make sure unsupported keys are remove from both top and inner dicts
        requestArgs = {}
        originalArgs = deepcopy(taskChainOriginalArgs)
        originalArgs['BAD'] = 'KEY'
        originalArgs['Task1']['SiteWhitelist'] = ['This_key_should_not_be_here']
        originalArgs['Task1']['Alan'] = False
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        self.assertFalse('BAD' in cloneArgs)
        self.assertFalse('SiteWhitelist' in cloneArgs['Task1'])
        self.assertFalse('Alan' in cloneArgs['Task1'])
Esempio n. 3
0
    def testResub_initialize_clone(self):
        """
        Test the basics of initialize_clone. It cannot increment the ProcessingVersion
        """
        # test overwrite of original values
        requestArgs = {
            'Multicore': 1,
            'ScramArch': 'slc6_amd64_gcc481',
            'ProcessingVersion': 10
        }
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        mcArgs = deepcopy(mcOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(mcArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {
            'DQMUploadProxy': 'test_file',
            'RequestNumEvents': 1,
            'DQMSequences': ['a', 'b']
        }
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        mcArgs = deepcopy(mcOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(mcArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestNumEvents': 1, 'DQMSequences': []}
        originalArgs = deepcopy(mcOriginalArgs)
        originalArgs.update(badJob='whatever', WMCore={'YouFool': True})
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        mcArgs = deepcopy(mcOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(mcArgs, requestArgs))
Esempio n. 4
0
    def testReReco_initialize_clone(self):
        """
        Test the basics of initialize_clone for a ReReco request. 
        """
        # test overwrite of original values
        requestArgs = {'TimePerEvent': 21, 'Multicore': 1, 'SkimName1': 'new_skim_name'}
        originalArgs = deepcopy(rerecoOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {'DQMUploadProxy': 'test_file', 'RequestNumEvents': 1, 'DQMSequences': ['a', 'b']}
        originalArgs = deepcopy(rerecoOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestNumEvents': 1, 'DQMSequences': []}
        originalArgs = deepcopy(rerecoOriginalArgs)
        originalArgs.update(badJob='whatever', WMCore={'YouFool': True})
        cloneArgs = initialize_clone(requestArgs, originalArgs, RERECO_ARGS)
        rerecoArgs = deepcopy(rerecoOriginalArgs)
        self.assertDictEqual(cloneArgs, updateDict(rerecoArgs, requestArgs))
Esempio n. 5
0
    def testInvalidKeys_initialize_clone(self):
        """
        Test some undefined/assignment user arguments in initialize_clone
        """
        # test with unknown key
        requestArgs = {'Multicore': 1, 'WRONG': 'Alan'}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            TaskChainWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # test with assignment key
        requestArgs = {'Multicore': 1, 'TrustSitelists': False}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            TaskChainWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # test mix of StepChain and TaskChain args (it passes the initial filter but raises factory exception)
        requestArgs = {'SubRequestType': "RelVal", "Step2": {"LumisPerJob": 5, "Campaign": "Step2Camp"}}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            TaskChainWorkloadFactory().factoryWorkloadConstruction(cloneArgs["RequestName"], cloneArgs)

        # make sure unsupported keys are remove from both top and inner dicts
        requestArgs = {}
        originalArgs = deepcopy(taskChainOriginalArgs)
        originalArgs['BAD'] = 'KEY'
        originalArgs['Task1']['SiteWhitelist'] = ['This_key_should_not_be_here']
        originalArgs['Task1']['Alan'] = False
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        self.assertFalse('BAD' in cloneArgs)
        self.assertFalse('SiteWhitelist' in cloneArgs['Task1'])
        self.assertFalse('Alan' in cloneArgs['Task1'])
Esempio n. 6
0
    def testTC_initialize_clone(self):
        """
        Test initialize_clone handling TaskChains
        """

        def updateProcVer(tcArgs):
            tcArgs['Task2']['ProcessingVersion'] += 1
            tcArgs['ProcessingVersion']['name1'] += 1
            tcArgs['ProcessingVersion']['name2'] += 1
            tcArgs['ProcessingVersion']['name3'] += 1

        # test overwrite of original values
        requestArgs = {'ScramArch': "slc6_amd64_gcc630", 'DQMConfigCacheID': None, 'TaskChain': 20}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {'Task4': {"InputTask": "task222", "TransientOutputModules": ["RAW", "AOD"]},
                       'ConfigCacheID': None, 'EventStreams': 8}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestPriority': 1, 'DQMSequences': [], "AcquisitionEra": {"T1": "a", "T2": "b"}}
        originalArgs = deepcopy(taskChainOriginalArgs)
        originalArgs.update(ioInput='whatever', WMCore={'YouFool': True}, TotalJobs=123)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # test overwrite of inner Task dictionaries. Make sure ProcVer gets the user provided value
        requestArgs = {"Task1": {"LumisPerJob": 1, "LumiList": {"202209": [[3, 5]]}},
                       "Task2": {"ProcessingVersion": 10},
                       "Task3": {"TaskName": "newBlah", "TransientOutputModules": []},
                       "PrepID": "prepBlah", "ProcessingVersion": 1}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        # setting by hand, I assume I better not use the code that is being tested here :-)
        tcArgs['Task1'].update(requestArgs['Task1'])
        tcArgs['Task1']['LumiList'] = {"202205": [[1, 10], [20, 25]], "202209": [[3, 5]]}
        tcArgs['Task2'].update(requestArgs['Task2'])
        tcArgs['Task3'].update(requestArgs['Task3'])
        tcArgs.update({"PrepID": "prepBlah", "ProcessingVersion": 1})
        self.assertDictEqual(cloneArgs, tcArgs)
Esempio n. 7
0
    def testTC_initialize_clone(self):
        """
        Test initialize_clone handling TaskChains
        """

        def updateProcVer(tcArgs):
            tcArgs['Task2']['ProcessingVersion'] += 1
            tcArgs['ProcessingVersion']['name1'] += 1
            tcArgs['ProcessingVersion']['name2'] += 1
            tcArgs['ProcessingVersion']['name3'] += 1

        # test overwrite of original values
        requestArgs = {'ScramArch': "slc6_amd64_gcc630", 'DQMConfigCacheID': None, 'TaskChain': 20}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {'Task4': {"InputTask": "task222", "TransientOutputModules": ["RAW", "AOD"]},
                       'ConfigCacheID': None, 'EventStreams': 8}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestPriority': 1, 'DQMSequences': [], "AcquisitionEra": {"T1": "a", "T2": "b"}}
        originalArgs = deepcopy(taskChainOriginalArgs)
        originalArgs.update(ioInput='whatever', WMCore={'YouFool': True}, TotalJobs=123)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        updateProcVer(tcArgs)
        self.assertDictEqual(cloneArgs, updateDict(tcArgs, requestArgs))

        # test overwrite of inner Task dictionaries. Make sure ProcVer gets the user provided value
        requestArgs = {"Task1": {"LumisPerJob": 1, "LumiList": {"202209": [[3, 5]]}},
                       "Task2": {"ProcessingVersion": 10},
                       "Task3": {"TaskName": "newBlah", "TransientOutputModules": []},
                       "PrepID": "prepBlah", "ProcessingVersion": 1}
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS, TASK_ARGS)
        tcArgs = deepcopy(taskChainOriginalArgs)
        # setting by hand, I assume I better not use the code that is being tested here :-)
        tcArgs['Task1'].update(requestArgs['Task1'])
        tcArgs['Task1']['LumiList'] = {"202205": [[1, 10], [20, 25]], "202209": [[3, 5]]}
        tcArgs['Task2'].update(requestArgs['Task2'])
        tcArgs['Task3'].update(requestArgs['Task3'])
        tcArgs.update({"PrepID": "prepBlah", "ProcessingVersion": 1})
        self.assertDictEqual(cloneArgs, tcArgs)
Esempio n. 8
0
def validate_clone_create_args(request_args, config, reqmgr_db_service, *args, **kwargs):
    """
    Handle clone workflows through the clone API, by loading the spec arguments
    definition (and chain definition, if needed) and inheriting all arguments defined
    in the spec.
    *arg and **kwargs are only for the interface
    """
    response = reqmgr_db_service.getRequestByNames(request_args.pop("OriginalRequestName"))
    originalArgs = response.values()[0]

    chainArgs = None
    specClass = loadSpecClassByType(originalArgs["RequestType"])
    if originalArgs["RequestType"] == 'Resubmission':
        # cloning an ACDC, nothing that we can validate
        # simply copy the whole original dictionary over and accept all args
        createArgs = originalArgs
    else:
        # load arguments definition from the proper/original spec factory
        createArgs = specClass.getWorkloadCreateArgs()
        if originalArgs["RequestType"] in ('StepChain', 'TaskChain'):
            chainArgs = specClass.getChainCreateArgs()

    cloned_args = initialize_clone(request_args, originalArgs, createArgs, chainArgs)
    initialize_request_args(cloned_args, config)

    permission = getWritePermission(cloned_args)
    authz_match(permission['role'], permission['group'])

    spec = specClass()
    workload = spec.factoryWorkloadConstruction(cloned_args["RequestName"], cloned_args)

    return workload, cloned_args
Esempio n. 9
0
def validate_clone_create_args(request_args, config, reqmgr_db_service, *args, **kwargs):
    """
    Handle clone workflows through the clone API, by loading the spec arguments
    definition (and chain definition, if needed) and inheriting all arguments defined
    in the spec.
    *arg and **kwargs are only for the interface
    """
    response = reqmgr_db_service.getRequestByNames(request_args.pop("OriginalRequestName"))
    originalArgs = response.values()[0]

    chainArgs = None
    specClass = loadSpecClassByType(originalArgs["RequestType"])
    if originalArgs["RequestType"] == 'Resubmission':
        # cloning an ACDC, nothing that we can validate
        # simply copy the whole original dictionary over and accept all args
        createArgs = originalArgs
    else:
        # load arguments definition from the proper/original spec factory
        createArgs = specClass.getWorkloadCreateArgs()
        if originalArgs["RequestType"] in ('StepChain', 'TaskChain'):
            chainArgs = specClass.getChainCreateArgs()

    cloned_args = initialize_clone(request_args, originalArgs, createArgs, chainArgs)
    initialize_request_args(cloned_args, config)

    permission = getWritePermission(cloned_args)
    authz_match(permission['role'], permission['group'])

    spec = specClass()
    workload = spec.factoryWorkloadConstruction(cloned_args["RequestName"], cloned_args)

    return workload, cloned_args
Esempio n. 10
0
    def testSC_initialize_clone(self):
        """
        Test initialize_clone handling StepChains
        """
        # test overwrite of original values
        requestArgs = {'TimePerEvent': 12.34, 'ConfigCacheID': 'couchid', 'StepChain': 20}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {'DQMUploadProxy': 'test_file', 'RequestNumEvents': 1, 'DQMSequences': ['a', 'b']}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestNumEvents': 1, 'DQMSequences': []}
        originalArgs = deepcopy(stepChainOriginalArgs)
        originalArgs.update(Chain='whatever', WMCore={'YouFool': True})
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # test overwrite of inner Step dictionaries. Make sure ProcVer gets the user provided value
        requestArgs = {'SubRequestType': "RelVal", "Step1": {"BlockWhitelist": ["C"]},
                       "Step2": {"LumisPerJob": 5, "Campaign": "Step2Camp", "ProcessingVersion": 1}}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        # setting by hand, I assume I better not use the code that is being tested here :-)
        updateDict(scArgs, requestArgs)
        scArgs['Step1'] = {"ConfigCacheID": "blah", "GlobalTag": "PHYS18",
                           "BlockWhitelist": ["C"], "ScramArch": ["slc6_amd64_gcc493"]}
        scArgs['Step2'] = {"AcquisitionEra": "ACQERA", "ProcessingVersion": 1, "LumisPerJob": 5,
                           "Campaign": "Step2Camp", "ScramArch": ["slc7_amd64_gcc630"]}
        self.assertDictEqual(cloneArgs, scArgs)
Esempio n. 11
0
    def testSC_initialize_clone(self):
        """
        Test initialize_clone handling StepChains
        """
        # test overwrite of original values
        requestArgs = {'TimePerEvent': 12.34, 'ConfigCacheID': 'couchid', 'StepChain': 20}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # test overwrite of values that are not in the original request
        requestArgs = {'DQMUploadProxy': 'test_file', 'RequestNumEvents': 1, 'DQMSequences': ['a', 'b']}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # check whether invalid keys in the original request are dumped
        requestArgs = {'RequestNumEvents': 1, 'DQMSequences': []}
        originalArgs = deepcopy(stepChainOriginalArgs)
        originalArgs.update(Chain='whatever', WMCore={'YouFool': True})
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        scArgs['Step2']['ProcessingVersion'] += 1
        self.assertDictEqual(cloneArgs, updateDict(scArgs, requestArgs))

        # test overwrite of inner Step dictionaries. Make sure ProcVer gets the user provided value
        requestArgs = {'SubRequestType': "RelVal", "Step1": {"BlockWhitelist": ["C"]},
                       "Step2": {"LumisPerJob": 5, "Campaign": "Step2Camp", "ProcessingVersion": 1}}
        originalArgs = deepcopy(stepChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, STEPCHAIN_ARGS, STEP_ARGS)
        scArgs = deepcopy(stepChainOriginalArgs)
        # setting by hand, I assume I better not use the code that is being tested here :-)
        updateDict(scArgs, requestArgs)
        scArgs['Step1'] = {"ConfigCacheID": "blah", "GlobalTag": "PHYS18", "BlockWhitelist": ["C"]}
        scArgs['Step2'] = {"AcquisitionEra": "ACQERA", "ProcessingVersion": 1, "LumisPerJob": 5,
                           "Campaign": "Step2Camp"}
        self.assertDictEqual(cloneArgs, scArgs)
Esempio n. 12
0
    def testInvalidKeys_initialize_clone(self):
        """
        Test some undefined/assignment user arguments in initialize_clone
        """
        # test with unknown key
        requestArgs = {'Multicore': 1, 'WRONG': 'Alan', 'ReqMgr2Only': False}
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            MonteCarloWorkloadFactory().factoryWorkloadConstruction(
                cloneArgs["RequestName"], cloneArgs)

        # test with assignment key
        requestArgs = {
            'Multicore': 1,
            'TrustSitelists': False,
            'ReqMgr2Only': False
        }
        originalArgs = deepcopy(mcOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, MC_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            MonteCarloWorkloadFactory().factoryWorkloadConstruction(
                cloneArgs["RequestName"], cloneArgs)

        # test mix of StepChain and TaskChain args (it passes the initial filter but raises factory exception)
        requestArgs = {
            'SubRequestType': "RelVal",
            "Step2": {
                "LumisPerJob": 5,
                "Campaign": "Step2Camp"
            }
        }
        originalArgs = deepcopy(taskChainOriginalArgs)
        cloneArgs = initialize_clone(requestArgs, originalArgs, TASKCHAIN_ARGS,
                                     TASK_ARGS)
        with self.assertRaises(WMSpecFactoryException):
            TaskChainWorkloadFactory().factoryWorkloadConstruction(
                cloneArgs["RequestName"], cloneArgs)
Esempio n. 13
0
def validate_resubmission_create_args(request_args, config, reqmgr_db_service,
                                      *args, **kwargs):
    """
    Handle resubmission workflows, loading the spec arguments definition (and chain
    definition, if needed) and inheriting all arguments defined in the spec.
    User can also override arguments, since it uses the same mechanism as a clone.
    *arg and **kwargs are only for the interface
    """
    response = reqmgr_db_service.getRequestByNames(
        request_args["OriginalRequestName"])
    originalArgs = response.values()[0]

    ### not a nice fix for #8245, but we cannot inherit the CollectionName attr
    originalArgs.pop("CollectionName", None)

    chainArgs = None
    if originalArgs["RequestType"] == 'Resubmission':
        # ACDC of ACDC, we can't validate this case
        # simply copy the whole original dictionary over and accept all args
        createArgs = originalArgs
        request_args["OriginalRequestType"] = originalArgs[
            "OriginalRequestType"]
        request_args["ResubmissionCount"] = originalArgs.get(
            "ResubmissionCount", 1) + 1
    else:
        # load arguments definition from the proper/original spec factory
        parentClass = loadSpecClassByType(originalArgs["RequestType"])
        createArgs = parentClass.getWorkloadAssignArgs()
        if originalArgs["RequestType"] in ('StepChain', 'TaskChain'):
            chainArgs = parentClass.getChainCreateArgs()
        createArgs.update(parentClass.getWorkloadCreateArgs())
        request_args["OriginalRequestType"] = originalArgs["RequestType"]

    cloned_args = initialize_clone(request_args, originalArgs, createArgs,
                                   chainArgs)
    initialize_request_args(cloned_args, config)

    permission = getWritePermission(cloned_args)
    authz_match(permission['role'], permission['group'])

    specClass = loadSpecClassByType(request_args["RequestType"])
    spec = specClass()
    workload = spec.factoryWorkloadConstruction(cloned_args["RequestName"],
                                                cloned_args)

    return workload, cloned_args
Esempio n. 14
0
def validate_clone_create_args(request_args, config, reqmgr_db_service, *args,
                               **kwargs):
    """
    Load the spec arguments definition (and chain definition, if needed) and inherit
    all arguments defined in the specs.
    Special handle if a Resubmission request is being cloned or resubmitted, since we
    cannot validate such request because we don't know its real origin
    *arg and **kwargs are only for the interface
    """
    response = reqmgr_db_service.getRequestByNames(
        request_args.pop("OriginalRequestName"))
    originalArgs = response.values()[0]

    chainArgs = None
    createArgs = {}
    # load arguments definition from the proper/original spec factory
    parentClass = loadSpecClassByType(originalArgs["RequestType"])
    if originalArgs["RequestType"] == 'Resubmission':
        # then we are cloning/resubmitting an ACDC. We cannot validate it,
        # simply copy the whole original dictionary over and we accept all args
        request_args['OriginalRequestType'] = originalArgs["RequestType"]
        createArgs = originalArgs
    else:
        # are we cloning or resubmitting another request type?
        if request_args.get('RequestType') == 'Resubmission':
            request_args['OriginalRequestType'] = originalArgs["RequestType"]
            # then load assignment arguments as well
            createArgs = parentClass.getWorkloadAssignArgs()
        if originalArgs["RequestType"] in ('StepChain', 'TaskChain'):
            chainArgs = parentClass.getChainCreateArgs()
        createArgs.update(parentClass.getWorkloadCreateArgs())

    cloned_args = initialize_clone(request_args, originalArgs, createArgs,
                                   chainArgs)

    initialize_request_args(cloned_args, config)

    permission = getWritePermission(cloned_args)
    authz_match(permission['role'], permission['group'])

    specClass = loadSpecClassByType(request_args["RequestType"])
    spec = specClass()
    workload = spec.factoryWorkloadConstruction(cloned_args["RequestName"],
                                                cloned_args)

    return workload, cloned_args
Esempio n. 15
0
def validate_resubmission_create_args(request_args, config, reqmgr_db_service, *args, **kwargs):
    """
    Handle resubmission workflows, loading the spec arguments definition (and chain
    definition, if needed) and inheriting all arguments defined in the spec.
    User can also override arguments, since it uses the same mechanism as a clone.
    *arg and **kwargs are only for the interface
    """
    response = reqmgr_db_service.getRequestByNames(request_args["OriginalRequestName"])
    originalArgs = response.values()[0]

    ### not a nice fix for #8245, but we cannot inherit the CollectionName attr
    originalArgs.pop("CollectionName", None)

    chainArgs = None
    if originalArgs["RequestType"] == 'Resubmission':
        # ACDC of ACDC, we can't validate this case
        # simply copy the whole original dictionary over and accept all args
        createArgs = originalArgs
        request_args["OriginalRequestType"] = originalArgs["OriginalRequestType"]
        request_args["ResubmissionCount"] = originalArgs.get("ResubmissionCount", 1) + 1
    else:
        # load arguments definition from the proper/original spec factory
        parentClass = loadSpecClassByType(originalArgs["RequestType"])
        createArgs = parentClass.getWorkloadAssignArgs()
        if originalArgs["RequestType"] in ('StepChain', 'TaskChain'):
            chainArgs = parentClass.getChainCreateArgs()
        createArgs.update(parentClass.getWorkloadCreateArgs())
        request_args["OriginalRequestType"] = originalArgs["RequestType"]

    cloned_args = initialize_clone(request_args, originalArgs, createArgs, chainArgs)
    initialize_request_args(cloned_args, config)

    permission = getWritePermission(cloned_args)
    authz_match(permission['role'], permission['group'])

    specClass = loadSpecClassByType(request_args["RequestType"])
    spec = specClass()
    workload = spec.factoryWorkloadConstruction(cloned_args["RequestName"], cloned_args)

    return workload, cloned_args