예제 #1
0
def validateSiteLists(arguments):
    whiteList = arguments.get("SiteWhitelist", [])
    blackList = arguments.get("SiteBlacklist", [])
    whiteList = makeList(whiteList)
    blackList = makeList(blackList)
    res = (set(whiteList) & set(blackList))
    if len(res):
        msg = "Validation failed: The same site cannot be white and blacklisted: %s" % list(res)
        raise WMSpecFactoryException(msg)
    # store the properly formatted values (list instead of string)
    arguments["SiteWhitelist"] = whiteList
    arguments["SiteBlacklist"] = blackList
    return
예제 #2
0
def validateSiteLists(arguments):
    whiteList = arguments.get("SiteWhitelist", [])
    blackList = arguments.get("SiteBlacklist", [])
    whiteList = makeList(whiteList)
    blackList = makeList(blackList)
    res = (set(whiteList) & set(blackList))
    if len(res):
        msg = "Validation failed: The same site cannot be white and blacklisted: %s" % list(res)
        raise WMSpecFactoryException(msg)
    # store the properly formatted values (list instead of string)
    arguments["SiteWhitelist"] = whiteList
    arguments["SiteBlacklist"] = blackList
    return
예제 #3
0
    def testMakeNonEmptyList(self):
        """
        Test the makeNonEmptyList function.
        It has exactly the same behaviour as makeList, but throws an exception
        for empty list or string.
        """
        self.assertEqual(makeList(['123']), makeNonEmptyList(['123']))
        self.assertItemsEqual(makeList(['123', 456, '789']), makeNonEmptyList(['123', 456, '789']))

        self.assertItemsEqual(makeList(u'123,456'), makeNonEmptyList(u'123, 456'))
        self.assertItemsEqual(makeList('["aa","bb","cc"]'), makeNonEmptyList('["aa", "bb", "cc"]'))

        self.assertRaises(ValueError, makeNonEmptyList, [])
        self.assertRaises(ValueError, makeNonEmptyList, "")
예제 #4
0
    def testMakeNonEmptyList(self):
        """
        Test the makeNonEmptyList function.
        It has exactly the same behaviour as makeList, but throws an exception
        for empty list or string.
        """
        self.assertEqual(makeList(['123']), makeNonEmptyList(['123']))
        self.assertListEqual(makeList(['123', 456, '789']), makeNonEmptyList(['123', 456, '789']))

        self.assertListEqual(makeList(u'123,456'), makeNonEmptyList(u'123, 456'))
        self.assertListEqual(makeList('["aa","bb","cc"]'), makeNonEmptyList('["aa", "bb", "cc"]'))

        self.assertRaises(ValueError, makeNonEmptyList, [])
        self.assertRaises(ValueError, makeNonEmptyList, "")
예제 #5
0
    def testMakeList(self):
        """
        Test the makeList function
        """
        self.assertEqual(makeList([]), [])
        self.assertEqual(makeList(""), [])
        self.assertEqual(makeList(['123']), ['123'])
        self.assertEqual(makeList([456]), [456])
        self.assertItemsEqual(makeList(['123', 456, '789']),
                              ['123', 456, '789'])

        self.assertEqual(makeList('123'), ['123'])
        self.assertEqual(makeList(u'123'), [u'123'])
        self.assertItemsEqual(makeList('123,456'), ['123', '456'])
        self.assertItemsEqual(makeList(u'123,456'), [u'123', u'456'])
        self.assertItemsEqual(makeList('["aa","bb","cc"]'), ['aa', 'bb', 'cc'])
        self.assertItemsEqual(makeList(u' ["aa", "bb", "cc"] '),
                              ['aa', 'bb', 'cc'])

        self.assertRaises(ValueError, makeList, 123)
        self.assertRaises(ValueError, makeList, 123.456)
        self.assertRaises(ValueError, makeList, {1: 123})
예제 #6
0
    def testMakeList(self):
        """
        Test the makeList function
        """
        self.assertEqual(makeList([]), [])
        self.assertEqual(makeList(""), [])
        self.assertEqual(makeList(['123']), ['123'])
        self.assertEqual(makeList([456]), [456])
        self.assertItemsEqual(makeList(['123', 456, '789']), ['123', 456, '789'])

        self.assertEqual(makeList('123'), ['123'])
        self.assertEqual(makeList(u'123'), [u'123'])
        self.assertItemsEqual(makeList('123,456'), ['123', '456'])
        self.assertItemsEqual(makeList(u'123,456'), [u'123', u'456'])
        self.assertItemsEqual(makeList('["aa","bb","cc"]'), ['aa', 'bb', 'cc'])
        self.assertItemsEqual(makeList(u' ["aa", "bb", "cc"] '), ['aa', 'bb', 'cc'])

        self.assertRaises(ValueError, makeList, 123)
        self.assertRaises(ValueError, makeList, 123.456)
        self.assertRaises(ValueError, makeList, {1: 123})
예제 #7
0
    def post(self, **kwargs):
        """This is used by ASO/CRAB3 Operator to acquire Transfers/Publication or update/retry/kill them.
           Find a description next to each call"""
        subresource = kwargs['subresource']
        binds = {}
        timeNow = int(time.time())
        binds['last_update'] = [timeNow]
        binds['asoworker'] = [kwargs['asoworker']]

        if subresource == 'acquireTransfers':
            ###############################################
            # acquireTransfers API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark  all docs, which do not
            # have asoworker assigned from this transfer_state to new_transfer_state
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which acquire Transfers.
            ###############################################
            binds['limit'] = [1000]
            binds['transfer_state'] = [TRANSFERDB_STATUSES['NEW']]
            binds['new_transfer_state'] = [TRANSFERDB_STATUSES['ACQUIRED']]
            binds['username'] = [kwargs['username']]
            return self.api.modifynocheck(self.transferDB.AcquireTransfers_sql, **binds)

        elif subresource == 'acquirePublication':
            ###############################################
            # acquirePublication API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark all docs, which file transfer
            # status is done, will update asoworker to new asoworker status. also will
            # look for this specific publication state and will change it to new_publication_state
            # :transfer_done AND publish = :publish_new
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which acquire Publication. It will select entries in
            # transfersdb which have this asoworker AND all those where asoworker is null and in those
            # set it to the value passed in arg
            ###############################################
            # TODO: Maybe we want to acquire publication per ASO machine
            # by meaning if we have 2 ASO concurrent running, each of them can acquire multiple files
            # from same task. Maybe is good to enforce acquire only for tasks which do not have
            # asoworker defined. This would enforce to group files per and lower a bit load on dbs.
            binds['publish_flag'] = [1]
            binds['transfer_state'] = [TRANSFERDB_STATUSES['DONE']]
            binds['publication_state'] = [PUBLICATIONDB_STATUSES['NEW']]
            binds['new_publication_state'] = [PUBLICATIONDB_STATUSES['ACQUIRED']]
            return self.api.modifynocheck(self.transferDB.AcquirePublication_sql, **binds)

        elif subresource == 'updateTransfers':
            ###############################################
            # updateTransfers API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will select entries in filetransferdb via their tm_id
            # and will make all posted modification.
            # If there are passed N (2 or 4) items, it will do corresponding action in update
            # :::::::
            # 2 items, Required keys are:
            # ([str, str]) list_of_ids: list of ids which are in database.
            # ([str, str]) list_of_transfer_state: transfer_state which is one of: ['FAILED', 'DONE', 'RETRY', 'SUBMITTED', 'KILLED']
            # optional: ([str, str]) list_of_failure_reason
            # :::::::
            # 4 items, Required keys are:
            # ([str, str]) list_of_ids: list of ids which are in database.
            # ([str, str]) list_of_transfer_state: transfer_state which is one of: ['FAILED', 'DONE', 'RETRY', 'SUBMITTED', 'KILLED']
            # ([str, str]) list_of_fts_instance: list of fts instance to which transfer was submitted.
            # ([str, str]) list_of_fts_id: list of fts id for this specific document transfer
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name to be set for transfers which were acquired
            ###############################################
            binds['last_update'] = [timeNow]
            # TODO: fix case: if 'fts_instance' in kwargs
            if kwargs['list_of_fts_instance']:
                #del errorMsg
                ids = makeList(kwargs['list_of_ids'])
                states = makeList(kwargs['list_of_transfer_state'])
                retry = [0 for x in states]
                reasons = ["" for x in states]
                instances = makeList(kwargs['list_of_fts_instance'])
                fts_id = makeList(kwargs['list_of_fts_id'])

                for num in range(len(ids)):
                    binds['id'] = [ids[num]]
                    binds['transfer_state'] = [TRANSFERDB_STATUSES[states[num]]] 
                    binds['fts_instance'] = [str(instances[num])] 
                    binds['fts_id'] = [str(fts_id[num])]
                    binds['fail_reason'] = [reasons[num]]
                    binds['retry_value'] = [int(retry[num])]
                    self.api.modifynocheck(self.transferDB.UpdateTransfers_sql, **binds)
            else:
                ids = makeList(kwargs['list_of_ids'])
                states = makeList(kwargs['list_of_transfer_state'])
                retry = [0 for x in states]
                reasons = ["" for x in states]
                if kwargs['list_of_retry_value'] is not None:
                    reasons = makeList(kwargs['list_of_failure_reason'])
                    retry = makeList(kwargs['list_of_retry_value'])
                for num in range(len(ids)):
                    binds['id'] = [ids[num]]
                    binds['transfer_state'] = [TRANSFERDB_STATUSES[states[num]]]
                    binds['fts_instance'] = [None]
                    binds['fts_id'] = [None]
                    binds['fail_reason'] = [reasons[num]]
                    binds['retry_value'] = [int(retry[num])]
                    self.api.modifynocheck(self.transferDB.UpdateTransfers_sql, **binds)

        elif subresource == 'updatePublication':
            ###############################################
            # updatePublication API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark all docs, which have asoworker
            # in row and will make publication status for all list of ids new status
            # list of ids are keys which need to be updated.
            # 2 items are required in list_of_ids. Keys:
            # (str) id: Document id which is in database.
            # (str) publication_state: publication_state which is one of: ['FAILED', 'DONE', 'RETRY']
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which acquire Publication.
            ###############################################
            binds['last_update'] = [timeNow]
            #compareOut, errorMsg = self.compareLen(kwargs, ['list_of_ids', 'list_of_publication_state'])
            #if compareOut:
            #    del errorMsg
            ids = makeList(kwargs['list_of_ids'])
            states = makeList(kwargs['list_of_publication_state'])
            retry = [0 for x in states]
            reasons = ["" for x in states]
            if kwargs['list_of_retry_value'] is not None:
                reasons = makeList(kwargs['list_of_failure_reason'])
                retry = makeList(kwargs['list_of_retry_value'])
            for num in range(len(ids)):
                binds['publication_state'] = [PUBLICATIONDB_STATUSES[states[num]]]
                binds['id'] = [ids[num]]
                binds['fail_reason'] = [reasons[num]]
                binds['retry_value'] = [int(retry[num])]
                binds['publish'] = [kwargs["publish_flag"] or -1]
                self.api.modify(self.transferDB.UpdatePublication_sql, **binds)

        elif subresource == 'retryPublication':
            ###############################################
            # retryPublication API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark all docs with publication_state NEW, which have asoworker
            # assigned and it did not reached max retries count and last_update is lower
            # than specified time_to.
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which acquire Publication.
            # (str) time_to: timespan until which time
            ###############################################
            if 'time_to' not in kwargs:
                raise InvalidParameter()
            binds['time_to'] = kwargs['time_to']
            binds['new_publication_state'] = PUBLICATIONDB_STATUSES['NEW']
            binds['publication_state'] = PUBLICATIONDB_STATUSES['RETRY']
            self.api.modify(self.transferDB.RetryPublication_sql, **binds)

        elif subresource == 'retryTransfers':
            ###############################################
            # retryTransfers API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark all docs with transfer_state NEW, which have asoworker
            # assigned and it did not reached max retries count and last_update is lower
            # than specified time_to.
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which retry transfers.
            # (str) time_to: timespan until which time
            ###############################################
            if 'time_to' not in kwargs:
                raise InvalidParameter()
            binds['time_to'] = [kwargs['time_to']]
            binds['new_transfer_state'] = [TRANSFERDB_STATUSES['NEW']]
            binds['transfer_state'] = [TRANSFERDB_STATUSES['RETRY']]
            return self.api.modifynocheck(self.transferDB.RetryTransfers_sql, **binds)

        elif subresource == 'killTransfers':
            ###############################################
            # killTransfers API
            # ---------------------------------------------
            # Description:
            # ASO calls this view and CRABServer will mark all docs with transfer_state KILL for specific list_of_ids
            # which have asoworker assigned and their TRANSFER_STATE is NEW
            # than specified time_to.
            # list_of_ids is a list which contains string of ids
            # ---------------------------------------------
            # Always required variables:
            # (str) asoworker: ASO Worker name for which acquire Publication.
            ###############################################
            for oneId in kwargs['list_of_ids']:
                binds['id'] = [oneId]
                binds['transfer_state'] = [TRANSFERDB_STATUSES['NEW']]
                binds['new_transfer_state'] = [TRANSFERDB_STATUSES['KILL']]
                self.api.modify(self.transferDB.KillTransfers_sql, **binds)