def main(): # FIXME update the workflow name here wf = "mcremone_task_EXO-RunIISummer15wmLHEGS-04802__v1_T_170811_181808_305" print("Looking for problematic inbox elements...") wq = WorkQueue("https://cmsweb.cern.ch/couchdb/workqueue") print("Workqueue config: server %s and db %s" % (wq.server.url, wq.db.name)) nonCancelableElements = ['Done', 'Canceled', 'Failed'] data = wq.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', { 'startkey': [wf], 'endkey': [wf, {}], 'reduce': False }) elements = [ x['id'] for x in data.get('rows', []) if x['key'][1] not in nonCancelableElements ] print("Found %d elements for wf %s" % (len(elements), wf)) total = 0 for eleSlice in grouper(elements, 100): try: wq.updateElements(*eleSlice, Status='CancelRequested') except Exception as ex: print("Exception happened, but keep going: %s" % str(ex)) else: total += 100 print("Elements updated: %s" % total) print("Done!") sys.exit(0)
def testCompletedWorkflow(self): # test getWork specName = "RerecoSpec" specUrl = self.specGenerator.createReRecoSpec(specName, "file") globalQ = globalQueue(DbName='workqueue_t', QueueURL=self.testInit.couchUrl, UnittestFlag=True) self.assertTrue(globalQ.queueWork(specUrl, specName, "teamA") > 0) wqApi = WorkQueueDS(self.testInit.couchUrl, 'workqueue_t') # overwrite default - can't test with stale view wqApi.defaultOptions = {'reduce': True, 'group': True} # This only checks minimum client call not exactly correctness of return # values. self.assertEqual(wqApi.getTopLevelJobsByRequest(), [{'total_jobs': 339, 'request_name': specName}]) results = wqApi.getJobsByStatusAndPriority() self.assertEqual(results.keys(), ['Available']) self.assertEqual(results['Available'].keys(), [8000]) self.assertTrue(results['Available'][8000]['sum'], 339) result = wqApi.getElementsCountAndJobsByWorkflow() self.assertEqual(len(result), 1) self.assertEqual(result[specName]['Available']['Jobs'], 339) data = wqApi.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', {'startkey': [specName], 'endkey': [specName, {}], 'reduce': False}) elements = [x['id'] for x in data.get('rows', [])] wqApi.updateElements(*elements, Status='Canceled') # load this view once again to make sure it will be updated in the next assert.. data = wqApi.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', {'startkey': [specName], 'endkey': [specName, {}], 'reduce': False}) self.assertEqual(len(wqApi.getCompletedWorkflow(stale=False)), 1) self.assertEqual(wqApi.getJobsByStatusAndPriority().keys(), ['Canceled'])
def main(): # FIXME update the workflow name here wf = "mcremone_task_EXO-RunIISummer15wmLHEGS-04802__v1_T_170811_181808_305" print("Looking for problematic inbox elements...") wq = WorkQueue("https://cmsweb.cern.ch/couchdb/workqueue") print("Workqueue config: server %s and db %s" % (wq.server.url, wq.db.name)) nonCancelableElements = ['Done', 'Canceled', 'Failed'] data = wq.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', {'startkey': [wf], 'endkey': [wf, {}], 'reduce': False}) elements = [x['id'] for x in data.get('rows', []) if x['key'][1] not in nonCancelableElements] print("Found %d elements for wf %s" % (len(elements), wf)) total = 0 for eleSlice in grouper(elements, 100): try: wq.updateElements(*eleSlice, Status='CancelRequested') except Exception as ex: print("Exception happened, but keep going: %s" % str(ex)) else: total += 100 print("Elements updated: %s" % total) print("Done!") sys.exit(0)
def testCompletedWorkflow(self): # test getWork specName = "RerecoSpec" specUrl = self.specGenerator.createReRecoSpec( specName, "file", assignKwargs={'SiteWhitelist': ['T2_XX_SiteA']}) globalQ = globalQueue(DbName='workqueue_t', QueueURL=self.testInit.couchUrl, UnittestFlag=True, **self.queueParams) self.assertTrue(globalQ.queueWork(specUrl, specName, "teamA") > 0) wqApi = WorkQueueDS(self.testInit.couchUrl, 'workqueue_t') # overwrite default - can't test with stale view wqApi.defaultOptions = {'reduce': True, 'group': True} # This only checks minimum client call not exactly correctness of return # values. self.assertEqual(wqApi.getTopLevelJobsByRequest(), [{ 'total_jobs': 339, 'request_name': specName }]) results = wqApi.getJobsByStatus() self.assertEqual(results['Available']['sum_jobs'], 339) results = wqApi.getJobsByStatusAndPriority() resultsPrio = set( [item['priority'] for item in results.get('Available')]) self.assertItemsEqual(resultsPrio, [8000]) resultsJobs = sum([ item['sum_jobs'] for item in results.get('Available') if item['priority'] == 8000 ]) self.assertTrue(resultsJobs, 339) result = wqApi.getElementsCountAndJobsByWorkflow() self.assertEqual(len(result), 1) self.assertEqual(result[specName]['Available']['Jobs'], 339) data = wqApi.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', { 'startkey': [specName], 'endkey': [specName, {}], 'reduce': False }) elements = [x['id'] for x in data.get('rows', [])] wqApi.updateElements(*elements, Status='Canceled') # load this view once again to make sure it will be updated in the next assert.. data = wqApi.db.loadView('WorkQueue', 'elementsDetailByWorkflowAndStatus', { 'startkey': [specName], 'endkey': [specName, {}], 'reduce': False }) self.assertEqual(len(wqApi.getCompletedWorkflow(stale=False)), 1) results = wqApi.getJobsByStatusAndPriority() resultsPrio = set( [item['priority'] for item in results.get('Canceled')]) self.assertItemsEqual(resultsPrio, [8000])