From 232c4f23912a9d69dd41498f8ff64a9c26809d2c Mon Sep 17 00:00:00 2001 From: Chris Church Date: Mon, 17 Jun 2013 12:28:21 -0400 Subject: [PATCH] Added job event parent/child fields, update event display to show hierarchy levels. --- ansibleworks/main/models/__init__.py | 5 ++++ ansibleworks/main/serializers.py | 15 +++++++++--- ansibleworks/main/tasks.py | 2 +- ansibleworks/main/urls.py | 2 ++ ansibleworks/main/views.py | 34 ++++++++++++++++++++++++++-- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/ansibleworks/main/models/__init__.py b/ansibleworks/main/models/__init__.py index b38c85556c..ee2628c306 100644 --- a/ansibleworks/main/models/__init__.py +++ b/ansibleworks/main/models/__init__.py @@ -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']) diff --git a/ansibleworks/main/serializers.py b/ansibleworks/main/serializers.py index 19589e3e81..bcf49ea945 100644 --- a/ansibleworks/main/serializers.py +++ b/ansibleworks/main/serializers.py @@ -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 diff --git a/ansibleworks/main/tasks.py b/ansibleworks/main/tasks.py index 5e9841c09a..83241b60a8 100644 --- a/ansibleworks/main/tasks.py +++ b/ansibleworks/main/tasks.py @@ -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) diff --git a/ansibleworks/main/urls.py b/ansibleworks/main/urls.py index a752ac4d4a..88bc17b9e6 100644 --- a/ansibleworks/main/urls.py +++ b/ansibleworks/main/urls.py @@ -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[0-9]+)/$', 'job_event_detail'), + url(r'^(?P[0-9]+)/children/$', 'job_event_children_list'), + url(r'^(?P[0-9]+)/hosts/$', 'job_event_hosts_list'), ) v1_urls = patterns('ansibleworks.main.views', diff --git a/ansibleworks/main/views.py b/ansibleworks/main/views.py index 61078eeb2f..e715996e1f 100644 --- a/ansibleworks/main/views.py +++ b/ansibleworks/main/views.py @@ -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):