def add_cron(project_id): try: request.get_json()["projectId"] = ObjectId(project_id) request.get_json()["createAt"] = datetime.datetime.utcnow() request.get_json()["lastUpdateTime"] = datetime.datetime.utcnow() data = request.get_json() if 'interval' in data: data['interval'] = float(data['interval']) if 'interval' in data and data['interval'] < 60: return jsonify({'status': 'failed', 'data': '定时任务间隔不可小于60秒!'}) if 'runDate' in data: data['runDate'] = common.frontend_date_str2datetime(data['runDate']) filtered_data = CronTab.filter_field(data, use_set_default=True) if filtered_data.get('runDate'): cron = Cron(test_case_suite_id_list=filtered_data.get('testCaseSuiteIdList'), test_domain=filtered_data.get('testDomain'), alarm_mail_list=filtered_data.get('alarmMailList'), is_ding_ding_notify=filtered_data.get('isDingDingNotify'), ding_ding_access_token=filtered_data.get('dingdingAccessToken'), ding_ding_notify_strategy=filtered_data.get('dingdingNotifyStrategy'), is_enterprise_wechat_notify=filtered_data.get('isEnterpriseWechatNotify'), enterprise_wechat_access_token=filtered_data.get('enterpriseWechatAccessToken'), enterprise_wechat_notify_strategy=filtered_data.get('enterpriseWechatNotifyStrategy'), trigger_type=filtered_data.get('triggerType'), test_case_id_list=filtered_data.get('testCaseIdList'), is_execute_forbiddened_case=filtered_data.get('isExecuteForbiddenedCase'), run_date=filtered_data.get('runDate')) else: cron = Cron(test_case_suite_id_list=filtered_data.get('testCaseSuiteIdList'), test_domain=filtered_data.get('testDomain'), alarm_mail_list=filtered_data.get('alarmMailList'), is_ding_ding_notify=filtered_data.get('isDingDingNotify'), ding_ding_access_token=filtered_data.get('dingdingAccessToken'), ding_ding_notify_strategy=filtered_data.get('dingdingNotifyStrategy'), is_enterprise_wechat_notify=filtered_data.get('isEnterpriseWechatNotify'), enterprise_wechat_access_token=filtered_data.get('enterpriseWechatAccessToken'), enterprise_wechat_notify_strategy=filtered_data.get('enterpriseWechatNotifyStrategy'), trigger_type=filtered_data.get('triggerType'), test_case_id_list=filtered_data.get('testCaseIdList'), is_execute_forbiddened_case=filtered_data.get('isExecuteForbiddenedCase'), seconds=filtered_data.get('interval')) cron_id = cron_manager.add_cron(cron) for key, value in filtered_data.items(): CronTab.update({"_id": cron_id}, {'$set': {key: value}}) update_response = CronTab.update({"_id": cron_id}, {'$set': {'lastUpdateTime': datetime.datetime.utcnow()}}) if update_response["n"] == 0: return jsonify({'status': 'failed', 'data': '新建成功但未找到相应更新数据!'}) return jsonify({'status': 'ok', 'data': '新建成功'}) except BaseException as e: return jsonify({'status': 'failed', 'data': '新建失败: %s' % e})
def update_cron(self, cron_id, cron_info): if not isinstance(cron_id, str): raise TypeError('cron_id must be str') if not isinstance(cron_info, dict): raise TypeError('cron_info must be dict') trigger_type = cron_info.get('triggerType') interval = cron_info.get('interval') run_date = cron_info.get('runDate') test_case_suite_id_list = cron_info.get('testCaseSuiteIdList') is_execute_forbiddened_case = cron_info.get('isExecuteForbiddenedCase') test_case_id_list = cron_info.get('testCaseIdList') test_domain = cron_info.get('testDomain') alarm_mail_list = cron_info.get('alarmMailList') is_ding_ding_notify = cron_info.get('isDingDingNotify') ding_ding_access_token = cron_info.get('dingdingAccessToken') ding_ding_notify_strategy = cron_info.get('dingdingNotifyStrategy') try: if trigger_type == 'interval' and int(interval) > 0: self.scheduler.modify_job(job_id=cron_id, trigger=IntervalTrigger(seconds=interval)) elif trigger_type == 'date': # TODO 判断run_date类型 self.scheduler.modify_job(job_id=cron_id, trigger=DateTrigger(run_date=run_date)) else: raise TypeError('更新定时任务触发器失败!') if run_date: cron = Cron(test_case_suite_id_list=test_case_suite_id_list, is_execute_forbiddened_case=is_execute_forbiddened_case, test_domain=test_domain, alarm_mail_list=alarm_mail_list, is_ding_ding_notify=is_ding_ding_notify, ding_ding_access_token=ding_ding_access_token, ding_ding_notify_strategy=ding_ding_notify_strategy, trigger_type=trigger_type, # 更新定时器时,此参数并没有真正起到作用, 仅修改展示字段 test_case_id_list=test_case_id_list, run_date=run_date) # 更新定时器时,此参数并没有起到作用, 仅修改展示字段 else: cron = Cron(test_case_suite_id_list=test_case_suite_id_list, is_execute_forbiddened_case=is_execute_forbiddened_case, test_domain=test_domain, alarm_mail_list=alarm_mail_list, is_ding_ding_notify=is_ding_ding_notify, ding_ding_access_token=ding_ding_access_token, ding_ding_notify_strategy=ding_ding_notify_strategy, trigger_type=trigger_type, # 更新定时器时,此参数并没有起到作用, 仅修改展示字段 test_case_id_list=test_case_id_list, seconds=interval) # 更新定时器时,此参数并没有起到作用, 仅修改展示字段 # 玄学,更改job的时候必须改args,不能改func self.scheduler.modify_job(job_id=cron_id, coalesce=True, args=[cron]) except BaseException as e: raise TypeError('更新定时任务失败: %s' % e)
def on_exec_test(data): try: data['testCaseSuiteIdList'] = data['testCaseSuiteIdList'].strip( ).split(';') except BaseException: raise TypeError('参数 「testCaseSuiteIdList」 不合法') try: data['testDomain'] = data['testDomain'].strip() except BaseException: raise TypeError('参数 「testDomain」 不合法') data['isExecuteForbiddenedCase'] = True if data.get('isExecuteForbiddenedCase') \ and common.can_convert_to_str(data.get('isExecuteForbiddenedCase'))\ and data.get('isExecuteForbiddenedCase').upper() == 'TRUE' else False data['isDingDingNotify'] = True if data.get('isDingDingNotify')\ and common.can_convert_to_str(data.get('isDingDingNotify'))\ and data.get('isDingDingNotify').upper() == 'TRUE' else False data['isEnterpriseWechatNotify'] = True if data.get('isEnterpriseWechatNotify')\ and common.can_convert_to_str(data.get('isEnterpriseWechatNotify')) \ and data.get('isEnterpriseWechatNotify').upper() == 'TRUE' else False data['dingdingAccessToken'] = data.get('dingdingAccessToken').strip() if data.get('dingdingAccessToken')\ and common.can_convert_to_str(data.get('dingdingAccessToken')) else None data['enterpriseWechatAccessToken'] = data.get('enterpriseWechatAccessToken').strip()\ if data.get('enterpriseWechatAccessToken') and common.can_convert_to_str(data.get('enterpriseWechatAccessToken')) else None try: data['alarmMailList'] = data['alarmMailList'].strip().split( ';') if data.get('alarmMailList') else [] except BaseException: raise TypeError('参数 「alarmMailList」 不合法') data["testCaseIdList"] = [] data['triggerType'] = "date" data['runDate'] = datetime.datetime.now() # 瞬间触发 filtered_data = CronTab.filter_field(data, use_set_default=True) cron = Cron( test_case_suite_id_list=filtered_data.get('testCaseSuiteIdList'), test_domain=filtered_data.get('testDomain'), alarm_mail_list=filtered_data.get('alarmMailList'), trigger_type=filtered_data.get('triggerType'), test_case_id_list=filtered_data.get('testCaseIdList'), is_execute_forbiddened_case=filtered_data.get( 'isExecuteForbiddenedCase'), run_date=filtered_data.get('runDate'), is_ding_ding_notify=filtered_data.get('isDingDingNotify'), ding_ding_access_token=filtered_data.get('dingdingAccessToken'), is_enterprise_wechat_notify=filtered_data.get( 'isEnterpriseWechatNotify'), enterprise_wechat_access_token=filtered_data.get( 'enterpriseWechatAccessToken'), is_web_hook=True) cron_manager.add_cron(cron)