From 32ef805e23b4ee0b561c41091d3e619fae5656b5 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Tue, 3 Mar 2020 14:28:46 -0500 Subject: [PATCH] properly support job host summary data in custom notification templates see: https://github.com/ansible/tower/issues/4148 --- awx/main/models/notifications.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/awx/main/models/notifications.py b/awx/main/models/notifications.py index 71a68b2a9f..7a20ed4e19 100644 --- a/awx/main/models/notifications.py +++ b/awx/main/models/notifications.py @@ -270,7 +270,8 @@ class JobNotificationMixin(object): 'elapsed', 'job_explanation', 'execution_node', 'controller_node', 'allow_simultaneous', 'scm_revision', 'diff_mode', 'job_slice_number', 'job_slice_count', 'custom_virtualenv', 'approval_status', 'approval_node_name', 'workflow_url', - {'host_status_counts': ['skipped', 'ok', 'changed', 'failures', 'dark']}, + {'host_status_counts': ['skipped', 'ok', 'changed', 'failed', 'failures', 'dark' + 'processed', 'rescued', 'ignored']}, {'playbook_counts': ['play_count', 'task_count']}, {'summary_fields': [{'inventory': ['id', 'name', 'description', 'has_active_failures', 'total_hosts', 'hosts_with_active_failures', 'total_groups', @@ -303,7 +304,7 @@ class JobNotificationMixin(object): 'finished': False, 'force_handlers': False, 'forks': 0, - 'host_status_counts': {'skipped': 1, 'ok': 5, 'changed': 3, 'failures': 0, 'dark': 0}, + 'host_status_counts': {'skipped': 1, 'ok': 5, 'changed': 3, 'failures': 0, 'dark': 0, 'failed': False, 'processed': 0, 'rescued': 0}, 'id': 42, 'job_explanation': 'Sample job explanation', 'job_slice_count': 1, @@ -392,10 +393,20 @@ class JobNotificationMixin(object): The context will contain whitelisted content retrieved from a serialized job object (see JobNotificationMixin.JOB_FIELDS_WHITELIST), the job's friendly name, and a url to the job run.""" - context = {'job': {}, - 'job_friendly_name': self.get_notification_friendly_name(), - 'url': self.get_ui_url(), - 'job_metadata': json.dumps(self.notification_data(), indent=4)} + job_context = {'host_status_counts': {}} + summary = None + if hasattr(self, 'job_host_summaries'): + summary = self.job_host_summaries.first() + if summary: + from awx.api.serializers import JobHostSummarySerializer + summary_data = JobHostSummarySerializer(summary).to_representation(summary) + job_context['host_status_counts'] = summary_data + context = { + 'job': job_context, + 'job_friendly_name': self.get_notification_friendly_name(), + 'url': self.get_ui_url(), + 'job_metadata': json.dumps(self.notification_data(), indent=4) + } def build_context(node, fields, whitelisted_fields): for safe_field in whitelisted_fields: