mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 17:37:37 -02:30
Added job event parent/child fields, update event display to show hierarchy levels.
This commit is contained in:
@@ -1032,6 +1032,10 @@ class JobEvent(models.Model):
|
|||||||
def event_level(self):
|
def event_level(self):
|
||||||
return self.LEVEL_FOR_EVENT.get(self.event, 0)
|
return self.LEVEL_FOR_EVENT.get(self.event, 0)
|
||||||
|
|
||||||
|
def get_event_display2(self):
|
||||||
|
# FIXME: Remove extra spaces once hierarchy view is in place.
|
||||||
|
return '%s%s' % (u'\u00a0\u00a0\u00a0\u00a0' * self.event_level, self.get_event_display())
|
||||||
|
|
||||||
def _find_parent(self):
|
def _find_parent(self):
|
||||||
parent_events = set()
|
parent_events = set()
|
||||||
if self.event in ('playbook_on_play_start', 'playbook_on_stats',
|
if self.event in ('playbook_on_play_start', 'playbook_on_stats',
|
||||||
@@ -1061,6 +1065,7 @@ class JobEvent(models.Model):
|
|||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
self.failed = bool(self.event in self.FAILED_EVENTS)
|
self.failed = bool(self.event in self.FAILED_EVENTS)
|
||||||
|
# FIXME: Propagage failed flag to parent events.
|
||||||
try:
|
try:
|
||||||
if not self.host and self.event_data.get('host', ''):
|
if not self.host and self.event_data.get('host', ''):
|
||||||
self.host = self.job.inventory.hosts.get(name=self.event_data['host'])
|
self.host = self.job.inventory.hosts.get(name=self.event_data['host'])
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ class JobTemplateSerializer(BaseSerializer):
|
|||||||
model = JobTemplate
|
model = JobTemplate
|
||||||
fields = BASE_FIELDS + ('job_type', 'inventory', 'project', 'playbook',
|
fields = BASE_FIELDS + ('job_type', 'inventory', 'project', 'playbook',
|
||||||
'credential', 'forks', 'limit', 'verbosity',
|
'credential', 'forks', 'limit', 'verbosity',
|
||||||
'extra_vars', 'job_tags')
|
'extra_vars', 'job_tags', 'host_config_key')
|
||||||
|
|
||||||
def get_related(self, obj):
|
def get_related(self, obj):
|
||||||
res = super(JobTemplateSerializer, self).get_related(obj)
|
res = super(JobTemplateSerializer, self).get_related(obj)
|
||||||
@@ -393,18 +393,27 @@ class JobHostSummarySerializer(BaseSerializer):
|
|||||||
|
|
||||||
class JobEventSerializer(BaseSerializer):
|
class JobEventSerializer(BaseSerializer):
|
||||||
|
|
||||||
event_display = serializers.Field(source='get_event_display')
|
event_display = serializers.Field(source='get_event_display2')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = JobEvent
|
model = JobEvent
|
||||||
fields = ('id', 'url', 'created', 'job', 'event', 'event_display',
|
fields = ('id', 'url', 'created', 'job', 'event', 'event_display',
|
||||||
'event_data', 'failed', 'host', 'related', 'summary_fields')
|
'event_data', 'failed', 'host', 'related', 'summary_fields',
|
||||||
|
'parent')
|
||||||
|
|
||||||
def get_related(self, obj):
|
def get_related(self, obj):
|
||||||
res = super(JobEventSerializer, self).get_related(obj)
|
res = super(JobEventSerializer, self).get_related(obj)
|
||||||
res.update(dict(
|
res.update(dict(
|
||||||
job = reverse('main:job_detail', args=(obj.job.pk,)),
|
job = reverse('main:job_detail', args=(obj.job.pk,)),
|
||||||
|
#children = reverse('main:job_event_children_list', args=(obj.pk,)),
|
||||||
))
|
))
|
||||||
|
if obj.parent:
|
||||||
|
res['parent'] = reverse('main:job_event_detail', args=(obj.parent.pk,))
|
||||||
|
if obj.children.count():
|
||||||
|
res['children'] = reverse('main:job_event_children_list', args=(obj.pk,))
|
||||||
if obj.host:
|
if obj.host:
|
||||||
res['host'] = reverse('main:host_detail', args=(obj.host.pk,))
|
res['host'] = reverse('main:host_detail', args=(obj.host.pk,))
|
||||||
|
if obj.hosts.count():
|
||||||
|
# FIXME: Why are hosts not set for top level playbook events.
|
||||||
|
res['hosts'] = reverse('main:job_event_hosts_list', args=(obj.pk,))
|
||||||
return res
|
return res
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ class RunJob(Task):
|
|||||||
cwd = job.project.get_project_path()
|
cwd = job.project.get_project_path()
|
||||||
if not cwd:
|
if not cwd:
|
||||||
raise RuntimeError('project local_path %s cannot be found' %
|
raise RuntimeError('project local_path %s cannot be found' %
|
||||||
project.local_path)
|
job.project.local_path)
|
||||||
env = self.build_env(job, **kwargs)
|
env = self.build_env(job, **kwargs)
|
||||||
job = self.update_job(job_pk, job_args=args, job_cwd=cwd,
|
job = self.update_job(job_pk, job_args=args, job_cwd=cwd,
|
||||||
job_env=env)
|
job_env=env)
|
||||||
|
|||||||
@@ -108,6 +108,8 @@ job_host_summary_urls = patterns('ansibleworks.main.views',
|
|||||||
job_event_urls = patterns('ansibleworks.main.views',
|
job_event_urls = patterns('ansibleworks.main.views',
|
||||||
url(r'^$', 'job_event_list'),
|
url(r'^$', 'job_event_list'),
|
||||||
url(r'^(?P<pk>[0-9]+)/$', 'job_event_detail'),
|
url(r'^(?P<pk>[0-9]+)/$', 'job_event_detail'),
|
||||||
|
url(r'^(?P<pk>[0-9]+)/children/$', 'job_event_children_list'),
|
||||||
|
url(r'^(?P<pk>[0-9]+)/hosts/$', 'job_event_hosts_list'),
|
||||||
)
|
)
|
||||||
|
|
||||||
v1_urls = patterns('ansibleworks.main.views',
|
v1_urls = patterns('ansibleworks.main.views',
|
||||||
|
|||||||
@@ -1125,7 +1125,7 @@ class JobEventList(BaseList):
|
|||||||
permission_classes = (CustomRbac,)
|
permission_classes = (CustomRbac,)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return self.model.objects.all() # FIXME
|
return self.model.objects.distinct() # FIXME: Permissions?
|
||||||
|
|
||||||
class JobEventDetail(generics.RetrieveAPIView):
|
class JobEventDetail(generics.RetrieveAPIView):
|
||||||
|
|
||||||
@@ -1133,6 +1133,36 @@ class JobEventDetail(generics.RetrieveAPIView):
|
|||||||
serializer_class = JobEventSerializer
|
serializer_class = JobEventSerializer
|
||||||
permission_classes = (CustomRbac,)
|
permission_classes = (CustomRbac,)
|
||||||
|
|
||||||
|
class JobEventChildrenList(generics.ListAPIView):
|
||||||
|
|
||||||
|
model = JobEvent
|
||||||
|
serializer_class = JobEventSerializer
|
||||||
|
permission_classes = (CustomRbac,)
|
||||||
|
parent_model = JobEvent
|
||||||
|
relationship = 'children'
|
||||||
|
|
||||||
|
view_name = 'Job Event Children List'
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
# FIXME: Verify read permission on the parent object and job.
|
||||||
|
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
|
||||||
|
return getattr(parent_obj, self.relationship)
|
||||||
|
|
||||||
|
class JobEventHostsList(generics.ListAPIView):
|
||||||
|
|
||||||
|
model = Host
|
||||||
|
serializer_class = HostSerializer
|
||||||
|
permission_classes = (CustomRbac,)
|
||||||
|
parent_model = JobEvent
|
||||||
|
relationship = 'hosts'
|
||||||
|
|
||||||
|
view_name = 'Job Event Hosts List'
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
# FIXME: Verify read permission on the parent object and job.
|
||||||
|
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
|
||||||
|
return getattr(parent_obj, self.relationship)
|
||||||
|
|
||||||
class BaseJobEventsList(generics.ListAPIView):
|
class BaseJobEventsList(generics.ListAPIView):
|
||||||
|
|
||||||
model = JobEvent
|
model = JobEvent
|
||||||
@@ -1144,7 +1174,7 @@ class BaseJobEventsList(generics.ListAPIView):
|
|||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
# FIXME: Verify read permission on the parent object and job.
|
# FIXME: Verify read permission on the parent object and job.
|
||||||
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
|
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
|
||||||
return getattr(parent_obj, self.relationship)
|
return getattr(parent_obj, self.relationship).distinct()
|
||||||
|
|
||||||
class HostJobEventsList(BaseJobEventsList):
|
class HostJobEventsList(BaseJobEventsList):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user