mirror of
https://github.com/ansible/awx.git
synced 2026-02-23 05:55:59 -03:30
add job event replay awx-manage command
* awx-manage replay_job_event --job_id <id>
This commit is contained in:
@@ -3138,6 +3138,26 @@ class JobEventSerializer(BaseSerializer):
|
|||||||
return ret
|
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):
|
class AdHocCommandEventSerializer(BaseSerializer):
|
||||||
|
|
||||||
event_display = serializers.CharField(source='get_event_display', read_only=True)
|
event_display = serializers.CharField(source='get_event_display', read_only=True)
|
||||||
@@ -3177,6 +3197,26 @@ class AdHocCommandEventSerializer(BaseSerializer):
|
|||||||
return ret
|
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):
|
class JobLaunchSerializer(BaseSerializer):
|
||||||
|
|
||||||
passwords_needed_to_start = serializers.ReadOnlyField()
|
passwords_needed_to_start = serializers.ReadOnlyField()
|
||||||
|
|||||||
54
awx/main/management/commands/replay_job_events.py
Normal file
54
awx/main/management/commands/replay_job_events.py
Normal 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)
|
||||||
@@ -45,12 +45,7 @@ def emit_job_event_detail(sender, **kwargs):
|
|||||||
instance = kwargs['instance']
|
instance = kwargs['instance']
|
||||||
created = kwargs['created']
|
created = kwargs['created']
|
||||||
if created:
|
if created:
|
||||||
event_serialized = JobEventSerializer(instance).data
|
event_serialized = JobEventWebSocketSerializer(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"
|
|
||||||
emit_channel_notification('job_events-' + str(instance.job.id), event_serialized)
|
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']
|
instance = kwargs['instance']
|
||||||
created = kwargs['created']
|
created = kwargs['created']
|
||||||
if created:
|
if created:
|
||||||
event_serialized = AdHocCommandEventSerializer(instance).data
|
event_serialized = AdHocCommandEventWebSocketSerializer(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"
|
|
||||||
emit_channel_notification('ad_hoc_command_events-' + str(instance.ad_hoc_command_id), event_serialized)
|
emit_channel_notification('ad_hoc_command_events-' + str(instance.ad_hoc_command_id), event_serialized)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user