runreport.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import time
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.core.management.base import BaseCommand
  4. from django.utils import timezone
  5. from extras.choices import JobResultStatusChoices
  6. from extras.models import JobResult, ReportModule
  7. from extras.reports import run_report
  8. class Command(BaseCommand):
  9. help = "Run a report to validate data in NetBox"
  10. def add_arguments(self, parser):
  11. parser.add_argument('reports', nargs='+', help="Report(s) to run")
  12. def handle(self, *args, **options):
  13. for module in ReportModule.objects.all():
  14. for report in module.reports.values():
  15. if module.name in options['reports'] or report.full_name in options['reports']:
  16. # Run the report and create a new JobResult
  17. self.stdout.write(
  18. "[{:%H:%M:%S}] Running {}...".format(timezone.now(), report.full_name)
  19. )
  20. report_content_type = ContentType.objects.get(app_label='extras', model='report')
  21. job_result = JobResult.enqueue_job(
  22. run_report,
  23. report.full_name,
  24. report_content_type,
  25. None,
  26. job_timeout=report.job_timeout
  27. )
  28. # Wait on the job to finish
  29. while job_result.status not in JobResultStatusChoices.TERMINAL_STATE_CHOICES:
  30. time.sleep(1)
  31. job_result = JobResult.objects.get(pk=job_result.pk)
  32. # Report on success/failure
  33. if job_result.status == JobResultStatusChoices.STATUS_FAILED:
  34. status = self.style.ERROR('FAILED')
  35. elif job_result == JobResultStatusChoices.STATUS_ERRORED:
  36. status = self.style.ERROR('ERRORED')
  37. else:
  38. status = self.style.SUCCESS('SUCCESS')
  39. for test_name, attrs in job_result.data.items():
  40. self.stdout.write(
  41. "\t{}: {} success, {} info, {} warning, {} failure".format(
  42. test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failure']
  43. )
  44. )
  45. self.stdout.write(
  46. "[{:%H:%M:%S}] {}: {}".format(timezone.now(), report.full_name, status)
  47. )
  48. self.stdout.write(
  49. "[{:%H:%M:%S}] {}: Duration {}".format(timezone.now(), report.full_name, job_result.duration)
  50. )
  51. # Wrap things up
  52. self.stdout.write(
  53. "[{:%H:%M:%S}] Finished".format(timezone.now())
  54. )