1
0
mirror of https://github.com/ansible/awx.git synced 2024-11-01 16:51:11 +03:00

Count only unique hostnames for total/failed values on dashboard. Fixes https://trello.com/c/HN7S4KF3

This commit is contained in:
Chris Church 2015-05-11 19:54:18 -04:00
parent 27b06313a7
commit d730859575
2 changed files with 47 additions and 2 deletions

View File

@ -282,10 +282,16 @@ class DashboardView(APIView):
user_hosts = get_user_queryset(request.user, Host)
user_hosts_failed = user_hosts.filter(has_active_failures=True)
try:
user_hosts_count = user_hosts.distinct('name').count()
user_hosts_failed_count = user_hosts_failed.distinct('name').count()
except NotImplementedError: # For unit tests only, SQLite doesn't support distinct('name')
user_hosts_count = len(set(user_hosts.values_list('name', flat=True)))
user_hosts_failed_count = len(set(user_hosts_failed.values_list('name', flat=True)))
data['hosts'] = {'url': reverse('api:host_list'),
'failures_url': reverse('api:host_list') + "?has_active_failures=True",
'total': user_hosts.count(),
'failed': user_hosts_failed.count()}
'total': user_hosts_count,
'failed': user_hosts_failed_count}
user_projects = get_user_queryset(request.user, Project)
user_projects_failed = user_projects.filter(last_job_failed=True)

View File

@ -1089,6 +1089,45 @@ class InventoryTest(BaseTest):
self.assertEqual(set(h_e.all_groups.values_list('pk', flat=True)),
set([g_e.pk]))
def test_dashboard_hosts_count(self):
url = reverse('api:dashboard_view')
# Test with zero hosts.
with self.current_user(self.super_django_user):
response = self.get(url, expect=200)
self.assertEqual(response['hosts']['total'], 0)
self.assertEqual(response['hosts']['failed'], 0)
# Create hosts with the same name in different inventories.
for x in xrange(4):
hostname = 'host-%d' % x
self.inventory_a.hosts.create(name=hostname)
self.inventory_b.hosts.create(name=hostname)
with self.current_user(self.super_django_user):
response = self.get(url, expect=200)
self.assertEqual(response['hosts']['total'], 4)
self.assertEqual(response['hosts']['failed'], 0)
# Mark all hosts in one inventory as failed. Failed count should
# reflect unique hostnames.
for host in self.inventory_a.hosts.all():
host.has_active_failures = True
host.save()
with self.current_user(self.super_django_user):
response = self.get(url, expect=200)
self.assertEqual(response['hosts']['total'], 4)
self.assertEqual(response['hosts']['failed'], 4)
# Mark all hosts in the other inventory as failed. Failed count
# should reflect unique hostnames and never be greater than total.
for host in self.inventory_b.hosts.all():
host.has_active_failures = True
host.save()
with self.current_user(self.super_django_user):
response = self.get(url, expect=200)
self.assertEqual(response['hosts']['total'], 4)
self.assertEqual(response['hosts']['failed'], 4)
def test_dashboard_inventory_graph_view(self):
url = reverse('api:dashboard_inventory_graph_view')
# Test with zero hosts.