Example #1
0
 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)
Example #2
0
 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)
Example #3
0
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'])
Example #4
0
File: task.py Project: ktf/DAS
    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}