From e19a57c50aeedb7b3de4ed873fa46bd2cc37f441 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Wed, 11 Oct 2017 19:04:21 -0400 Subject: [PATCH] add job event replay awx-manage command * awx-manage replay_job_event --job_id --- awx/api/serializers.py | 40 ++++++++++++++ .../management/commands/replay_job_events.py | 54 +++++++++++++++++++ awx/main/signals.py | 14 +---- 3 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 awx/main/management/commands/replay_job_events.py diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 873f822171..5ac87cfee2 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -3138,6 +3138,26 @@ class JobEventSerializer(BaseSerializer): return ret +class JobEventWebSocketSerializer(JobEventSerializer): + created = serializers.SerializerMethodField() + modified = serializers.SerializerMethodField() + event_name = serializers.CharField(source='event') + group_name = serializers.SerializerMethodField() + + class Meta: + model = JobEvent + fields = ('*', 'event_name', 'group_name',) + + def get_created(self, obj): + return obj.created.isoformat() + + def get_modified(self, obj): + return obj.modified.isoformat() + + def get_group_name(self, obj): + return 'job_events' + + class AdHocCommandEventSerializer(BaseSerializer): event_display = serializers.CharField(source='get_event_display', read_only=True) @@ -3177,6 +3197,26 @@ class AdHocCommandEventSerializer(BaseSerializer): return ret +class AdHocCommandEventWebSocketSerializer(AdHocCommandEventSerializer): + created = serializers.SerializerMethodField() + modified = serializers.SerializerMethodField() + event_name = serializers.CharField(source='event') + group_name = serializers.SerializerMethodField() + + class Meta: + model = AdHocCommandEvent + fields = ('*', 'event_name', 'group_name',) + + def get_created(self, obj): + return obj.created.isoformat() + + def get_modified(self, obj): + return obj.modified.isoformat() + + def get_group_name(self, obj): + return 'ad_hoc_command_events' + + class JobLaunchSerializer(BaseSerializer): passwords_needed_to_start = serializers.ReadOnlyField() diff --git a/awx/main/management/commands/replay_job_events.py b/awx/main/management/commands/replay_job_events.py new file mode 100644 index 0000000000..9a2d1e3096 --- /dev/null +++ b/awx/main/management/commands/replay_job_events.py @@ -0,0 +1,54 @@ +# Copyright (c) 2015 Ansible, Inc. +# All Rights Reserved + +import sys +from optparse import make_option + +from django.core.management.base import NoArgsCommand + +from awx.main.models import ( + UnifiedJob, + Job, + AdHocCommand, +) +from awx.main.consumers import emit_channel_notification +from awx.api.serializers import ( + JobEventWebSocketSerializer, + AdHocCommandEventWebSocketSerializer, +) + + +class Command(NoArgsCommand): + + help = 'Replay job events over websockets' + + option_list = NoArgsCommand.option_list + ( + make_option('--job_id', dest='job_id', type='int', metavar='j', + help='Id of the job to replay (job or adhoc)'), + ) + + def replay_job_events(self, job_id): + try: + unified_job = UnifiedJob.objects.get(id=job_id) + except UnifiedJob.DoesNotExist: + print("UnifiedJob {} not found.".format(job_id)) + sys.exit(1) + + job = unified_job.get_real_instance() + job_events = job.job_events.order_by('created') + serializer = None + if type(job) is Job: + serializer = JobEventWebSocketSerializer + elif type(job) is AdHocCommand: + serializer = AdHocCommandEventWebSocketSerializer + else: + print("Job is of type {} and replay is not yet supported.".format(type(job))) + sys.exit(1) + + for je in job_events: + je_serialized = serializer(je).data + emit_channel_notification('{}-{}'.format(je_serialized['group_name'], job.id), je_serialized) + + def handle_noargs(self, **options): + self.job_id = options.get('job_id') + self.replay_job_events(self.job_id) diff --git a/awx/main/signals.py b/awx/main/signals.py index 77fd91a5c3..efda19f0cd 100644 --- a/awx/main/signals.py +++ b/awx/main/signals.py @@ -45,12 +45,7 @@ def emit_job_event_detail(sender, **kwargs): instance = kwargs['instance'] created = kwargs['created'] if created: - event_serialized = JobEventSerializer(instance).data - event_serialized['id'] = instance.id - event_serialized["created"] = event_serialized["created"].isoformat() - event_serialized["modified"] = event_serialized["modified"].isoformat() - event_serialized["event_name"] = instance.event - event_serialized["group_name"] = "job_events" + event_serialized = JobEventWebSocketSerializer(instance).data emit_channel_notification('job_events-' + str(instance.job.id), event_serialized) @@ -58,12 +53,7 @@ def emit_ad_hoc_command_event_detail(sender, **kwargs): instance = kwargs['instance'] created = kwargs['created'] if created: - event_serialized = AdHocCommandEventSerializer(instance).data - event_serialized['id'] = instance.id - event_serialized["created"] = event_serialized["created"].isoformat() - event_serialized["modified"] = event_serialized["modified"].isoformat() - event_serialized["event_name"] = instance.event - event_serialized["group_name"] = "ad_hoc_command_events" + event_serialized = AdHocCommandEventWebSocketSerializer(instance).data emit_channel_notification('ad_hoc_command_events-' + str(instance.ad_hoc_command_id), event_serialized)