diff --git a/netbox/extras/management/commands/runreport.py b/netbox/extras/management/commands/runreport.py index d228771d2..43f027842 100644 --- a/netbox/extras/management/commands/runreport.py +++ b/netbox/extras/management/commands/runreport.py @@ -20,26 +20,39 @@ class Command(BaseCommand): # Gather all reports to be run reports = [] for module_name in options['reports']: + + # Split the report name off if one has been provided. + report_name = None + if '.' in module_name: + module_name, report_name = module_name.split('.', 1) + + # Import the report module try: report_module = importlib.import_module('reports.report_{}'.format(module_name)) except ImportError: self.stdout.write( - "Report '{}' not found. Ensure that the report has been saved as 'report_{}.py' in the reports " - "directory.".format(module_name, module_name) + "Report module '{}' not found. Ensure that the report has been saved as 'report_{}.py' in the " + "reports directory.".format(module_name, module_name) ) return - for name, cls in inspect.getmembers(report_module, inspect.isclass): - if cls in Report.__subclasses__(): - reports.append((name, cls)) + + # If the name of a particular report has been given, run that. Otherwise, run all reports in the module. + if report_name is not None: + report_cls = getattr(report_module, report_name) + reports = [(report_name, report_cls)] + else: + for name, report_cls in inspect.getmembers(report_module, inspect.isclass): + if report_cls in Report.__subclasses__(): + reports.append((name, report_cls)) # Run reports - for name, report in reports: - self.stdout.write("[{:%H:%M:%S}] Running report {}...".format(timezone.now(), name)) - report = report() - report.run() + for name, report_cls in reports: + self.stdout.write("[{:%H:%M:%S}] Running {}...".format(timezone.now(), name)) + report = report_cls() + results = report.run() status = self.style.ERROR('FAILED') if report.failed else self.style.SUCCESS('SUCCESS') self.stdout.write("[{:%H:%M:%S}] {}: {}".format(timezone.now(), name, status)) - for test_name, attrs in report.results.items(): + for test_name, attrs in results.items(): self.stdout.write(" {}: {} success, {} info, {} warning, {} failed".format( test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failed'] )) diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 22169c6b8..e65ef46a2 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -29,12 +29,13 @@ class Report(object): } } """ - results = OrderedDict() - active_test = None - failed = False def __init__(self): + self.results = OrderedDict() + self.active_test = None + self.failed = False + # Compile test methods and initialize results skeleton test_methods = [] for method in dir(self): @@ -92,9 +93,11 @@ class Report(object): def run(self): """ - Run the report. Each test method will be executed in order. + Run the report and return its results. Each test method will be executed in order. """ for method_name in self.test_methods: self.active_test = method_name test_method = getattr(self, method_name) test_method() + + return self.results