Added job event parent/child fields, update event display to show hierarchy levels.

This commit is contained in:
Chris Church 2013-06-17 12:28:21 -04:00
parent c979817593
commit 232c4f2391
5 changed files with 52 additions and 6 deletions

View File

@ -1032,6 +1032,10 @@ class JobEvent(models.Model):
def event_level(self):
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):
parent_events = set()
if self.event in ('playbook_on_play_start', 'playbook_on_stats',
@ -1061,6 +1065,7 @@ class JobEvent(models.Model):
def save(self, *args, **kwargs):
self.failed = bool(self.event in self.FAILED_EVENTS)
# FIXME: Propagage failed flag to parent events.
try:
if not self.host and self.event_data.get('host', ''):
self.host = self.job.inventory.hosts.get(name=self.event_data['host'])

View File

@ -302,7 +302,7 @@ class JobTemplateSerializer(BaseSerializer):
model = JobTemplate
fields = BASE_FIELDS + ('job_type', 'inventory', 'project', 'playbook',
'credential', 'forks', 'limit', 'verbosity',
'extra_vars', 'job_tags')
'extra_vars', 'job_tags', 'host_config_key')
def get_related(self, obj):
res = super(JobTemplateSerializer, self).get_related(obj)
@ -393,18 +393,27 @@ class JobHostSummarySerializer(BaseSerializer):
class JobEventSerializer(BaseSerializer):
event_display = serializers.Field(source='get_event_display')
event_display = serializers.Field(source='get_event_display2')
class Meta:
model = JobEvent
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):
res = super(JobEventSerializer, self).get_related(obj)
res.update(dict(
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:
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

View File

@ -192,7 +192,7 @@ class RunJob(Task):
cwd = job.project.get_project_path()
if not cwd:
raise RuntimeError('project local_path %s cannot be found' %
project.local_path)
job.project.local_path)
env = self.build_env(job, **kwargs)
job = self.update_job(job_pk, job_args=args, job_cwd=cwd,
job_env=env)

View File

@ -108,6 +108,8 @@ job_host_summary_urls = patterns('ansibleworks.main.views',
job_event_urls = patterns('ansibleworks.main.views',
url(r'^$', 'job_event_list'),
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',

View File

@ -1125,7 +1125,7 @@ class JobEventList(BaseList):
permission_classes = (CustomRbac,)
def get_queryset(self):
return self.model.objects.all() # FIXME
return self.model.objects.distinct() # FIXME: Permissions?
class JobEventDetail(generics.RetrieveAPIView):
@ -1133,6 +1133,36 @@ class JobEventDetail(generics.RetrieveAPIView):
serializer_class = JobEventSerializer
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):
model = JobEvent
@ -1144,7 +1174,7 @@ class BaseJobEventsList(generics.ListAPIView):
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)
return getattr(parent_obj, self.relationship).distinct()
class HostJobEventsList(BaseJobEventsList):