dry_runnable.rb 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. module DryRunnable
  2. extend ActiveSupport::Concern
  3. def dry_run!(event = nil)
  4. @dry_run = true
  5. log = StringIO.new
  6. @started_at = Time.zone.now
  7. @dry_run_logger = Logger.new(log).tap { |logger|
  8. logger.formatter = proc { |severity, datetime, progname, message|
  9. "[#{elapsed_time(datetime)}] #{severity} -- #{progname}: #{message}\n"
  10. }
  11. }
  12. @dry_run_results = {
  13. events: [],
  14. }
  15. begin
  16. raise "#{short_type} does not support dry-run" unless can_dry_run?
  17. readonly!
  18. @started_at = Time.zone.now
  19. @dry_run_logger.info('Dry Run started')
  20. if event
  21. raise "This agent cannot receive an event!" unless can_receive_events?
  22. receive([event])
  23. else
  24. check
  25. end
  26. @dry_run_logger.info('Dry Run finished')
  27. rescue => e
  28. @dry_run_logger.info('Dry Run failed')
  29. error "Exception during dry-run. #{e.message}: #{e.backtrace.join("\n")}"
  30. end
  31. @dry_run_results.update(
  32. memory: memory,
  33. log: log.string,
  34. )
  35. ensure
  36. @dry_run = false
  37. end
  38. def dry_run?
  39. !!@dry_run
  40. end
  41. def elapsed_time(datetime)
  42. '%02d:%02d:%02d' % 2.times.inject([datetime - @started_at]) { |(x, *xs)|
  43. [*x.divmod(60), *xs]
  44. }
  45. end
  46. included do
  47. prepend Wrapper
  48. end
  49. module Wrapper
  50. attr_accessor :results
  51. def logger
  52. return super unless dry_run?
  53. @dry_run_logger
  54. end
  55. def save(options = {})
  56. return super unless dry_run?
  57. perform_validations(options)
  58. end
  59. def save!(options = {})
  60. return super unless dry_run?
  61. save(options) or raise_record_invalid
  62. end
  63. def log(message, options = {})
  64. return super unless dry_run?
  65. case options[:level] || 3
  66. when 0..2
  67. sev = Logger::DEBUG
  68. when 3
  69. sev = Logger::INFO
  70. else
  71. sev = Logger::ERROR
  72. end
  73. logger.log(sev, message)
  74. end
  75. def create_event(event)
  76. return super unless dry_run?
  77. if can_create_events?
  78. event = build_event(event)
  79. @dry_run_results[:events] << event.payload
  80. event
  81. else
  82. error "This Agent cannot create events!"
  83. end
  84. end
  85. end
  86. end