mirror of
https://github.com/ansible/awx.git
synced 2024-11-02 09:51:09 +03:00
Running scheduled items now works
This commit is contained in:
parent
b665345070
commit
c1d314ed6f
@ -2,10 +2,11 @@
|
|||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import dateutil
|
import dateutil.rrule
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.timezone import now, make_aware, get_default_timezone
|
||||||
|
|
||||||
# AWX
|
# AWX
|
||||||
from awx.main.models.base import *
|
from awx.main.models.base import *
|
||||||
@ -36,7 +37,7 @@ class Schedule(CommonModel):
|
|||||||
dtstart = models.DateTimeField(
|
dtstart = models.DateTimeField(
|
||||||
null=True,
|
null=True,
|
||||||
default=None,
|
default=None,
|
||||||
editable=True,
|
editable=False,
|
||||||
)
|
)
|
||||||
dtend = models.DateTimeField(
|
dtend = models.DateTimeField(
|
||||||
null=True,
|
null=True,
|
||||||
@ -56,5 +57,17 @@ class Schedule(CommonModel):
|
|||||||
return reverse('api:schedule_list')
|
return reverse('api:schedule_list')
|
||||||
#return reverse('api:schedule_detail', args=(self.pk,))
|
#return reverse('api:schedule_detail', args=(self.pk,))
|
||||||
|
|
||||||
|
def update_dt_elements(self):
|
||||||
|
future_rs = dateutil.rrule.rrulestr(self.rrule, forceset=True)
|
||||||
|
next_run_actual = future_rs.after(now())
|
||||||
|
|
||||||
|
self.next_run = next_run_actual
|
||||||
|
if self.dtstart is None:
|
||||||
|
self.dtstart = self.next_run
|
||||||
|
if "until" in self.rrule.lower() or 'count' in self.rrule.lower():
|
||||||
|
self.dtend = future_rs[-1]
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
self.update_dt_elements()
|
||||||
super(Schedule, self).save(*args, **kwargs)
|
super(Schedule, self).save(*args, **kwargs)
|
||||||
|
# update template next run details
|
||||||
|
@ -43,7 +43,7 @@ from django.utils.timezone import now
|
|||||||
from django.utils.tzinfo import FixedOffset
|
from django.utils.tzinfo import FixedOffset
|
||||||
|
|
||||||
# AWX
|
# AWX
|
||||||
from awx.main.models import Job, JobEvent, ProjectUpdate, InventoryUpdate, Schedule
|
from awx.main.models import * # Job, JobEvent, ProjectUpdate, InventoryUpdate, Schedule, UnifiedJobTemplate
|
||||||
from awx.main.utils import get_ansible_version, decrypt_field, update_scm_url
|
from awx.main.utils import get_ansible_version, decrypt_field, update_scm_url
|
||||||
|
|
||||||
__all__ = ['RunJob', 'RunProjectUpdate', 'RunInventoryUpdate', 'handle_work_error']
|
__all__ = ['RunJob', 'RunProjectUpdate', 'RunInventoryUpdate', 'handle_work_error']
|
||||||
@ -55,15 +55,32 @@ logger = logging.getLogger('awx.main.tasks')
|
|||||||
@task(bind=True)
|
@task(bind=True)
|
||||||
def tower_periodic_scheduler(self):
|
def tower_periodic_scheduler(self):
|
||||||
run_now = now()
|
run_now = now()
|
||||||
|
|
||||||
periodic_task = PeriodicTask.objects.get(task='awx.main.tasks.tower_periodic_scheduler')
|
periodic_task = PeriodicTask.objects.get(task='awx.main.tasks.tower_periodic_scheduler')
|
||||||
print("Last run was: " + str(periodic_task.last_run_at))
|
logger.debug("Last run was: " + str(periodic_task.last_run_at))
|
||||||
|
# TODO: Cleanup jobs that we missed
|
||||||
|
jobs_matching_schedules = Schedule.objects.filter(enabled=True,
|
||||||
|
next_run__gt=periodic_task.last_run_at, next_run__lte=run_now)
|
||||||
|
for match in jobs_matching_schedules:
|
||||||
|
template = match.unified_job_template
|
||||||
|
match.save()
|
||||||
|
if type(template) == Project:
|
||||||
|
new_project_update = template.create_project_update(launch_type="scheduled")
|
||||||
|
new_project_update.signal_start(schedule=match)
|
||||||
|
elif type(template) == InventorySource:
|
||||||
|
new_inventory_update = template.create_inventory_update(launch_type="scheduled")
|
||||||
|
new_inventory_update.signal_start(schedule=match)
|
||||||
|
elif type(template) == JobTemplate:
|
||||||
|
new_job = template.create_job()
|
||||||
|
new_job.launch_type = "scheduled"
|
||||||
|
new_job.save()
|
||||||
|
new_job.signal_start(schedule=match)
|
||||||
|
else:
|
||||||
|
logger.error("Unknown task type: " + str(type(template)))
|
||||||
periodic_task.last_run_at = run_now
|
periodic_task.last_run_at = run_now
|
||||||
periodic_task.save()
|
periodic_task.save()
|
||||||
|
|
||||||
@task()
|
@task()
|
||||||
def notify_task_runner(metadata_dict):
|
def notify_task_runner(metadata_dict):
|
||||||
time.sleep(1)
|
|
||||||
signal_context = zmq.Context()
|
signal_context = zmq.Context()
|
||||||
signal_socket = signal_context.socket(zmq.PUSH)
|
signal_socket = signal_context.socket(zmq.PUSH)
|
||||||
signal_socket.connect(settings.TASK_COMMAND_PORT)
|
signal_socket.connect(settings.TASK_COMMAND_PORT)
|
||||||
|
Loading…
Reference in New Issue
Block a user