add job event replay awx-manage command

* awx-manage replay_job_event --job_id <id>
This commit is contained in:
Chris Meyers 2017-10-11 19:04:21 -04:00
parent d02221702f
commit e19a57c50a
3 changed files with 96 additions and 12 deletions

View File

@ -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()

View File

@ -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)

View File

@ -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)