4ebca08d8a1925ede2b985069b9150e26ad52382
[arvados.git] / services / api / lib / simulate_job_log.rb
1 module SimulateJobLog
2         # Note that deleting existing log entries only works if a simulated job uuid is also specified.
3         def replay(filename, multiplier = 1, delete_log_entries = false, simulated_job_uuid = nil)
4                 raise "Environment must be development or test" unless [ 'test', 'development' ].include? ENV['RAILS_ENV']
5
6             multiplier = multiplier.to_f
7             multiplier = 1.0 if multiplier <= 0
8
9             delete_log_entries = (delete_log_entries.to_s.downcase == 'true')
10
11             actual_start_time = Time.now
12             log_start_time = nil
13
14                 act_as_system_user do
15                         Log.where("object_uuid = ?", simulated_job_uuid).delete_all if simulated_job_uuid && delete_log_entries
16                         File.open(filename).each.with_index do |line, index|
17                                 cols = {}
18                         cols[:timestamp], cols[:job_uuid], cols[:pid], cols[:task], cols[:event_type], cols[:message] = line.split(' ', 6)
19                         cols[:timestamp] = Time.strptime( cols[:timestamp], "%Y-%m-%d_%H:%M:%S" )
20                         # Override job uuid with a simulated one if specified
21                         cols[:job_uuid] = simulated_job_uuid || cols[:job_uuid]
22                         # determine when we want to simulate this log being created, based on the time multiplier
23                         log_start_time = cols[:timestamp] if log_start_time.nil?
24                         log_time = cols[:timestamp]
25                         actual_elapsed_time = Time.now - actual_start_time
26                         log_elapsed_time = log_time - log_start_time
27                     modified_elapsed_time = log_elapsed_time / multiplier
28                         pause_time = modified_elapsed_time - actual_elapsed_time
29                         if pause_time > 0
30                                 sleep pause_time
31                             end
32                             # output log entry for debugging and create it in the current environment's database
33                         puts "#{index} #{cols.to_yaml}\n"
34                         Log.new({
35                                 event_at:    Time.zone.local_to_utc(cols[:timestamp]),
36                                 object_uuid: cols[:job_uuid],
37                                 event_type:  cols[:event_type],
38                                 properties:  { 'text' => line }
39                         }).save!
40                         end
41                 end
42
43         end
44 end