def test_das_singleton(self): """Test DAS singleton""" mgr1 = das_singleton(multitask=None) mgr2 = das_singleton() mgr3 = das_singleton() self.assertNotEqual(mgr1, mgr2) self.assertEqual(mgr2, mgr3)
def main(): "Main routine" logging.basicConfig(level=logging.DEBUG) parser = optparse.OptionParser() parser.add_option("-c", "--class", help="Class of task to run.", dest="klass", metavar="CLASS") parser.add_option("-o", "--opts", help="Dictionary of task options.") parser.add_option("-n", "--name", help="Name to give task.", default=None) parser.add_option("-i", "--id", help="ID to give task.", default=None) parser.add_option("-t", "--interval", help="Task interval", type="int", default=3600) opts, _ = parser.parse_args() if not opts.klass: raise Exception("Task class required.") module = __import__('DAS.analytics.tasks.%s' % opts.klass, fromlist=[opts.klass]) klass = getattr(module, opts.klass) klass = TASK_CLASSES[opts.klass] if opts.name == None: opts.name = "CLI%s" % opts.klass if opts.id == None: opts.id = "0000000000000000" if opts.opts: opts.opts = eval(opts.opts) else: opts.opts = {} logger = logging.getLogger(opts.name) dascore = das_singleton(multitask=None) instance = klass(logger=logger, DAS=dascore, name=opts.name, taskid=opts.id, index=0, interval=opts.interval, **opts.opts) result = instance() print "Return value:" pprint.pprint(result) if 'next' in result: print "Task requested resubmission at %s (%d sec)" % \ (time.strftime('%H:%M', time.localtime(result['next'])), int(result['next']-time.time())) if 'resubmit' in result and not result['resubmit']: print "Task requested not to be resubmitted" if 'new_tasks' in result: print "Task requested the following new tasks:" pprint.pprint(result['new_tasks'])
def __call__(self): "Callable that the worker process will run." self.logger = multilogging().getLogger("DASAnalytics.RunnableTask") msg = 'Starting task=%s:%s, class=%s' \ % (self.name, self.index, self.classname) self.logger.info(msg) start_time = time.time() if not self.classname in TASK_CLASSES: msg = 'Task "%s:%s" unknown class "%s", aborting.' \ % (self.name, self.index, self.classname) self.logger.error(msg) return {'success': False, 'error': "unknown class", 'start_time':start_time, 'finish_time':start_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname} klass = TASK_CLASSES[self.classname] childlogger = multilogging().getLogger("DASAnalytics.Task", task_name=self.name, task_class=self.classname, task_index=self.index, task_master=self.master_id, task_parent=self.parent) try: das = das_singleton(multitask=None) except Exception as exp: msg = 'ERROR: task=%s:%s failed to instantiate, aborting' \ % (self.name, self.index) print msg print_exc(exp) return {'success': False, 'error': exp, 'start_time':start_time, 'finish_time':start_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname} #the DAS instance will now be global if this option is set, #and otherwise uniquely created by das_factory self.kwargs.update({'logger':childlogger, 'name':self.name, #task title 'index':self.index, # #runs of this task 'interval':self.interval, #desired frequency 'DAS':das}) try: instance = klass(**self.kwargs) except Exception as exp: msg = 'ERROR: task=%s:%s failed to instantiate, aborting' \ % (self.name, self.index) print msg print_exc(exp) return {'success': False, 'error': exp, 'start_time':start_time, 'finish_time':start_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname} try: result = instance() except Exception as exp: finish_time = time.time() #we might have run for some time by now msg = 'ERROR: task=%s:%s failed during run, aborting' \ % (self.name, self.index) self.logger.error(msg) print_exc(exp) return {'success': False, 'error': exp, 'start_time':start_time, 'finish_time':finish_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname} finish_time = time.time() if isinstance(result, dict): result.update({'success':True, 'start_time':start_time, 'finish_time':finish_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname}) return result else: return {'success':True, 'result':result, 'start_time':start_time, 'finish_time':finish_time, 'name':self.name, 'index':self.index, 'parent':self.parent, 'master_id':self.master_id, 'classname': self.classname}