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:
Matthew Jones 2014-07-08 11:07:03 -04:00
parent c2473f9b12
commit a36c43bd90
2 changed files with 50 additions and 11 deletions

View File

@ -177,7 +177,8 @@ v1_urls = patterns('awx.api.views',
url(r'^authtoken/$', 'auth_token_view'),
url(r'^me/$', 'user_me_list'),
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'^organizations/', include(organization_urls)),
url(r'^users/', include(user_urls)),

View File

@ -248,24 +248,32 @@ class DashboardView(APIView):
'total': job_template_list.count()}
return Response(data)
class DashboardGraphView(APIView):
class DashboardJobsGraphView(APIView):
view_name = "Dashboard Graphs"
view_name = "Dashboard Jobs Graphs"
new_in_20 = True
def get(self, request, format=None):
period = request.QUERY_PARAMS.get('period', 'month')
job_type = request.QUERY_PARAMS.get('job_type', 'all')
qs = User.objects.all()
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')
failed_qss = qsstats.QuerySetStats(user_unified_jobs.filter(status='failed'), 'finished')
success_query = user_unified_jobs.filter(status='successful')
failed_query = user_unified_jobs.filter(status='failed')
created_hosts = qsstats.QuerySetStats(user_hosts, 'created')
count_hosts = user_hosts.all().count()
if job_type == 'inv_sync':
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()
if period == 'month':
@ -277,15 +285,44 @@ class DashboardGraphView(APIView):
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)
dashboard_data = {"jobs": {"successful": [], "failed": []}, "hosts": [],
"inventory": []}
dashboard_data = {"jobs": {"successful": [], "failed": []}}
for element in success_qss.time_series(end_date, start_date, interval=interval):
dashboard_data['jobs']['successful'].append([time.mktime(element[0].timetuple()),
element[1]])
for element in failed_qss.time_series(end_date, start_date, interval=interval):
dashboard_data['jobs']['failed'].append([time.mktime(element[0].timetuple()),
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
host_data = []
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
last_delta = element[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"))