|
@@ -6,6 +6,7 @@ import pkgutil
|
|
|
from django.utils import timezone
|
|
|
|
|
|
from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_LEVEL_CODES, LOG_SUCCESS, LOG_WARNING
|
|
|
+from .models import ReportResult
|
|
|
import reports as custom_reports
|
|
|
|
|
|
|
|
@@ -34,8 +35,8 @@ def get_reports():
|
|
|
Compile a list of all reports available across all modules in the reports path. Returns a list of tuples:
|
|
|
|
|
|
[
|
|
|
- (module_name, (report_class, report_class, report_class, ...)),
|
|
|
- (module_name, (report_class, report_class, report_class, ...)),
|
|
|
+ (module_name, (report, report, report, ...)),
|
|
|
+ (module_name, (report, report, report, ...)),
|
|
|
...
|
|
|
]
|
|
|
"""
|
|
@@ -56,7 +57,7 @@ class Report(object):
|
|
|
NetBox users can extend this object to write custom reports to be used for validating data within NetBox. Each
|
|
|
report must have one or more test methods named `test_*`.
|
|
|
|
|
|
- The `results` attribute of a completed report will take the following form:
|
|
|
+ The `_results` attribute of a completed report will take the following form:
|
|
|
|
|
|
{
|
|
|
'test_bar': {
|
|
@@ -79,7 +80,7 @@ class Report(object):
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
- self.results = OrderedDict()
|
|
|
+ self._results = OrderedDict()
|
|
|
self.active_test = None
|
|
|
self.failed = False
|
|
|
|
|
@@ -88,7 +89,7 @@ class Report(object):
|
|
|
for method in dir(self):
|
|
|
if method.startswith('test_') and callable(getattr(self, method)):
|
|
|
test_methods.append(method)
|
|
|
- self.results[method] = OrderedDict([
|
|
|
+ self._results[method] = OrderedDict([
|
|
|
('success', 0),
|
|
|
('info', 0),
|
|
|
('warning', 0),
|
|
@@ -118,7 +119,7 @@ class Report(object):
|
|
|
if level not in LOG_LEVEL_CODES:
|
|
|
raise Exception("Unknown logging level: {}".format(level))
|
|
|
logline = [timezone.now().isoformat(), level, str(obj), message]
|
|
|
- self.results[self.active_test]['log'].append(logline)
|
|
|
+ self._results[self.active_test]['log'].append(logline)
|
|
|
|
|
|
def log_success(self, obj, message=None):
|
|
|
"""
|
|
@@ -126,28 +127,28 @@ class Report(object):
|
|
|
"""
|
|
|
if message:
|
|
|
self._log(obj, message, level=LOG_SUCCESS)
|
|
|
- self.results[self.active_test]['success'] += 1
|
|
|
+ self._results[self.active_test]['success'] += 1
|
|
|
|
|
|
def log_info(self, obj, message):
|
|
|
"""
|
|
|
Log an informational message.
|
|
|
"""
|
|
|
self._log(obj, message, level=LOG_INFO)
|
|
|
- self.results[self.active_test]['info'] += 1
|
|
|
+ self._results[self.active_test]['info'] += 1
|
|
|
|
|
|
def log_warning(self, obj, message):
|
|
|
"""
|
|
|
Log a warning.
|
|
|
"""
|
|
|
self._log(obj, message, level=LOG_WARNING)
|
|
|
- self.results[self.active_test]['warning'] += 1
|
|
|
+ self._results[self.active_test]['warning'] += 1
|
|
|
|
|
|
def log_failure(self, obj, message):
|
|
|
"""
|
|
|
Log a failure. Calling this method will automatically mark the report as failed.
|
|
|
"""
|
|
|
self._log(obj, message, level=LOG_FAILURE)
|
|
|
- self.results[self.active_test]['failed'] += 1
|
|
|
+ self._results[self.active_test]['failed'] += 1
|
|
|
self.failed = True
|
|
|
|
|
|
def run(self):
|
|
@@ -159,4 +160,8 @@ class Report(object):
|
|
|
test_method = getattr(self, method_name)
|
|
|
test_method()
|
|
|
|
|
|
- return self.results
|
|
|
+ # Delete any previous ReportResult and create a new one to record the result.
|
|
|
+ ReportResult.objects.filter(report=self.full_name).delete()
|
|
|
+ result = ReportResult(report=self.full_name, failed=self.failed, data=self._results)
|
|
|
+ result.save()
|
|
|
+ self.result = result
|