gorgon 0.11.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +0 -2
- data/.rspec +2 -0
- data/.travis.yml +10 -0
- data/Dockerfile +25 -0
- data/Gemfile.lock +20 -15
- data/README.md +33 -6
- data/Rakefile +5 -0
- data/architecture.md +2 -2
- data/bin/gorgon +2 -114
- data/daemon_with_upstart_and_rvm.md +1 -1
- data/docker-compose.yml +28 -0
- data/file_server/Dockerfile +8 -0
- data/file_server/test_gorgon.pem.pub +1 -0
- data/gorgon.gemspec +2 -2
- data/gorgon_secret.json.sample +5 -0
- data/lib/gorgon/amqp_service.rb +28 -26
- data/lib/gorgon/callback_handler.rb +28 -26
- data/lib/gorgon/colors.rb +6 -4
- data/lib/gorgon/command.rb +145 -0
- data/lib/gorgon/configuration.rb +45 -5
- data/lib/gorgon/core_ext/hash/deep_merge.rb +21 -0
- data/lib/gorgon/crash_reporter.rb +15 -13
- data/lib/gorgon/failures_printer.rb +27 -26
- data/lib/gorgon/g_logger.rb +19 -17
- data/lib/gorgon/gem_command_handler.rb +41 -39
- data/lib/gorgon/gem_service.rb +60 -57
- data/lib/gorgon/host_state.rb +23 -21
- data/lib/gorgon/job.rb +19 -17
- data/lib/gorgon/job_definition.rb +23 -21
- data/lib/gorgon/job_state.rb +93 -90
- data/lib/gorgon/listener.rb +137 -146
- data/lib/gorgon/listener_installer.rb +98 -96
- data/lib/gorgon/originator.rb +170 -167
- data/lib/gorgon/originator_logger.rb +30 -28
- data/lib/gorgon/originator_protocol.rb +85 -83
- data/lib/gorgon/ping_service.rb +44 -42
- data/lib/gorgon/pipe_forker.rb +17 -15
- data/lib/gorgon/progress_bar_view.rb +109 -107
- data/lib/gorgon/rsync_daemon.rb +56 -54
- data/lib/gorgon/runtime_file_reader.rb +28 -27
- data/lib/gorgon/runtime_recorder.rb +27 -26
- data/lib/gorgon/settings/files_content.rb +27 -25
- data/lib/gorgon/settings/initial_files_creator.rb +58 -56
- data/lib/gorgon/settings/rails_project_files_content.rb +33 -31
- data/lib/gorgon/settings/simple_project_files_content.rb +11 -9
- data/lib/gorgon/shutdown_manager.rb +20 -18
- data/lib/gorgon/source_tree_syncer.rb +108 -69
- data/lib/gorgon/version.rb +1 -1
- data/lib/gorgon/worker.rb +130 -128
- data/lib/gorgon/worker_manager.rb +139 -137
- data/lib/gorgon_amq-protocol/.rspec +3 -0
- data/run_dev_environment.sh +3 -0
- data/run_gorgon.sh +3 -0
- data/run_listener.sh +3 -0
- data/run_test.sh +3 -0
- data/spec/callback_handler_spec.rb +10 -10
- data/spec/command_spec.rb +172 -0
- data/spec/configuration_spec.rb +62 -0
- data/spec/core_ext/hash/deep_merge_spec.rb +11 -0
- data/spec/crash_reporter_spec.rb +10 -10
- data/spec/dummy/.gitignore +3 -0
- data/spec/dummy/Gemfile +11 -0
- data/spec/dummy/Gemfile.lock +76 -0
- data/spec/dummy/README.md +23 -0
- data/spec/dummy/gorgon.json +30 -0
- data/spec/dummy/gorgon_callbacks.rb +68 -0
- data/spec/dummy/gorgon_listener.json +8 -0
- data/spec/dummy/integration_spec.rb +51 -0
- data/spec/{support/mock_app/app/mailers → dummy/log}/.gitkeep +0 -0
- data/spec/dummy/rspec_runner.rb +8 -0
- data/spec/dummy/spec/1_syntax_error_spec.rb +1 -0
- data/spec/dummy/spec/exception_spec.rb +5 -0
- data/spec/dummy/spec/failing_spec.rb +11 -0
- data/spec/dummy/spec/keeping_rspec_config_spec.rb +5 -0
- data/spec/dummy/spec/spec_helper.rb +13 -0
- data/spec/dummy/spec/successful_spec.rb +9 -0
- data/spec/dummy/spec/using_shared_example_spec.rb +3 -0
- data/spec/dummy/test/.rb +15 -0
- data/spec/dummy/test/minitest/mini1_test.rb +11 -0
- data/spec/dummy/test/minitest/mini2_test.rb +25 -0
- data/spec/dummy/test/unit/1_syntax_error_test.rb +9 -0
- data/spec/dummy/test/unit/exception_test.rb +14 -0
- data/spec/dummy/test/unit/failing_test.rb +17 -0
- data/spec/dummy/test/unit/successful_test.rb +9 -0
- data/spec/dummy/test_gorgon.pem +27 -0
- data/spec/end_to_end_spec.rb +142 -0
- data/spec/failures_printer_spec.rb +20 -20
- data/spec/gem_command_handler_spec.rb +24 -24
- data/spec/gem_service_spec.rb +18 -18
- data/spec/gorgon_rspec_formatter_spec.rb +12 -12
- data/spec/host_state_spec.rb +8 -8
- data/spec/job_definition_spec.rb +3 -3
- data/spec/job_state_spec.rb +46 -46
- data/spec/listener_spec.rb +67 -73
- data/spec/mini_test_runner_spec.rb +7 -7
- data/spec/originator_logger_spec.rb +6 -6
- data/spec/originator_protocol_spec.rb +38 -38
- data/spec/originator_spec.rb +78 -69
- data/spec/ping_service_spec.rb +14 -14
- data/spec/pipe_forker_spec.rb +13 -13
- data/spec/progress_bar_view_spec.rb +32 -32
- data/spec/rspec_runner_spec.rb +12 -12
- data/spec/rsync_daemon_spec.rb +18 -16
- data/spec/runtime_file_reader_spec.rb +12 -12
- data/spec/runtime_recorder_spec.rb +19 -19
- data/spec/shutdown_manager_spec.rb +9 -9
- data/spec/source_tree_syncer_spec.rb +148 -61
- data/spec/spec_helper.rb +3 -0
- data/spec/support/end_to_end_helpers.rb +16 -0
- data/spec/support/stream_helpers.rb +23 -0
- data/spec/unknown_runner_spec.rb +1 -1
- data/spec/worker_manager_spec.rb +23 -23
- data/spec/worker_spec.rb +70 -70
- metadata +84 -113
- data/spec/acceptance_spec_helper.rb +0 -7
- data/spec/support/mock_app/.gitignore +0 -15
- data/spec/support/mock_app/Gemfile +0 -39
- data/spec/support/mock_app/Gemfile.lock +0 -135
- data/spec/support/mock_app/README.rdoc +0 -261
- data/spec/support/mock_app/Rakefile +0 -7
- data/spec/support/mock_app/app/assets/images/rails.png +0 -0
- data/spec/support/mock_app/app/assets/javascripts/application.js +0 -15
- data/spec/support/mock_app/app/assets/stylesheets/application.css +0 -13
- data/spec/support/mock_app/app/controllers/application_controller.rb +0 -3
- data/spec/support/mock_app/app/helpers/application_helper.rb +0 -2
- data/spec/support/mock_app/app/models/.gitkeep +0 -0
- data/spec/support/mock_app/app/views/layouts/application.html.erb +0 -14
- data/spec/support/mock_app/config.ru +0 -4
- data/spec/support/mock_app/config/application.rb +0 -62
- data/spec/support/mock_app/config/boot.rb +0 -6
- data/spec/support/mock_app/config/database.yml +0 -25
- data/spec/support/mock_app/config/environment.rb +0 -5
- data/spec/support/mock_app/config/environments/development.rb +0 -37
- data/spec/support/mock_app/config/environments/production.rb +0 -67
- data/spec/support/mock_app/config/environments/test.rb +0 -37
- data/spec/support/mock_app/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/support/mock_app/config/initializers/inflections.rb +0 -15
- data/spec/support/mock_app/config/initializers/mime_types.rb +0 -5
- data/spec/support/mock_app/config/initializers/secret_token.rb +0 -7
- data/spec/support/mock_app/config/initializers/session_store.rb +0 -8
- data/spec/support/mock_app/config/initializers/wrap_parameters.rb +0 -14
- data/spec/support/mock_app/config/locales/en.yml +0 -5
- data/spec/support/mock_app/config/routes.rb +0 -58
- data/spec/support/mock_app/db/seeds.rb +0 -7
- data/spec/support/mock_app/doc/README_FOR_APP +0 -2
- data/spec/support/mock_app/lib/assets/.gitkeep +0 -0
- data/spec/support/mock_app/lib/tasks/.gitkeep +0 -0
- data/spec/support/mock_app/log/.gitkeep +0 -0
- data/spec/support/mock_app/public/404.html +0 -26
- data/spec/support/mock_app/public/422.html +0 -26
- data/spec/support/mock_app/public/500.html +0 -25
- data/spec/support/mock_app/public/favicon.ico +0 -0
- data/spec/support/mock_app/public/index.html +0 -241
- data/spec/support/mock_app/public/robots.txt +0 -5
- data/spec/support/mock_app/script/rails +0 -6
- data/spec/support/mock_app/test/fixtures/.gitkeep +0 -0
- data/spec/support/mock_app/test/functional/.gitkeep +0 -0
- data/spec/support/mock_app/test/integration/.gitkeep +0 -0
- data/spec/support/mock_app/test/performance/browsing_test.rb +0 -12
- data/spec/support/mock_app/test/test_helper.rb +0 -13
- data/spec/support/mock_app/test/unit/.gitkeep +0 -0
- data/spec/support/mock_app/test/unit/passing_test.rb +0 -7
- data/spec/support/mock_app/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/support/mock_app/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/support/mock_app/vendor/plugins/.gitkeep +0 -0
- data/spec/support/originator_handler.rb +0 -8
data/lib/gorgon/originator.rb
CHANGED
@@ -15,218 +15,221 @@ require 'awesome_print'
|
|
15
15
|
require 'etc'
|
16
16
|
require 'socket'
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
module Gorgon
|
19
|
+
class Originator
|
20
|
+
include Configuration
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
SPEC_SUCCESS_EXIT_STATUS = 0
|
23
|
+
SPEC_FAILURE_EXIT_STATUS = 1
|
24
|
+
SYNC_ERROR_EXIT_STATUS = 2
|
25
|
+
ERROR_EXIT_STATUS = 3
|
25
26
|
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
def initialize
|
29
|
+
@configuration = nil
|
30
|
+
end
|
30
31
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
def originate
|
33
|
+
begin
|
34
|
+
Signal.trap("INT") { ctrl_c }
|
35
|
+
Signal.trap("TERM") { ctrl_c }
|
36
|
+
|
37
|
+
exit_status = publish
|
38
|
+
@logger.log "Originator finished successfully"
|
39
|
+
exit_status
|
40
|
+
rescue StandardError
|
41
|
+
$stderr.puts "Unhandled exception in originator:"
|
42
|
+
$stderr.puts $!.message
|
43
|
+
$stderr.puts $!.backtrace.join("\n")
|
44
|
+
$stderr.puts "----------------------------------"
|
45
|
+
$stderr.puts "Now attempting to cancel the job."
|
46
|
+
@logger.log_error "Unhandled Exception!" if @logger
|
47
|
+
cancel_job
|
48
|
+
exit ERROR_EXIT_STATUS
|
49
|
+
end
|
50
|
+
end
|
35
51
|
|
36
|
-
|
37
|
-
|
38
|
-
exit_status
|
39
|
-
rescue StandardError
|
40
|
-
$stderr.puts "Unhandled exception in originator:"
|
41
|
-
$stderr.puts $!.message
|
42
|
-
$stderr.puts $!.backtrace.join("\n")
|
43
|
-
$stderr.puts "----------------------------------"
|
44
|
-
$stderr.puts "Now attempting to cancel the job."
|
45
|
-
@logger.log_error "Unhandled Exception!" if @logger
|
46
|
-
cancel_job
|
47
|
-
exit ERROR_EXIT_STATUS
|
52
|
+
def cancel_job
|
53
|
+
ShutdownManager.new(protocol: @protocol, job_state: @job_state).cancel_job
|
48
54
|
end
|
49
|
-
end
|
50
55
|
|
51
|
-
|
52
|
-
|
53
|
-
|
56
|
+
def ctrl_c
|
57
|
+
puts "\nCtrl-C received! Just wait a moment while I clean up..."
|
58
|
+
cancel_job
|
59
|
+
end
|
54
60
|
|
55
|
-
|
56
|
-
|
57
|
-
cancel_job
|
58
|
-
end
|
61
|
+
def publish
|
62
|
+
exit_status = SPEC_SUCCESS_EXIT_STATUS
|
59
63
|
|
60
|
-
|
61
|
-
exit_status = SPEC_SUCCESS_EXIT_STATUS
|
64
|
+
@logger = OriginatorLogger.new configuration[:originator_log_file]
|
62
65
|
|
63
|
-
|
66
|
+
if files.empty?
|
67
|
+
$stderr.puts "There are no files to test! Quitting."
|
68
|
+
exit ERROR_EXIT_STATUS
|
69
|
+
end
|
64
70
|
|
65
|
-
|
66
|
-
$stderr.puts "There are no files to test! Quitting."
|
67
|
-
exit ERROR_EXIT_STATUS
|
68
|
-
end
|
71
|
+
cluster_id = callback_handler.before_originate
|
69
72
|
|
70
|
-
|
73
|
+
push_source_code
|
71
74
|
|
72
|
-
|
75
|
+
@protocol = OriginatorProtocol.new(@logger, cluster_id)
|
73
76
|
|
74
|
-
|
77
|
+
EventMachine.run do
|
78
|
+
publish_files_and_job
|
75
79
|
|
76
|
-
|
77
|
-
|
80
|
+
@protocol.receive_payloads do |payload|
|
81
|
+
exit_status |= handle_reply(payload)
|
82
|
+
end
|
78
83
|
|
79
|
-
|
80
|
-
|
84
|
+
@protocol.receive_new_listener_notifications do |payload|
|
85
|
+
handle_new_listener_notification(payload)
|
86
|
+
end
|
81
87
|
end
|
82
88
|
|
83
|
-
|
84
|
-
|
85
|
-
end
|
89
|
+
callback_handler.after_job_finishes
|
90
|
+
exit_status
|
86
91
|
end
|
87
92
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
def publish_files_and_job
|
93
|
-
@logger.log "Connecting..."
|
94
|
-
@protocol.connect connection_information, :on_closed => method(:on_disconnect)
|
93
|
+
def publish_files_and_job
|
94
|
+
@logger.log "Connecting..."
|
95
|
+
@protocol.connect connection_information, :on_closed => method(:on_disconnect)
|
95
96
|
|
96
|
-
|
97
|
-
|
98
|
-
|
97
|
+
@logger.log "Publishing files..."
|
98
|
+
@protocol.publish_files files
|
99
|
+
create_job_state_and_observers
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
101
|
+
@logger.log "Publishing Job..."
|
102
|
+
@protocol.publish_job_to_all job_definition
|
103
|
+
@logger.log "Job Published"
|
104
|
+
end
|
104
105
|
|
105
|
-
|
106
|
-
|
107
|
-
|
106
|
+
def callback_handler
|
107
|
+
@callback_handler ||= CallbackHandler.new(configuration[:job][:callbacks])
|
108
|
+
end
|
108
109
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
110
|
+
def push_source_code
|
111
|
+
syncer = SourceTreeSyncer.new(sync_configuration)
|
112
|
+
execution_context = syncer.push
|
113
|
+
if execution_context.success
|
114
|
+
@logger.log "Command '#{execution_context.command}' completed successfully."
|
115
|
+
else
|
116
|
+
$stderr.puts "Command '#{execution_context.command}' failed!"
|
117
|
+
$stderr.puts "Stdout:\n#{execution_context.output}"
|
118
|
+
$stderr.puts "Stderr:\n#{execution_context.errors}"
|
119
|
+
exit SYNC_ERROR_EXIT_STATUS
|
120
|
+
end
|
119
121
|
end
|
120
|
-
end
|
121
122
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
123
|
+
def cleanup_if_job_complete
|
124
|
+
if @job_state.is_job_complete?
|
125
|
+
@logger.log "Job is done"
|
126
|
+
@protocol.disconnect
|
127
|
+
end
|
126
128
|
end
|
127
|
-
end
|
128
129
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
@logger.log_message payload
|
147
|
-
# Uncomment this to see each message received by originator
|
148
|
-
# ap payload
|
149
|
-
|
150
|
-
cleanup_if_job_complete
|
151
|
-
exit_status(payload)
|
152
|
-
end
|
130
|
+
def handle_reply(payload)
|
131
|
+
payload = Yajl::Parser.new(:symbolize_keys => true).parse(payload)
|
132
|
+
|
133
|
+
# at some point this will probably need to be fancy polymorphic type based responses, or at least a nice switch statement
|
134
|
+
if payload[:action] == "finish"
|
135
|
+
@job_state.file_finished payload
|
136
|
+
elsif payload[:action] == "start"
|
137
|
+
@job_state.file_started payload
|
138
|
+
elsif payload[:type] == "crash"
|
139
|
+
@job_state.gorgon_crash_message payload
|
140
|
+
elsif payload[:type] == "exception"
|
141
|
+
# TODO
|
142
|
+
ap payload
|
143
|
+
else
|
144
|
+
ap payload
|
145
|
+
end
|
153
146
|
|
154
|
-
|
155
|
-
|
147
|
+
@logger.log_message payload
|
148
|
+
# Uncomment this to see each message received by originator
|
149
|
+
# ap payload
|
156
150
|
|
157
|
-
|
158
|
-
|
159
|
-
else
|
160
|
-
puts "Received unexpected payload on originator queue"
|
161
|
-
ap payload
|
151
|
+
cleanup_if_job_complete
|
152
|
+
exit_status(payload)
|
162
153
|
end
|
163
|
-
end
|
164
154
|
|
165
|
-
|
166
|
-
|
167
|
-
RuntimeRecorder.new @job_state, configuration[:runtime_file]
|
168
|
-
@progress_bar_view = ProgressBarView.new @job_state
|
169
|
-
@progress_bar_view.show
|
170
|
-
FailuresPrinter.new(configuration, @job_state)
|
171
|
-
end
|
155
|
+
def handle_new_listener_notification(payload)
|
156
|
+
payload = Yajl::Parser.new(:symbolize_keys => true).parse(payload)
|
172
157
|
|
173
|
-
|
174
|
-
|
175
|
-
|
158
|
+
if payload[:listener_queue_name]
|
159
|
+
@protocol.publish_job_to_one(job_definition, payload[:listener_queue_name])
|
160
|
+
else
|
161
|
+
puts "Received unexpected payload on originator queue"
|
162
|
+
ap payload
|
163
|
+
end
|
164
|
+
end
|
176
165
|
|
177
|
-
|
178
|
-
|
179
|
-
|
166
|
+
def create_job_state_and_observers
|
167
|
+
@job_state = JobState.new files.count
|
168
|
+
RuntimeRecorder.new @job_state, configuration[:runtime_file]
|
169
|
+
@progress_bar_view = ProgressBarView.new @job_state
|
170
|
+
@progress_bar_view.show
|
171
|
+
FailuresPrinter.new(configuration, @job_state)
|
172
|
+
end
|
180
173
|
|
181
|
-
|
182
|
-
|
183
|
-
|
174
|
+
def on_disconnect
|
175
|
+
EventMachine.stop
|
176
|
+
end
|
184
177
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
job_config[:sync] = {} unless job_config.has_key?(:sync)
|
189
|
-
job_config[:sync][:source_tree_path] = source_tree_path(job_config[:sync])
|
190
|
-
JobDefinition.new(configuration[:job])
|
191
|
-
end
|
178
|
+
def connection_information
|
179
|
+
configuration[:connection]
|
180
|
+
end
|
192
181
|
|
193
|
-
|
182
|
+
def files
|
183
|
+
@files ||= RuntimeFileReader.new(configuration).sorted_files
|
184
|
+
end
|
194
185
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
186
|
+
def job_definition
|
187
|
+
# TODO: remove duplication. Use sync_configuration
|
188
|
+
job_config = configuration[:job]
|
189
|
+
job_config[:sync] = {} unless job_config.has_key?(:sync)
|
190
|
+
job_config[:sync][:source_tree_path] = source_tree_path(job_config[:sync])
|
191
|
+
JobDefinition.new(configuration[:job])
|
192
|
+
end
|
199
193
|
|
200
|
-
|
201
|
-
configuration[:job].
|
202
|
-
fetch(:sync, {}).
|
203
|
-
merge(source_tree_path: source_tree_path(configuration[:job][:sync])
|
204
|
-
)
|
205
|
-
end
|
194
|
+
private
|
206
195
|
|
207
|
-
|
208
|
-
|
209
|
-
|
196
|
+
def exit_status(payload)
|
197
|
+
return SPEC_FAILURE_EXIT_STATUS if ["crash", "exception", "fail"].include?(payload[:type])
|
198
|
+
SPEC_SUCCESS_EXIT_STATUS
|
199
|
+
end
|
210
200
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
201
|
+
def sync_configuration
|
202
|
+
configuration[:job].
|
203
|
+
fetch(:sync, {}).
|
204
|
+
merge(source_tree_path: source_tree_path(configuration[:job][:sync])
|
205
|
+
)
|
215
206
|
end
|
216
|
-
end
|
217
207
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
208
|
+
def source_tree_path(sync_config)
|
209
|
+
hostname = Socket.gethostname
|
210
|
+
source_code_root = File.basename(Dir.pwd)
|
211
|
+
|
212
|
+
if sync_config && sync_config[:rsync_transport] == SourceTreeSyncer::RSYNC_TRANSPORT_SSH
|
213
|
+
"#{file_server_host}:#{hostname}_#{source_code_root}"
|
214
|
+
else
|
215
|
+
"rsync://#{file_server_host}:43434/src/#{hostname}_#{source_code_root}"
|
216
|
+
end
|
224
217
|
end
|
225
218
|
|
226
|
-
|
227
|
-
|
219
|
+
def file_server_host
|
220
|
+
if configuration[:file_server].nil?
|
221
|
+
raise <<-MSG
|
222
|
+
Missing file_server configuration.
|
223
|
+
See https://github.com/nulogy/Gorgon/blob/master/gorgon.json.sample for a sample configuration
|
224
|
+
MSG
|
225
|
+
end
|
226
|
+
|
227
|
+
configuration[:file_server][:host]
|
228
|
+
end
|
228
229
|
|
229
|
-
|
230
|
-
|
230
|
+
def configuration
|
231
|
+
@configuration ||= load_configuration_from_file("gorgon.json", merge: "gorgon_secret.json")
|
232
|
+
end
|
231
233
|
end
|
232
234
|
end
|
235
|
+
|
@@ -1,39 +1,41 @@
|
|
1
1
|
require 'gorgon/g_logger'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module Gorgon
|
4
|
+
class OriginatorLogger
|
5
|
+
include GLogger
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
def initialize log_file
|
8
|
+
initialize_logger log_file
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
def log_message(payload)
|
12
|
+
if payload[:action] == "start"
|
13
|
+
log("Started running '#{payload[:filename]}' at '#{payload[:hostname]}:#{payload[:worker_id]}'")
|
14
|
+
elsif payload[:action] == "finish"
|
15
|
+
print_finish(payload)
|
16
|
+
elsif payload[:type] == "crash" || payload[:type] == "exception"
|
17
|
+
# TODO: improve logging of these messages
|
18
|
+
log(payload)
|
19
|
+
else # to be removed
|
20
|
+
ap payload
|
21
|
+
end
|
20
22
|
end
|
21
|
-
end
|
22
23
|
|
23
|
-
|
24
|
+
private
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
def print_finish(payload)
|
27
|
+
msg = "Finished running '#{payload[:filename]}' at '#{payload[:hostname]}:#{payload[:worker_id]}'"
|
28
|
+
msg << failure_message(payload[:failures]) if payload[:type] == "fail"
|
29
|
+
log msg
|
30
|
+
end
|
30
31
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
def failure_message(failures)
|
33
|
+
msg = []
|
34
|
+
failures.each do |failure|
|
35
|
+
msg << failure
|
36
|
+
end
|
37
|
+
msg << ''
|
38
|
+
msg.join("\n")
|
35
39
|
end
|
36
|
-
msg << ''
|
37
|
-
msg.join("\n")
|
38
40
|
end
|
39
41
|
end
|