Added job_events and job_host_summaries for groups.

This commit is contained in:
Chris Church 2013-05-16 21:59:58 -04:00
parent 602fce73e4
commit ac172928f8
5 changed files with 71 additions and 55 deletions

View File

@ -255,6 +255,21 @@ class Group(CommonModelNameNotUnique):
def get_absolute_url(self):
return reverse('main:groups_detail', args=(self.pk,))
@property
def all_hosts(self):
qs = self.hosts.distinct()
for group in self.children.exclude(pk=self.pk):
qs = qs | group.all_hosts
return qs
@property
def job_host_summaries(self):
return JobHostSummary.objects.filter(host__in=self.all_hosts)
@property
def job_events(self):
return JobEvent.objects.filter(host__in=self.all_hosts)
# FIXME: audit nullables
# FIXME: audit cascades

View File

@ -230,6 +230,8 @@ class GroupSerializer(BaseSerializer):
children = reverse('main:groups_children_list', args=(obj.pk,)),
all_hosts = reverse('main:groups_all_hosts_list', args=(obj.pk,)),
inventory = reverse('main:inventory_detail', args=(obj.inventory.pk,)),
job_events = reverse('main:group_job_event_list', args=(obj.pk,)),
job_host_summaries = reverse('main:group_job_host_summary_list', args=(obj.pk,)),
))
return res
@ -443,8 +445,8 @@ class JobEventSerializer(BaseSerializer):
class Meta:
model = JobEvent
fields = ('id', 'url', 'job', 'event', 'event_data', 'failed', 'host',
'related', 'summary_fields')
fields = ('id', 'url', 'created', 'job', 'event', 'event_data',
'failed', 'host', 'related', 'summary_fields')
def get_related(self, obj):
res = super(JobEventSerializer, self).get_related(obj)

View File

@ -908,6 +908,16 @@ class JobStartCancelTest(BaseJobTestMixin, django.test.TransactionTestCase):
self.check_pagination_and_size(response, qs.count())
self.check_list_ids(response, qs)
# Test job event list for groups.
for group in self.inv_ops_east.groups.all():
url = reverse('main:group_job_event_list', args=(group.pk,))
with self.current_user(self.user_sue):
response = self.get(url)
qs = group.job_events.all()
self.assertTrue(qs.count())
self.check_pagination_and_size(response, qs.count())
self.check_list_ids(response, qs)
# Test global job event list.
url = reverse('main:job_event_list')
with self.current_user(self.user_sue):
@ -946,3 +956,13 @@ class JobStartCancelTest(BaseJobTestMixin, django.test.TransactionTestCase):
self.assertTrue(qs.count())
self.check_pagination_and_size(response, qs.count())
self.check_list_ids(response, qs)
# Test job host summaries for groups.
for group in self.inv_ops_east.groups.all():
url = reverse('main:group_job_host_summary_list', args=(group.pk,))
with self.current_user(self.user_sue):
response = self.get(url)
qs = group.job_host_summaries.all()
self.assertTrue(qs.count())
self.check_pagination_and_size(response, qs.count())
self.check_list_ids(response, qs)

View File

@ -78,6 +78,8 @@ groups_urls = patterns('lib.main.views',
url(r'^(?P<pk>[0-9]+)/hosts/$', 'groups_hosts_list'),
url(r'^(?P<pk>[0-9]+)/all_hosts/$', 'groups_all_hosts_list'),
url(r'^(?P<pk>[0-9]+)/variable_data/$', 'groups_variable_detail'),
url(r'^(?P<pk>[0-9]+)/job_events/$', 'group_job_event_list'),
url(r'^(?P<pk>[0-9]+)/job_host_summaries/$', 'group_job_host_summary_list'),
)
variable_data_urls = patterns('lib.main.views',

View File

@ -799,26 +799,13 @@ class GroupsAllHostsList(BaseSubList):
relationship = 'hosts'
filter_fields = ('name',)
def _child_hosts(self, parent):
# TODO: should probably be a method on the model
result = parent.hosts.distinct()
if parent.children.count() == 0:
return result
else:
for child in parent.children.all():
if child == parent:
# shouldn't happen, but be prepared in case DB is weird
continue
result = result | self._child_hosts(child)
return result
def get_queryset(self):
parent = Group.objects.get(pk=self.kwargs['pk'])
# FIXME: verify read permissions on this object are still required at a higher level
base = self._child_hosts(parent)
base = parent.all_hosts
if self.request.user.is_superuser:
return base.all()
@ -1012,37 +999,33 @@ class JobCancel(generics.RetrieveAPIView):
else:
return Response(status=405)
class HostJobHostSummaryList(generics.ListAPIView):
class BaseJobHostSummaryList(generics.ListAPIView):
model = JobHostSummary
serializer_class = JobHostSummarySerializer
permission_classes = (CustomRbac,)
parent_model = None # Subclasses must define this attribute.
relationship = 'job_host_summaries'
def get_name(self):
return 'Job Host Summary List'
def get_queryset(self):
# FIXME: Verify read permission on the parent object and job.
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
return getattr(parent_obj, self.relationship)
class HostJobHostSummaryList(BaseJobHostSummaryList):
parent_model = Host
relationship = 'job_host_summaries'
def get_name(self):
return 'Job Host Summary List'
class GroupJobHostSummaryList(BaseJobHostSummaryList):
def get_queryset(self):
# FIXME: Verify read permission on the host and job.
host = get_object_or_404(Host, pk=self.kwargs['pk'])
return host.job_host_summaries
parent_model = Group
class JobJobHostSummaryList(generics.ListAPIView):
class JobJobHostSummaryList(BaseJobHostSummaryList):
model = JobHostSummary
serializer_class = JobHostSummarySerializer
permission_classes = (CustomRbac,)
parent_model = Job
relationship = 'job_host_summaries'
def get_name(self):
return 'Job Host Summary List'
def get_queryset(self):
# FIXME: Verify read permission on the host and job.
job = get_object_or_404(Job, pk=self.kwargs['pk'])
return job.job_host_summaries
# FIXME: Subclasses of XJobHostSummaryList for failed/successful/etc.
@ -1067,36 +1050,30 @@ class JobEventDetail(generics.RetrieveAPIView):
serializer_class = JobEventSerializer
permission_classes = (CustomRbac,)
class JobJobEventList(BaseSubList):
class BaseJobEventList(generics.ListAPIView):
model = JobEvent
serializer_class = JobEventSerializer
permission_classes = (CustomRbac,)
parent_model = Job
parent_model = None # Subclasses must define this attribute.
relationship = 'job_events'
postable = False
severable = False
def get_queryset(self):
job = get_object_or_404(Job, pk=self.kwargs['pk'])
# FIXME: Verify read permission on the job.
return job.job_events
# FIXME: Verify read permission on the parent object and job.
parent_obj = get_object_or_404(self.parent_model, pk=self.kwargs['pk'])
return getattr(parent_obj, self.relationship)
class HostJobEventList(BaseSubList):
class HostJobEventList(BaseJobEventList):
model = JobEvent
serializer_class = JobEventSerializer
permission_classes = (CustomRbac,)
parent_model = Host
relationship = 'job_events'
postable = False
severable = False
def get_queryset(self):
host = get_object_or_404(Host, pk=self.kwargs['pk'])
# FIXME: Verify read permission on the host.
return host.job_events
class GroupJobEventList(BaseJobEventList):
parent_model = Group
class JobJobEventList(BaseJobEventList):
parent_model = Job
# Create view functions for all of the class-based views to simplify inclusion
# in URL patterns and reverse URL lookups, converting CamelCase names to