mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 17:37:37 -02:30
Add schedule based socket.io events for AC-1333
This commit is contained in:
@@ -49,6 +49,11 @@ class JobEventNamespace(BaseNamespace):
|
|||||||
def recv_connect(self):
|
def recv_connect(self):
|
||||||
print("Received client connect for job event namespace from %s" % str(self.environ['REMOTE_ADDR']))
|
print("Received client connect for job event namespace from %s" % str(self.environ['REMOTE_ADDR']))
|
||||||
|
|
||||||
|
class ScheduleNamespace(BaseNamespace):
|
||||||
|
|
||||||
|
def recv_connect(self):
|
||||||
|
print("Received client connect for schedule namespace from %s" % str(self.environ['REMOTE_ADDR']))
|
||||||
|
|
||||||
class TowerSocket(object):
|
class TowerSocket(object):
|
||||||
|
|
||||||
def __call__(self, environ, start_response):
|
def __call__(self, environ, start_response):
|
||||||
@@ -57,7 +62,8 @@ class TowerSocket(object):
|
|||||||
if path.startswith('socket.io'):
|
if path.startswith('socket.io'):
|
||||||
socketio_manage(environ, {'/socket.io/test': TestNamespace,
|
socketio_manage(environ, {'/socket.io/test': TestNamespace,
|
||||||
'/socket.io/jobs': JobNamespace,
|
'/socket.io/jobs': JobNamespace,
|
||||||
'/socket.io/job_events': JobEventNamespace})
|
'/socket.io/job_events': JobEventNamespace,
|
||||||
|
'/socket.io/schedules': ScheduleNamespace})
|
||||||
else:
|
else:
|
||||||
start_response('404 Not Found', [])
|
start_response('404 Not Found', [])
|
||||||
return ['Tower version %s' % awx.__version__]
|
return ['Tower version %s' % awx.__version__]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ 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 *
|
||||||
from awx.main.utils import ignore_inventory_computed_fields
|
from awx.main.utils import ignore_inventory_computed_fields, emit_websocket_notification
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
logger = logging.getLogger('awx.main.models.schedule')
|
logger = logging.getLogger('awx.main.models.schedule')
|
||||||
@@ -105,6 +105,7 @@ class Schedule(CommonModel):
|
|||||||
self.dtend = make_aware(datetime.datetime.strptime(until_date, "%Y%m%dT%H%M%SZ"), get_default_timezone())
|
self.dtend = make_aware(datetime.datetime.strptime(until_date, "%Y%m%dT%H%M%SZ"), get_default_timezone())
|
||||||
if 'count' in self.rrule.lower():
|
if 'count' in self.rrule.lower():
|
||||||
self.dtend = future_rs[-1]
|
self.dtend = future_rs[-1]
|
||||||
|
emit_websocket_notification('/socket.io/schedules', 'schedule_change', dict(id=self.id))
|
||||||
with ignore_inventory_computed_fields():
|
with ignore_inventory_computed_fields():
|
||||||
self.unified_job_template.update_computed_fields()
|
self.unified_job_template.update_computed_fields()
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ from django.utils.timezone import now
|
|||||||
|
|
||||||
# AWX
|
# AWX
|
||||||
from awx.main.models import * # Job, JobEvent, ProjectUpdate, InventoryUpdate, Schedule, UnifiedJobTemplate
|
from awx.main.models import * # Job, JobEvent, ProjectUpdate, InventoryUpdate, Schedule, UnifiedJobTemplate
|
||||||
from awx.main.utils import get_ansible_version, decrypt_field, update_scm_url, ignore_inventory_computed_fields
|
from awx.main.utils import get_ansible_version, decrypt_field, update_scm_url, ignore_inventory_computed_fields, emit_websocket_notification
|
||||||
|
|
||||||
__all__ = ['RunJob', 'RunProjectUpdate', 'RunInventoryUpdate', 'handle_work_error', 'update_inventory_computed_fields']
|
__all__ = ['RunJob', 'RunProjectUpdate', 'RunInventoryUpdate', 'handle_work_error', 'update_inventory_computed_fields']
|
||||||
|
|
||||||
@@ -96,6 +96,7 @@ def tower_periodic_scheduler(self):
|
|||||||
new_unified_job.job_explanation = "Scheduled job could not start because it was not in the right state or required manual credentials"
|
new_unified_job.job_explanation = "Scheduled job could not start because it was not in the right state or required manual credentials"
|
||||||
new_unified_job.save(update_fields=['job_status', 'job_explanation'])
|
new_unified_job.save(update_fields=['job_status', 'job_explanation'])
|
||||||
new_unified_job.socketio_emit_status("failed")
|
new_unified_job.socketio_emit_status("failed")
|
||||||
|
emit_websocket_notification('/socket.io/schedules', 'schedule_change', dict(id=schedule.id))
|
||||||
|
|
||||||
@task()
|
@task()
|
||||||
def notify_task_runner(metadata_dict):
|
def notify_task_runner(metadata_dict):
|
||||||
|
|||||||
Reference in New Issue
Block a user