mirror of
https://github.com/ansible/awx.git
synced 2026-05-07 01:17:37 -02:30
Split out dashboard graphs onto two endpoints, support actual query
parameters related to job type and implement per-inventory source success/failed breakdowns
This commit is contained in:
@@ -177,7 +177,8 @@ v1_urls = patterns('awx.api.views',
|
|||||||
url(r'^authtoken/$', 'auth_token_view'),
|
url(r'^authtoken/$', 'auth_token_view'),
|
||||||
url(r'^me/$', 'user_me_list'),
|
url(r'^me/$', 'user_me_list'),
|
||||||
url(r'^dashboard/$', 'dashboard_view'),
|
url(r'^dashboard/$', 'dashboard_view'),
|
||||||
url(r'^dashboard/graphs/$', 'dashboard_graph_view'),
|
url(r'^dashboard/graphs/jobs/$', 'dashboard_jobs_graph_view'),
|
||||||
|
url(r'^dashboard/graphs/inventory/$', 'dashboard_inventory_graph_view'),
|
||||||
url(r'^schedules/', include(schedule_urls)),
|
url(r'^schedules/', include(schedule_urls)),
|
||||||
url(r'^organizations/', include(organization_urls)),
|
url(r'^organizations/', include(organization_urls)),
|
||||||
url(r'^users/', include(user_urls)),
|
url(r'^users/', include(user_urls)),
|
||||||
|
|||||||
@@ -248,24 +248,32 @@ class DashboardView(APIView):
|
|||||||
'total': job_template_list.count()}
|
'total': job_template_list.count()}
|
||||||
return Response(data)
|
return Response(data)
|
||||||
|
|
||||||
class DashboardGraphView(APIView):
|
class DashboardJobsGraphView(APIView):
|
||||||
|
|
||||||
view_name = "Dashboard Graphs"
|
view_name = "Dashboard Jobs Graphs"
|
||||||
new_in_20 = True
|
new_in_20 = True
|
||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
period = request.QUERY_PARAMS.get('period', 'month')
|
period = request.QUERY_PARAMS.get('period', 'month')
|
||||||
job_type = request.QUERY_PARAMS.get('job_type', 'all')
|
job_type = request.QUERY_PARAMS.get('job_type', 'all')
|
||||||
|
|
||||||
qs = User.objects.all()
|
|
||||||
user_unified_jobs = get_user_queryset(request.user, UnifiedJob)
|
user_unified_jobs = get_user_queryset(request.user, UnifiedJob)
|
||||||
user_hosts = get_user_queryset(request.user, Host)
|
|
||||||
|
|
||||||
success_qss = qsstats.QuerySetStats(user_unified_jobs.filter(status='successful'), 'finished')
|
success_query = user_unified_jobs.filter(status='successful')
|
||||||
failed_qss = qsstats.QuerySetStats(user_unified_jobs.filter(status='failed'), 'finished')
|
failed_query = user_unified_jobs.filter(status='failed')
|
||||||
|
|
||||||
created_hosts = qsstats.QuerySetStats(user_hosts, 'created')
|
if job_type == 'inv_sync':
|
||||||
count_hosts = user_hosts.all().count()
|
success_query.filter(instance_of=InventoryUpdate)
|
||||||
|
failed_query.filter(instance_of=InventoryUpdate)
|
||||||
|
elif job_type == 'playbook_run':
|
||||||
|
success_query.filter(instance_of=Job)
|
||||||
|
failed_query.filter(instance_of=Job)
|
||||||
|
elif job_type == 'scm_update':
|
||||||
|
success_query.filter(instance_of=ProjectUpdate)
|
||||||
|
failed_query.filter(instance_of=ProjectUpdate)
|
||||||
|
|
||||||
|
success_qss = qsstats.QuerySetStats(success_query, 'finished')
|
||||||
|
failed_qss = qsstats.QuerySetStats(failed_query, 'finished')
|
||||||
|
|
||||||
start_date = datetime.datetime.now()
|
start_date = datetime.datetime.now()
|
||||||
if period == 'month':
|
if period == 'month':
|
||||||
@@ -277,15 +285,44 @@ class DashboardGraphView(APIView):
|
|||||||
elif period == 'day':
|
elif period == 'day':
|
||||||
end_date = start_date - dateutil.relativedelta.relativedelta(days=1)
|
end_date = start_date - dateutil.relativedelta.relativedelta(days=1)
|
||||||
interval = 'hours'
|
interval = 'hours'
|
||||||
|
else:
|
||||||
|
return Response({'error': 'Unknown period "%s"' % str(period)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
dashboard_data = {"jobs": {"successful": [], "failed": []}, "hosts": [],
|
dashboard_data = {"jobs": {"successful": [], "failed": []}}
|
||||||
"inventory": []}
|
|
||||||
for element in success_qss.time_series(end_date, start_date, interval=interval):
|
for element in success_qss.time_series(end_date, start_date, interval=interval):
|
||||||
dashboard_data['jobs']['successful'].append([time.mktime(element[0].timetuple()),
|
dashboard_data['jobs']['successful'].append([time.mktime(element[0].timetuple()),
|
||||||
element[1]])
|
element[1]])
|
||||||
for element in failed_qss.time_series(end_date, start_date, interval=interval):
|
for element in failed_qss.time_series(end_date, start_date, interval=interval):
|
||||||
dashboard_data['jobs']['failed'].append([time.mktime(element[0].timetuple()),
|
dashboard_data['jobs']['failed'].append([time.mktime(element[0].timetuple()),
|
||||||
element[1]])
|
element[1]])
|
||||||
|
return Response(dashboard_data)
|
||||||
|
|
||||||
|
class DashboardInventoryGraphView(APIView):
|
||||||
|
|
||||||
|
view_name = "Dashboard Inventory Graphs"
|
||||||
|
new_in_20 = True
|
||||||
|
|
||||||
|
def get(self, request, format=None):
|
||||||
|
period = request.QUERY_PARAMS.get('period', 'month')
|
||||||
|
|
||||||
|
start_date = datetime.datetime.now()
|
||||||
|
if period == 'month':
|
||||||
|
end_date = start_date - dateutil.relativedelta.relativedelta(months=1)
|
||||||
|
interval = 'days'
|
||||||
|
elif period == 'week':
|
||||||
|
end_date = start_date - dateutil.relativedelta.relativedelta(weeks=1)
|
||||||
|
interval = 'days'
|
||||||
|
elif period == 'day':
|
||||||
|
end_date = start_date - dateutil.relativedelta.relativedelta(days=1)
|
||||||
|
interval = 'hours'
|
||||||
|
else:
|
||||||
|
return Response({'error': 'Unknown period "%s"' % str(period)}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
user_hosts = get_user_queryset(request.user, Host)
|
||||||
|
created_hosts = qsstats.QuerySetStats(user_hosts, 'created')
|
||||||
|
count_hosts = user_hosts.all().count()
|
||||||
|
|
||||||
|
dashboard_data = {'hosts': [], 'inventory': []}
|
||||||
last_delta = 0
|
last_delta = 0
|
||||||
host_data = []
|
host_data = []
|
||||||
for element in created_hosts.time_series(end_date, start_date, interval=interval)[::-1]:
|
for element in created_hosts.time_series(end_date, start_date, interval=interval)[::-1]:
|
||||||
@@ -293,6 +330,7 @@ class DashboardGraphView(APIView):
|
|||||||
count_hosts - last_delta])
|
count_hosts - last_delta])
|
||||||
count_hosts -= last_delta
|
count_hosts -= last_delta
|
||||||
last_delta = element[1]
|
last_delta = element[1]
|
||||||
|
|
||||||
dashboard_data['hosts'] = host_data[::-1]
|
dashboard_data['hosts'] = host_data[::-1]
|
||||||
|
|
||||||
hosts_by_inventory = user_hosts.all().values('inventory__id', 'inventory__name', 'has_active_failures', 'inventory_sources__id').annotate(Count("id"))
|
hosts_by_inventory = user_hosts.all().values('inventory__id', 'inventory__name', 'has_active_failures', 'inventory_sources__id').annotate(Count("id"))
|
||||||
|
|||||||
Reference in New Issue
Block a user