2017-03-15 16:43:43 +00:00
|
|
|
# ~*~ coding: utf-8 ~*~
|
2017-12-22 13:42:12 +00:00
|
|
|
import json
|
|
|
|
from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
|
2017-03-15 16:43:43 +00:00
|
|
|
|
|
|
|
|
2017-12-22 13:42:12 +00:00
|
|
|
from common.utils import get_logger, get_object_or_none
|
|
|
|
from .models import Task, AdHoc
|
2017-03-15 16:43:43 +00:00
|
|
|
|
|
|
|
logger = get_logger(__file__)
|
2017-12-06 10:31:51 +00:00
|
|
|
|
2017-12-07 05:01:33 +00:00
|
|
|
|
2017-12-22 13:42:12 +00:00
|
|
|
def get_task_by_id(task_id):
|
|
|
|
return get_object_or_none(Task, id=task_id)
|
2017-12-10 16:29:25 +00:00
|
|
|
|
|
|
|
|
2017-12-22 13:42:12 +00:00
|
|
|
def create_or_update_ansible_task(
|
2017-12-15 07:50:15 +00:00
|
|
|
task_name, hosts, tasks, pattern='all', options=None,
|
|
|
|
run_as_admin=False, run_as="", become_info=None,
|
2017-12-22 13:42:12 +00:00
|
|
|
created_by=None, interval=None, crontab=None,
|
|
|
|
is_periodic=False, callback=None,
|
2017-12-15 07:50:15 +00:00
|
|
|
):
|
2017-12-22 13:42:12 +00:00
|
|
|
|
2017-12-15 07:50:15 +00:00
|
|
|
task = get_object_or_none(Task, name=task_name)
|
2017-12-22 13:42:12 +00:00
|
|
|
|
2017-12-15 07:50:15 +00:00
|
|
|
if task is None:
|
2017-12-22 13:42:12 +00:00
|
|
|
task = Task(
|
|
|
|
name=task_name, interval=interval,
|
|
|
|
crontab=crontab, is_periodic=is_periodic,
|
|
|
|
callback=callback, created_by=created_by
|
|
|
|
)
|
2017-12-15 07:50:15 +00:00
|
|
|
task.save()
|
|
|
|
|
2017-12-22 13:42:12 +00:00
|
|
|
adhoc = task.latest_adhoc
|
2017-12-15 07:50:15 +00:00
|
|
|
new_adhoc = AdHoc(task=task, pattern=pattern,
|
|
|
|
run_as_admin=run_as_admin,
|
|
|
|
run_as=run_as)
|
|
|
|
new_adhoc.hosts = hosts
|
|
|
|
new_adhoc.tasks = tasks
|
|
|
|
new_adhoc.options = options
|
|
|
|
new_adhoc.become = become_info
|
|
|
|
if not adhoc or adhoc != new_adhoc:
|
|
|
|
new_adhoc.save()
|
|
|
|
task.latest_adhoc = new_adhoc
|
2017-12-10 16:29:25 +00:00
|
|
|
return task
|
|
|
|
|
|
|
|
|
2017-12-22 13:42:12 +00:00
|
|
|
def create_or_update_celery_periodic_tasks(tasks):
|
|
|
|
"""
|
|
|
|
:param tasks: {
|
|
|
|
'add-every-monday-morning': {
|
|
|
|
'task': 'tasks.add' # A registered celery task,
|
|
|
|
'interval': 30,
|
|
|
|
'crontab': "30 7 * * *",
|
|
|
|
'args': (16, 16),
|
|
|
|
'kwargs': {},
|
|
|
|
'enabled': False,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
# Todo: check task valid, task and callback must be a celery task
|
2017-12-21 18:08:29 +00:00
|
|
|
for name, detail in tasks.items():
|
2017-12-22 13:42:12 +00:00
|
|
|
interval = None
|
|
|
|
crontab = None
|
|
|
|
if isinstance(detail.get("interval"), int):
|
|
|
|
interval, _ = IntervalSchedule.objects.get_or_create(
|
|
|
|
every=detail['interval'],
|
|
|
|
period=IntervalSchedule.SECONDS,
|
|
|
|
)
|
|
|
|
elif isinstance(detail.get("crontab"), str):
|
|
|
|
try:
|
|
|
|
minute, hour, day, month, week = detail["crontab"].split()
|
|
|
|
except ValueError:
|
|
|
|
raise SyntaxError("crontab is not valid")
|
|
|
|
|
|
|
|
crontab, _ = CrontabSchedule.objects.get_or_create(
|
|
|
|
minute=minute, hour=hour, day_of_week=week,
|
|
|
|
day_of_month=day, month_of_year=month,
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
raise SyntaxError("Schedule is not valid")
|
|
|
|
|
|
|
|
defaults = dict(
|
|
|
|
interval=interval,
|
|
|
|
crontab=crontab,
|
2017-12-21 18:08:29 +00:00
|
|
|
name=name,
|
|
|
|
task=detail['task'],
|
|
|
|
args=json.dumps(detail.get('args', [])),
|
|
|
|
kwargs=json.dumps(detail.get('kwargs', {})),
|
2017-12-22 13:42:12 +00:00
|
|
|
enabled=detail['enabled']
|
|
|
|
)
|
|
|
|
|
|
|
|
task = PeriodicTask.objects.update_or_create(
|
|
|
|
defaults=defaults, name=name,
|
2017-12-21 18:08:29 +00:00
|
|
|
)
|
2017-12-22 13:42:12 +00:00
|
|
|
logger.info("Create periodic task: {}".format(task))
|
|
|
|
return task
|
|
|
|
|
|
|
|
|
|
|
|
def disable_celery_periodic_task(task_name):
|
|
|
|
PeriodicTask.objects.filter(name=task_name).update(enabled=False)
|
|
|
|
|
|
|
|
|
|
|
|
def delete_celery_periodic_task(task_name):
|
|
|
|
PeriodicTask.objects.filter(name=task_name).delete()
|
|
|
|
|
2017-12-10 16:29:25 +00:00
|
|
|
|