From 03734015c50ae36eba87bfe1891b8ef378adc976 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Fri, 9 Dec 2016 11:15:20 -0500 Subject: [PATCH 1/3] set_stats support --- awx/lib/tower_display_callback/events.py | 5 +++++ awx/lib/tower_display_callback/module.py | 7 ++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/awx/lib/tower_display_callback/events.py b/awx/lib/tower_display_callback/events.py index c17cf2c7f1..002c753c2e 100644 --- a/awx/lib/tower_display_callback/events.py +++ b/awx/lib/tower_display_callback/events.py @@ -180,6 +180,11 @@ class EventContext(object): for key in event_data.keys(): if key in ('job_id', 'ad_hoc_command_id', 'uuid', 'parent_uuid', 'created', 'artifact_data'): event_dict[key] = event_data.pop(key) + if key == 'artifact_data': + if '_run' in event_dict[key]: + event_dict[key] = event_dict[key]['_run'] + else: + event_dict[key] = {} elif key in ('verbosity', 'pid'): event_dict[key] = event_data[key] return event_dict diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index 59faa7ac79..cf266694f4 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -110,11 +110,7 @@ class BaseCallbackModule(CallbackBase): event_data.setdefault('uuid', str(uuid.uuid4())) 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'] + event_data['res'] = self.censor_result(copy.deepcopy(event_data['res'])) if event not in self.EVENTS_WITHOUT_TASK: task = event_data.pop('task', None) @@ -329,6 +325,7 @@ class BaseCallbackModule(CallbackBase): ok=stats.ok, processed=stats.processed, skipped=stats.skipped, + artifact_data=stats.custom, ) with self.capture_event_data('playbook_on_stats', **event_data): super(BaseCallbackModule, self).v2_playbook_on_stats(stats) From a1267a3dee324411560515adb1b5d4b6612a7c24 Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Fri, 6 Jan 2017 10:04:57 -0500 Subject: [PATCH 2/3] update artifacts to work with ansible set_stats --- awx/lib/tower_display_callback/events.py | 7 +------ awx/lib/tower_display_callback/module.py | 6 +++++- awx/main/models/jobs.py | 25 ++++++++++++++++++------ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/awx/lib/tower_display_callback/events.py b/awx/lib/tower_display_callback/events.py index 002c753c2e..f46d5ae96f 100644 --- a/awx/lib/tower_display_callback/events.py +++ b/awx/lib/tower_display_callback/events.py @@ -178,13 +178,8 @@ 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) - if key == 'artifact_data': - if '_run' in event_dict[key]: - event_dict[key] = event_dict[key]['_run'] - else: - event_dict[key] = {} elif key in ('verbosity', 'pid'): event_dict[key] = event_data[key] return event_dict diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index cf266694f4..45a2781e0b 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -315,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. @@ -325,8 +328,9 @@ class BaseCallbackModule(CallbackBase): ok=stats.ok, processed=stats.processed, skipped=stats.skipped, - artifact_data=stats.custom, + 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 From 86a9a921ebc735de0eb4534153e26d2e1802441e Mon Sep 17 00:00:00 2001 From: Chris Meyers Date: Fri, 6 Jan 2017 11:47:45 -0500 Subject: [PATCH 3/3] remove deepcopy, not sure how that slipped in --- awx/lib/tower_display_callback/module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/lib/tower_display_callback/module.py b/awx/lib/tower_display_callback/module.py index 45a2781e0b..480527a651 100644 --- a/awx/lib/tower_display_callback/module.py +++ b/awx/lib/tower_display_callback/module.py @@ -110,7 +110,7 @@ class BaseCallbackModule(CallbackBase): event_data.setdefault('uuid', str(uuid.uuid4())) if 'res' in event_data: - event_data['res'] = self.censor_result(copy.deepcopy(event_data['res'])) + event_data['res'] = self.censor_result(copy.copy(event_data['res'])) if event not in self.EVENTS_WITHOUT_TASK: task = event_data.pop('task', None)