增加定时任务
addTask(){
let self = this;
this.$refs.form.validate((valid) => {if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
console.log(self.form);
self.editLoading = true;
let param = {
project_id: Number(self.$route.params.project_id),
Host_id: Number(self.form.Host),
name: self.form.name,
type: self.form.type,
frequency: Number(self.form.frequency),
unit: self.form.unit,
};
if (self.form.type === 'circulation') {
param['startTime'] = moment(self.form.timeArray[0]).format("YYYY-MM-DD HH:mm:ss");
param['endTime'] = moment(self.form.timeArray[1]).format("YYYY-MM-DD HH:mm:ss")
} else {
param['startTime'] = moment(self.form.time).format("YYYY-MM-DD HH:mm:ss");
param['endTime'] = moment(self.form.time).format("YYYY-MM-DD HH:mm:ss")
}
$.ajax({
type: "post",
url: test+"/api/automation/add_time_task",
async: true,
data: JSON.stringify(param),
headers: {
"Content-Type": "application/json",
Authorization: 'Token '+JSON.parse(sessionStorage.getItem('token'))
},
timeout: 5000,
success: (data) => {
if (data.code === '999999') {
self.editLoading = false;
self.taskVShow = false;
self.$message({
message: '添加成功',
center: true,
type: "success",
})
}
else {
self.editLoading = false;
self.$message.error({
message: data.msg,
center: true,
})
}
},
error: function () {
self.editLoading = false;
self.$message.error({
message: "失败",
center: true,
})
}
})
}
)}
})
},
-------------------------------------------------------------------------
class AddTimeTask(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = ()
def parameter_check(self, data):
"""
校验参数
:param data:
:return:
"""
try:
# 校验project_id, id类型为int
if not data["project_id"] or not data["name"] or not data["type"] or \
not data["Host_id"] or not data["startTime"] or not data["endTime"]:
return JsonResponse(code="999996", msg="参数有误!")
if not isinstance(data["project_id"], int) or not isinstance(data["Host_id"], int):
return JsonResponse(code="999996", msg="参数有误!")
if data["type"] not in ["circulation", "timing"]:
return JsonResponse(code="999996", msg="参数有误!")
try:
start_time = datetime.strptime(data["startTime"], "%Y-%m-%d %H:%M:%S")
end_time = datetime.strptime(data["endTime"], "%Y-%m-%d %H:%M:%S")
if start_time > end_time:
return JsonResponse(code="999996", msg="参数有误!")
except ValueError:
return JsonResponse(code="999996", msg="参数有误!")
except KeyError:
return JsonResponse(code="999996", msg="参数有误!")
def post(self, request):
"""
添加测试任务
:param request:
:return:
"""
sys_name = platform.system()
if sys_name == "Windows" or sys_name == "Darwin":
return JsonResponse(code="999998", msg="该操作只能在Linux系统下进行!")
data = JSONParser().parse(request)
result = self.parameter_check(data)
if result:
return result
try:
pro_id = Project.objects.get(id=data["project_id"])
if not request.user.is_superuser and pro_id.user.is_superuser:
return JsonResponse(code="999983", msg="无操作权限!")
except ObjectDoesNotExist:
return JsonResponse(code="999995", msg="项目不存在!")
pro_data = ProjectSerializer(pro_id)
start_time = data["startTime"]
end_time = data["endTime"]
if not pro_data.data["status"]:
return JsonResponse(code="999985", msg="该项目已禁用")
data["startTime"] = datetime.strptime(data["startTime"], "%Y-%m-%d %H:%M:%S")
data["endTime"] = datetime.strptime(data["endTime"], "%Y-%m-%d %H:%M:%S")
try:
host_data = GlobalHost.objects.get(id=data["Host_id"], project=data["project_id"])
except ObjectDoesNotExist:
return JsonResponse(code="999992", msg="host不存在!")
if data["type"] == "circulation":
if not data["frequency"]:
return JsonResponse(code="999996", msg="参数有误!")
if not isinstance(data["frequency"], int):
return JsonResponse(code="999996", msg="参数有误!")
if data["unit"] not in ["m", "h", "d", "w"]:
return JsonResponse(code="999996", msg="参数有误!")
task_name = AutomationTestTask.objects.filter(name=data["name"]).exclude(project=data["project_id"])
if len(task_name):
return JsonResponse(code="999997", msg="存在相同名称!")
else:
try:
rt = AutomationTestTask.objects.get(project=data["project_id"])
serialize = AutomationTestTaskDeserializer(data=data)
if serialize.is_valid():
serialize.update(instance=rt, validated_data=data)
task_id = serialize.data.get("id")
else:
return JsonResponse(code="999996", msg="参数有误!")
except ObjectDoesNotExist:
serialize = AutomationTestTaskDeserializer(data=data)
if serialize.is_valid():
serialize.save(project=pro_id, Host=host_data)
task_id = serialize.data.get("id")
else:
return JsonResponse(code="999996", msg="参数有误!")
record_dynamic(project=data["project_id"],
_type="新增", operationObject="任务",
user=request.user.pk, data="新增循环任务\"%s\"" % data["name"])
add(host_id=data["Host_id"], _type=data["type"], project=str(data["project_id"]),
start_time=start_time, end_time=end_time, frequency=data["frequency"], unit=data["unit"])
else:
task_name = AutomationTestTask.objects.filter(name=data["name"]).exclude(project=data["project_id"])
if len(task_name):
return JsonResponse(code="999997", msg="存在相同名称!")
else:
try:
rt = AutomationTestTask.objects.get(project=data["project_id"])
serialize = AutomationTestTaskDeserializer(data=data)
if serialize.is_valid():
serialize.update(instance=rt, validated_data=data)
task_id = serialize.data.get("id")
else:
return JsonResponse(code="999996", msg="参数有误!")
except ObjectDoesNotExist:
serialize = AutomationTestTaskDeserializer(data=data)
if serialize.is_valid():
serialize.save(project=pro_id, Host=host_data)
task_id = serialize.data.get("id")
else:
return JsonResponse(code="999996", msg="参数有误!")
record_dynamic(project=data["project_id"],
_type="新增", operationObject="任务",
user=request.user.pk, data="新增定时任务\"%s\"" % data["name"])
add(host_id=data["Host_id"], _type=data["type"], project=str(data["project_id"]),
start_time=start_time, end_time=end_time)
return JsonResponse(data={"task_id": task_id}, code="999999", msg="成功!")
------------------------------
import re
from crontab import CronTab
def add(host_id, _type, start_time, end_time, project, frequency=None, unit=None):
"""
添加测试任务到crontab
:param host_id: 测试域名
:param _type: 执行类型
:param start_time: 执行时间
:param end_time: 结束时间
:param frequency: 时间间隔
:param unit: 时间单位
:param project: 项目ID
:return:
"""
start_time = re.split('-|:| ', start_time)
end_time = re.split('-|:| ', end_time)
print(start_time)
print(end_time)
# 创建当前用户的crontab,当然也可以创建其他用户的,但得有足够权限
my_user_cron = CronTab(user=True)
my_user_cron.remove_all(comment=project)
my_user_cron.remove_all(comment=project+"_开始")
my_user_cron.remove_all(comment=project+"_结束")
# for j in my_user_cron.crons:
if _type == 'timing':
_time = '%s %s %s %s *' % (
start_time[4],
start_time[3],
start_time[2],
start_time[1],
)
print(_time)
# job = my_user_cron.new(command='/usr/local/python3/bin/python3 /var/lib/jenkins/workspace/'
# 'api_automation_test_master-JU72M6SAEYKDY6SN3LUUPLXPTX3F35MVFZ5'
# '7J4JE3I5TJCTRFXHQ/api_test/common/auto_start.py %s %s >> /var/lib/task/%s.log'
# % (host_id, project, project))
job = my_user_cron.new(command='python3 /Users/liuhongyuan/PycharmProjects/api_automation_test/api_test/common/auto_start.py %s %s >> /Users/liuhongyuan/PycharmProjects/api_automation_test/api_test/common/%s.log'
% (host_id, project, project))
else:
_time = '%s %s %s %s *' % (
start_time[4],
start_time[3],
start_time[2],
start_time[1],
)
print(_time)
# 创建任务
# job = my_user_cron.new(command='/usr/local/python3/bin/python3 /var/lib/jenkins/workspace/'
# 'api_automation_test_master-JU72M6SAEYKDY6SN3LUUPLXPTX3F35MVFZ5'
# '7J4JE3I5TJCTRFXHQ/api_test/common/auto_start.py %s %s %s %s %s %s %s %s >> '
# '/var/lib/task/%s.log'
# % (frequency, unit, host_id, end_time[4], end_time[3],
# end_time[2], end_time[1], project, project))
job = my_user_cron.new(command='python3 /Users/liuhongyuan/PycharmProjects/api_automation_test/api_test/common/auto_start.py %s %s %s %s %s %s %s %s >> /Users/liuhongyuan/PycharmProjects/api_automation_test/api_test/common/%s.log'
% (frequency, unit, host_id, end_time[4], end_time[3],
end_time[2], end_time[1], project, project))
job.set_comment(project+"_开始")
# 设置任务执行周期
job.setall(_time)
# 最后将crontab写入配置文件
my_user_cron.write()
if __name__ == '__main__':
add(1,'timing1','2019-02-18 16:00:00','2019-02-19 16:00:00','1',5,'分')

浙公网安备 33010602011771号