From 6e6600b822d40cbd392ee4980285f9023e3527b7 Mon Sep 17 00:00:00 2001 From: Chris Church Date: Sat, 11 May 2013 02:10:17 -0400 Subject: [PATCH] Model and test updates for last_job and last_job_host_summary fields on Host. --- lib/main/models/__init__.py | 25 +++++++++++++++++++++++++ lib/main/serializers.py | 4 ++++ lib/main/tests/tasks.py | 9 +++++++++ 3 files changed, 38 insertions(+) diff --git a/lib/main/models/__init__.py b/lib/main/models/__init__.py index 1af2ed7ab4..0b8f9464f6 100644 --- a/lib/main/models/__init__.py +++ b/lib/main/models/__init__.py @@ -786,6 +786,21 @@ class JobHostSummary(models.Model): (self.host.name, self.changed, self.dark, self.failures, self.ok, self.processed, self.skipped) + def save(self, *args, **kwargs): + super(JobHostSummary, self).save(*args, **kwargs) + self.update_host_last_job_summary() + + def update_host_last_job_summary(self): + update_fields = [] + if self.host.last_job != self.job: + self.host.last_job = self.job + update_fields.append('last_job') + if self.host.last_job_host_summary != self: + self.host.last_job_host_summary = self + update_fields.append('last_job_host_summary') + if update_fields: + self.host.save(update_fields=update_fields) + class JobEvent(models.Model): ''' An event/message logged from the callback when running a job. @@ -866,6 +881,16 @@ class JobEvent(models.Model): self.failed = bool(self.event in self.FAILED_EVENTS) super(JobEvent, self).save(*args, **kwargs) self.update_host_summary_from_stats() + self.update_host_last_job() + + def update_host_last_job(self): + if self.host: + update_fields = [] + if self.host.last_job != self.job: + self.host.last_job = self.job + update_fields.append('last_job') + if update_fields: + self.host.save(update_fields=update_fields) def update_host_summary_from_stats(self): if self.event != 'playbook_on_stats': diff --git a/lib/main/serializers.py b/lib/main/serializers.py index b1d1914a9e..6fe7291c8d 100644 --- a/lib/main/serializers.py +++ b/lib/main/serializers.py @@ -220,6 +220,10 @@ class HostSerializer(BaseSerializer): inventory = reverse('main:inventory_detail', args=(obj.inventory.pk,)), job_events = reverse('main:host_job_event_list', args=(obj.pk,)), )) + if obj.last_job: + res['last_job'] = reverse('main:job_detail', args=(obj.last_job.pk,)) + #if obj.last_job_host_summary: + # res['last_job_host_summary'] = reverse('main:job_host_summary_detail', args=(obj.last_job_host_summary.pk,)) # NICE TO HAVE: possible reverse resource to show what groups the host is in return res diff --git a/lib/main/tests/tasks.py b/lib/main/tests/tasks.py index fe74215354..f2aa6ae7b5 100644 --- a/lib/main/tests/tasks.py +++ b/lib/main/tests/tasks.py @@ -231,6 +231,9 @@ class RunJobTest(BaseCeleryTest): self.assertEqual(job_events.filter(event='playbook_on_stats').count(), 1) for job_host_summary in job.job_host_summaries.all(): unicode(job_host_summary) # For test coverage. + self.assertEqual(job_host_summary.host.last_job_host_summary, job_host_summary) + self.host = Host.objects.get(pk=self.host.pk) + self.assertEqual(self.host.last_job, job) self.assertEqual(job.successful_hosts.count(), 1) self.assertEqual(job.failed_hosts.count(), 0) self.assertEqual(job.changed_hosts.count(), 1) @@ -257,6 +260,8 @@ class RunJobTest(BaseCeleryTest): for evt in job_events.filter(event='runner_on_skipped'): self.assertEqual(evt.host, self.host) self.assertEqual(job_events.filter(event='playbook_on_stats').count(), 1) + self.host = Host.objects.get(pk=self.host.pk) + self.assertEqual(self.host.last_job, job) self.assertEqual(job.successful_hosts.count(), 0) self.assertEqual(job.failed_hosts.count(), 0) self.assertEqual(job.changed_hosts.count(), 0) @@ -282,6 +287,8 @@ class RunJobTest(BaseCeleryTest): self.assertEqual(job_events.filter(event='runner_on_failed').count(), 1) self.assertEqual(job_events.get(event='runner_on_failed').host, self.host) self.assertEqual(job_events.filter(event='playbook_on_stats').count(), 1) + self.host = Host.objects.get(pk=self.host.pk) + self.assertEqual(self.host.last_job, job) self.assertEqual(job.successful_hosts.count(), 0) self.assertEqual(job.failed_hosts.count(), 1) self.assertEqual(job.changed_hosts.count(), 0) @@ -309,6 +316,8 @@ class RunJobTest(BaseCeleryTest): self.assertEqual(job_events.filter(event='runner_on_skipped').count(), 1) self.assertEqual(job_events.get(event='runner_on_skipped').host, self.host) self.assertEqual(job_events.filter(event='playbook_on_stats').count(), 1) + self.host = Host.objects.get(pk=self.host.pk) + self.assertEqual(self.host.last_job, job) self.assertEqual(job.successful_hosts.count(), 0) self.assertEqual(job.failed_hosts.count(), 0) self.assertEqual(job.changed_hosts.count(), 0)