def _init(cls,tid,initcode=True): try: tid=int(tid) result=yield run_conn_fun("runQuery","select ip,svnpath,svnuser,svnpasswd,version,rule from cron_task WHERE tid=%s",(tid,)) ip,svnpath,svnuser,svnpasswd,svnversion,rule=result[0] if initcode==True: _defer =SubRpc().xmlrpc_init(int(tid),svnpath,int(svnversion),svnuser,svnpasswd) set_time_out(2,_defer) try: yield _defer except defer.CancelledError : pass else: pass if not cls.BUFF.has_key(tid): pass else: if cls.BUFF[tid].running: cls.BUFF[tid].stop() schedule=CronSchedule(rule) sc=ScheduledCall(cls._run,tid) sc.start(schedule) cls.BUFF[tid]=sc defer.returnValue(True) except Exception as e: defer.returnValue((False,str(e)))
def _start_schedule(self, id, schedule, period): # check if the schedule is disabled or not if period["secs"] != 0: if not self._scheduled_tasks.has_key(id): self._scheduled_tasks[id] = [] val_type = self._resolve_type(schedule) for p in self._agg_periods: cron = CronSchedule(self._agg_periods[p]) if p == "day": t = ScheduledCall(self._aggregate_day, id, val_type) t.start(cron) self._scheduled_tasks[id].append(t) elif p == "month": t = ScheduledCall(self._aggregate_month, id) t.start(cron) self._scheduled_tasks[id].append(t) elif p == "year": t = ScheduledCall(self._aggregate_year, id) t.start(cron) self._scheduled_tasks[id].append(t) else: self.log.warning("Unsupported period (%s)" % p) self.log.debug("Scheduled tasks: %s" % self._scheduled_tasks)
def test_getFirstDayWithSundayDOW(self): """ Test next day with Sunday DOW entry """ schedule = CronSchedule('* * * * 0,3,5') self.assertEqual( schedule.getNextEntry(datetime(2008, 8, 31, 23, 59, 00, 00)), datetime(2008, 9, 3, 00, 00, 00, 00))
def valid_cronrule(self,rule): rule=rule.strip() try: CronSchedule(rule) except: return (False,"时间规则不符合要求") else: return True
def xmlrpc_cron_set(self, key, cron_mode, picked_function, picked_callback, picked_errback, stdout_callback, stderr_callback): print "cron server _ cron set" try: self.xmlrpc_cron_del(key) if self.valid_cronrule(cron_mode): pass else: raise Exception("cron时间规则不符合要求") try: target = cloudpickle.loads(picked_function.data) except: traceback.print_exc() raise Exception("目标函数picked反序列化失败!") try: callback = cloudpickle.loads(picked_callback.data) except: raise Exception("success回调函数picked反序列化失败!") try: errback = cloudpickle.loads(picked_errback.data) except: raise Exception("error回调函数picked反序列化失败!") if stdout_callback: try: stdout_callback = cloudpickle.loads(stdout_callback.data) except: raise Exception("stdout回调函数picked反序列化失败!") else: stdout_callback = None if stderr_callback: try: stderr_callback = cloudpickle.loads(stderr_callback.data) except: raise Exception("stderr回调函数picked反序列化失败!") else: stderr_callback = None cron = CronSchedule(cron_mode) _process = Process(target, [], {}, callback, errback, stdout_callback, stderr_callback) _task = ScheduledCall(_process.restart) _task.start(cron) CRON_BUFF[key] = (_task, _process) except Exception as e: traceback.print_exc() return False, str(e) else: return True
def _load_triggers(self): ''' This function loads all the triggers from the database. ''' # Stop any outstanding absolute time triggers in case of a reload. for schedule in self._absolute_time_schedule_calls: schedule.stop() self._absolute_time_schedule_calls = [] triggers = yield self.db.query_triggers() for trigger in triggers: t = Trigger(trigger[1], trigger[2], trigger[3]) # get trigger parameters trigger_parameters = yield self.db.query_trigger_parameters( trigger[0]) for param in trigger_parameters: if param[0] == "cron": t.cron = param[1] elif param[0] == "current_value_id": t.current_value_id = param[1] elif param[0] == "condition": t.condition = param[1] elif param[0] == "condition_value": t.condition_value = param[1] # Handle absolute time directly, and schedule. No need to keep track of this. if trigger[1] == "Absolute time": c = CronSchedule(t.cron) print c.getNextEntry() s = ScheduledCall(f=self._absolute_time_triggered, eventid=trigger[2], conditions=trigger[3]) s.start(c) self._absolute_time_schedule_calls.append(s) continue self._triggers.append(t)
def setUp(self): self.schedule = CronSchedule('15-20 3-6 5-10 5-8 2-3')
def test_equality(self): """ CronSchedule equality testing """ self.assertEqual(self.schedule, CronSchedule('* * * * *')) self.assertEqual(self.schedule == 'blah', False)
def setUp(self): self.schedule = CronSchedule('* * * * *')
def setUp(self): self.schedule = CronSchedule('*/15 * * * 1,3,5')
def setUp(self): self.schedule = CronSchedule('*/15 * */5 * *')
def cron_edit(request): '''修改计划任务 参数: tid 计划任务的ID name 名称 rule 计划任务规则 repo_id 代码库id version 代码库的版本 pre_build 预构建命令 info 说明 run_cmd 运行命令 worker_id worker的id group_id 分组的id ''' post_info = request.POST tid = post_info.get("tid").strip() name = post_info.get("name", "").strip() rule = post_info.get("rule", "").strip() repo_id = post_info.get("repo_id", "") version = post_info.get("version", "").strip() pre_build = post_info.get("pre_build", "") info = post_info.get("info", "") run_cmd = post_info.get("run_cmd", "").strip() worker_id = post_info.get("worker_id") group_id = post_info.get("group_id") tid = int(tid) cron = CronTask.objects.get(tid=tid) if not name: raise FieldError("name", "名称不能为空") if not rule: raise FieldError("rule", "时间规则不能为空") try: CronSchedule(rule) except: raise FieldError("rule", "时间规则不合法!") if not repo_id: raise FieldError("repo_id", "请选择一个代码库") repo_id = int(repo_id) Repo.objects.get(id=int(repo_id)) if not version: raise FieldError("version", "版本不能为空!") if not run_cmd: raise FieldError("run_cmd", "执行命令不能为空!") if not worker_id: raise FieldError("work_id", "请选择一个worker节点") work_id = int(worker_id) _worker = Worker.objects.get(id=int(work_id)) if work_id != cron.worker_id: raise FieldError("work_id", "不允许修改所在的worker节点") if not group_id: raise FieldError("groupid", "请选择一个分组") if not _worker.is_alive(): raise FieldError("worker_id", "worker节点已经下线!") group_id = int(group_id) Group.objects.get(id=group_id) if repo_id != cron.repo_id or version != cron.version or pre_build != cron.pre_build: cron.name = name cron.rule = rule cron.repo_id = repo_id cron.uptime = int(time.time()) cron.version = version cron.pre_build = pre_build cron.info = info cron.run_cmd = run_cmd cron.group_id = group_id cron.save() cron.pure_init() return True else: cron.name = name cron.rule = rule cron.repo_id = repo_id cron.uptime = int(time.time()) cron.version = version cron.pre_build = pre_build cron.info = info cron.run_cmd = run_cmd cron.group_id = group_id cron.enable() return True
def cron_add(request): ''' 创建计划任务 参数: name 名称 rule 计划任务规则 repo_id 代码库id version 代码库的版本 pre_build 预构建命令 info 说明 run_cmd 运行命令 worker_id worker的id group_id 分组的id ''' post_info = request.POST name = post_info.get("name", "") rule = post_info.get("rule", "").strip() repo_id = post_info.get("repo_id", "") version = post_info.get("version", "").strip() pre_build = post_info.get("pre_build", "") info = post_info.get("info", "") run_cmd = post_info.get("run_cmd", "").strip() worker_id = post_info.get("worker_id") group_id = post_info.get("group_id") if not name: raise FieldError("name", "名称不能为空") if not rule: raise FieldError("rule", "时间规则不能为空") try: CronSchedule(rule) except: raise FieldError("rule", "时间规则不合法!") if not repo_id: raise FieldError("repo_id", "请选择一个代码库") repo_id = int(repo_id) Repo.objects.get(id=int(repo_id)) if not version: raise FieldError("version", "版本不能为空!") if not run_cmd: raise FieldError("run_cmd", "执行命令不能为空!") if not worker_id: raise FieldError("worker_id", "请选择一个worker节点") work_id = int(worker_id) _worker = Worker.objects.get(id=int(work_id)) if not group_id: raise FieldError("groupid", "请选择一个分组") if not _worker.is_alive(): raise FieldError("worker_id", "worker节点已经下线!") group_id = int(group_id) Group.objects.get(id=group_id) _ = CronTask(name=name, rule=rule, repo_id=repo_id, version=version, pre_build=pre_build, info=info, owner=request.user.username, run_cmd=run_cmd, worker_id=work_id, group_id=group_id) _.save() _.pure_init() return True