diff --git a/awx/lib/tower_display_callback/events.py b/awx/lib/tower_display_callback/events.py index c17cf2c7f1..f46d5ae96f 100644 --- a/awx/lib/tower_display_callback/events.py +++ b/awx/lib/tower_display_callback/events.py @@ -178,7 +178,7 @@ class EventContext(object): event_data['res'] = {} event_dict = dict(event=event, event_data=event_data) for key in event_data.keys(): - if key in ('job_id', 'ad_hoc_command_id', 'uuid', 'parent_uuid', 'created', 'artifact_data'): + if key in ('job_id', 'ad_hoc_command_id', 'uuid', 'parent_uuid', 'created',): event_dict[key] = event_data.pop(key) elif key in ('verbosity', 'pid'): event_dict[key] = event_data[key] diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index 59faa7ac79..480527a651 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -111,10 +111,6 @@ class BaseCallbackModule(CallbackBase): if 'res' in event_data: event_data['res'] = self.censor_result(copy.copy(event_data['res'])) - res = event_data.get('res', None) - if res and isinstance(res, dict): - if 'artifact_data' in res: - event_data['artifact_data'] = res['artifact_data'] if event not in self.EVENTS_WITHOUT_TASK: task = event_data.pop('task', None) @@ -319,6 +315,9 @@ class BaseCallbackModule(CallbackBase): with self.capture_event_data('playbook_on_notify', **event_data): super(BaseCallbackModule, self).v2_playbook_on_notify(result, handler) + ''' + ansible_stats is, retoractively, added in 2.2 + ''' def v2_playbook_on_stats(self, stats): self.clear_play() # FIXME: Add count of plays/tasks. @@ -329,7 +328,9 @@ class BaseCallbackModule(CallbackBase): ok=stats.ok, processed=stats.processed, skipped=stats.skipped, + artifact_data=stats.custom.get('_run', {}) ) + with self.capture_event_data('playbook_on_stats', **event_data): super(BaseCallbackModule, self).v2_playbook_on_stats(stats) diff --git a/awx/main/models/jobs.py b/awx/main/models/jobs.py index 8a6b9fc91d..417a4579b8 100644 --- a/awx/main/models/jobs.py +++ b/awx/main/models/jobs.py @@ -1175,7 +1175,6 @@ class JobEvent(CreatedModifiedModel): # Save UUID and parent UUID for determining parent-child relationship. job_event_uuid = kwargs.get('uuid', None) parent_event_uuid = kwargs.get('parent_uuid', None) - artifact_dict = kwargs.get('artifact_data', None) # Sanity check: Don't honor keys that we don't recognize. valid_keys = {'job_id', 'event', 'event_data', 'playbook', 'play', @@ -1185,6 +1184,11 @@ class JobEvent(CreatedModifiedModel): if key not in valid_keys: kwargs.pop(key) + event_data = kwargs.get('event_data', None) + artifact_dict = None + if event_data: + artifact_dict = event_data.pop('artifact_data', None) + # Try to find a parent event based on UUID. if parent_event_uuid: cache_key = '{}_{}'.format(kwargs['job_id'], parent_event_uuid) @@ -1208,12 +1212,21 @@ class JobEvent(CreatedModifiedModel): # Save artifact data to parent job (if provided). if artifact_dict: - event_data = kwargs.get('event_data', None) if event_data and isinstance(event_data, dict): - res = event_data.get('res', None) - if res and isinstance(res, dict): - if res.get('_ansible_no_log', False): - artifact_dict['_ansible_no_log'] = True + # Note: Core has not added support for marking artifacts as + # sensitive yet. Going forward, core will not use + # _ansible_no_log to denote sensitive set_stats calls. + # Instead, they plan to add a flag outside of the traditional + # no_log mechanism. no_log will not work for this feature, + # in core, because sensitive data is scrubbed before sending + # data to the callback. The playbook_on_stats is the callback + # in which the set_stats data is used. + + # Again, the sensitive artifact feature has not yet landed in + # core. The below is how we mark artifacts payload as + # senstive + # artifact_dict['_ansible_no_log'] = True + # parent_job = Job.objects.filter(pk=kwargs['job_id']).first() if parent_job and parent_job.artifacts != artifact_dict: parent_job.artifacts = artifact_dict