summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2015-09-17 23:32:18 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2015-09-18 01:33:05 +0200
commit6b1d1dca9d0a108158b25b5cc07399f534f54f09 (patch)
treef62243abb28f2b51683e38e90cb968d210c1d4a6
parent31a5ce757295e841e72e0149c5851ceace976b44 (diff)
downloadbcfg2-6b1d1dca9d0a108158b25b5cc07399f534f54f09.tar.gz
bcfg2-6b1d1dca9d0a108158b25b5cc07399f534f54f09.tar.bz2
bcfg2-6b1d1dca9d0a108158b25b5cc07399f534f54f09.zip
Reporting: Do not fail, if no interactions found
With the filter feature of bcfg2-reports it is possible that all interactions of a client gets filtered. Now we simply skip those clients without interactions and do not fail with an exception.
-rwxr-xr-xsrc/lib/Bcfg2/Reporting/Reports.py43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/lib/Bcfg2/Reporting/Reports.py b/src/lib/Bcfg2/Reporting/Reports.py
index ebd0db58f..e91511c60 100755
--- a/src/lib/Bcfg2/Reporting/Reports.py
+++ b/src/lib/Bcfg2/Reporting/Reports.py
@@ -5,6 +5,7 @@ import sys
import argparse
import datetime
import Bcfg2.DBSettings
+from django.core.exceptions import ObjectDoesNotExist
def print_entries(interaction, etype):
@@ -38,7 +39,10 @@ class _FlagsFilterMixin(object):
filter['only_important'] = False
from Bcfg2.Reporting.models import Interaction
- return Interaction.objects.filter(client=client, **filter).latest()
+ try:
+ return Interaction.objects.filter(client=client, **filter).latest()
+ except ObjectDoesNotExist:
+ return None
class _SingleHostCmd(Bcfg2.Options.Subcommand): # pylint: disable=W0223
@@ -70,12 +74,15 @@ class Show(_SingleHostCmd, _FlagsFilterMixin):
client = self.get_client(setup)
show_all = not setup.bad and not setup.extra and not setup.modified
interaction = self.get_interaction(client, setup)
- if setup.bad or show_all:
- print_entries(interaction, "bad")
- if setup.modified or show_all:
- print_entries(interaction, "modified")
- if setup.extra or show_all:
- print_entries(interaction, "extra")
+ if interaction is None:
+ print("No interactions found for host: %s" % client.name)
+ else:
+ if setup.bad or show_all:
+ print_entries(interaction, "bad")
+ if setup.modified or show_all:
+ print_entries(interaction, "modified")
+ if setup.extra or show_all:
+ print_entries(interaction, "extra")
class Total(_SingleHostCmd, _FlagsFilterMixin):
@@ -86,9 +93,12 @@ class Total(_SingleHostCmd, _FlagsFilterMixin):
def run(self, setup):
client = self.get_client(setup)
interaction = self.get_interaction(client, setup)
- managed = interaction.total_count
- good = interaction.good_count
- print("Total managed entries: %d (good: %d)" % (managed, good))
+ if interaction is None:
+ print("No interactions found for host: %s" % client.name)
+ else:
+ managed = interaction.total_count
+ good = interaction.good_count
+ print("Total managed entries: %d (good: %d)" % (managed, good))
class Expire(_SingleHostCmd):
@@ -193,6 +203,9 @@ class Clients(_ClientSelectCmd):
show_all = not setup.stale and not setup.clean and not setup.dirty
for client in self.get_clients():
interaction = self.get_interaction(client, setup)
+ if interaction is None:
+ continue
+
if (show_all or
(setup.stale and interaction.isstale()) or
(setup.clean and interaction.isclean()) or
@@ -226,6 +239,9 @@ class Entries(_ClientSelectCmd):
for entry in entryspec:
for client in clients:
interaction = self.get_interaction(client, setup)
+ if interaction is None:
+ continue
+
items = getattr(interaction, etype)()
for item in items:
if (item.entry_type == entry[0] and
@@ -284,9 +300,12 @@ class Entry(_ClientSelectCmd):
# TODO: batch fetch this. sqlite could break
extra = dict()
for client in self.get_clients():
+ interaction = self.get_interaction(client, setup)
+ if interaction is None:
+ continue
+
ents = entry_cls.objects.filter(
- name=ename,
- interaction=self.get_interaction(client, setup))
+ name=ename, interaction=interaction)
if len(ents) == 0:
continue
extra[client] = {"entry state": ents[0].get_state_display(),