From 06ad32ed8e6e083ac9fcf9ac32fc1bbc38bbc63e Mon Sep 17 00:00:00 2001 From: James Talton Date: Thu, 27 Apr 2023 15:58:59 -0400 Subject: [PATCH] Enhance the dashboard job summary endpoint to contain canceled and error job counts Signed-off-by: James Talton --- awx/api/views/__init__.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 7437c85c66..18b85be018 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -272,16 +272,24 @@ class DashboardJobsGraphView(APIView): success_query = user_unified_jobs.filter(status='successful') failed_query = user_unified_jobs.filter(status='failed') + canceled_query = user_unified_jobs.filter(status='canceled') + error_query = user_unified_jobs.filter(status='error') if job_type == 'inv_sync': success_query = success_query.filter(instance_of=models.InventoryUpdate) failed_query = failed_query.filter(instance_of=models.InventoryUpdate) + canceled_query = canceled_query.filter(instance_of=models.InventoryUpdate) + error_query = error_query.filter(instance_of=models.InventoryUpdate) elif job_type == 'playbook_run': success_query = success_query.filter(instance_of=models.Job) failed_query = failed_query.filter(instance_of=models.Job) + canceled_query = canceled_query.filter(instance_of=models.Job) + error_query = error_query.filter(instance_of=models.Job) elif job_type == 'scm_update': success_query = success_query.filter(instance_of=models.ProjectUpdate) failed_query = failed_query.filter(instance_of=models.ProjectUpdate) + canceled_query = canceled_query.filter(instance_of=models.ProjectUpdate) + error_query = error_query.filter(instance_of=models.ProjectUpdate) end = now() interval = 'day' @@ -297,10 +305,12 @@ class DashboardJobsGraphView(APIView): else: return Response({'error': _('Unknown period "%s"') % str(period)}, status=status.HTTP_400_BAD_REQUEST) - dashboard_data = {"jobs": {"successful": [], "failed": []}} + dashboard_data = {"jobs": {"successful": [], "failed": [], "canceled": [], "error": []}} succ_list = dashboard_data['jobs']['successful'] fail_list = dashboard_data['jobs']['failed'] + canceled_list = dashboard_data['jobs']['canceled'] + error_list = dashboard_data['jobs']['error'] qs_s = ( success_query.filter(finished__range=(start, end)) @@ -318,6 +328,22 @@ class DashboardJobsGraphView(APIView): .annotate(agg=Count('id', distinct=True)) ) data_f = {item['d']: item['agg'] for item in qs_f} + qs_c = ( + canceled_query.filter(finished__range=(start, end)) + .annotate(d=Trunc('finished', interval, tzinfo=end.tzinfo)) + .order_by() + .values('d') + .annotate(agg=Count('id', distinct=True)) + ) + data_c = {item['d']: item['agg'] for item in qs_c} + qs_e = ( + error_query.filter(finished__range=(start, end)) + .annotate(d=Trunc('finished', interval, tzinfo=end.tzinfo)) + .order_by() + .values('d') + .annotate(agg=Count('id', distinct=True)) + ) + data_e = {item['d']: item['agg'] for item in qs_e} start_date = start.replace(hour=0, minute=0, second=0, microsecond=0) for d in itertools.count(): @@ -326,6 +352,8 @@ class DashboardJobsGraphView(APIView): break succ_list.append([time.mktime(date.timetuple()), data_s.get(date, 0)]) fail_list.append([time.mktime(date.timetuple()), data_f.get(date, 0)]) + canceled_list.append([time.mktime(date.timetuple()), data_c.get(date, 0)]) + error_list.append([time.mktime(date.timetuple()), data_e.get(date, 0)]) return Response(dashboard_data)