iron_worker_ng 0.9.6 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +14 -1
- data/VERSION +1 -1
- data/bin/iron_worker +307 -71
- data/lib/iron_worker_ng/api_client.rb +5 -0
- data/lib/iron_worker_ng/client.rb +45 -1
- data/lib/iron_worker_ng/code/base.rb +5 -2
- data/lib/iron_worker_ng/code/runtime/ruby.rb +23 -0
- data/lib/iron_worker_ng/feature/binary/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/go/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/java/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/mono/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/node/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/perl/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/php/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/python/merge_exec.rb +1 -1
- data/lib/iron_worker_ng/feature/ruby/merge_exec.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -48,7 +48,7 @@ runtime "ruby"
|
|
48
48
|
exec "hello_worker.rb"
|
49
49
|
```
|
50
50
|
|
51
|
-
You can read more about `.worker` files here: http://dev.iron.io/worker/reference/
|
51
|
+
You can read more about `.worker` files here: http://dev.iron.io/worker/reference/dotworker/
|
52
52
|
|
53
53
|
## Uploading the Code Package
|
54
54
|
|
@@ -77,6 +77,19 @@ client = IronWorkerNG::Client.new
|
|
77
77
|
client.tasks.create("hello", "foo"=>"bar")
|
78
78
|
end
|
79
79
|
```
|
80
|
+
|
81
|
+
## Retry a Task
|
82
|
+
|
83
|
+
You can retry task by id using same payload and options:
|
84
|
+
|
85
|
+
iron_worker retry 5032f7360a4681382838e082
|
86
|
+
|
87
|
+
or
|
88
|
+
```ruby
|
89
|
+
client.tasks.retry('5032f7360a4681382838e082', :delay => 10)
|
90
|
+
```
|
91
|
+
|
92
|
+
|
80
93
|
### Debugging
|
81
94
|
|
82
95
|
To get a bunch of extra output to debug things, turn it on using:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
data/bin/iron_worker
CHANGED
@@ -4,28 +4,57 @@ require 'optparse'
|
|
4
4
|
require 'time'
|
5
5
|
require 'iron_worker_ng'
|
6
6
|
|
7
|
+
LOG_GROUP = '------> '
|
8
|
+
LOG_ENTRY = ' '
|
9
|
+
|
7
10
|
class IronWorkerCLILoggerFormatter < ::Logger::Formatter
|
8
11
|
def call(severity, time, proname, msg)
|
12
|
+
msg = LOG_ENTRY + msg unless msg.start_with?(LOG_GROUP)
|
9
13
|
msg + "\n"
|
10
14
|
end
|
11
15
|
end
|
12
16
|
|
17
|
+
IronCore::Logger.logger.formatter = IronWorkerCLILoggerFormatter.new
|
18
|
+
|
19
|
+
def log(msg)
|
20
|
+
IronCore::Logger.info 'IronWorkerNG', msg
|
21
|
+
end
|
22
|
+
|
13
23
|
@env = nil
|
24
|
+
@project_id = nil
|
14
25
|
|
15
26
|
def create_client
|
16
|
-
|
27
|
+
log "#{LOG_GROUP}Detecting Configuration"
|
28
|
+
|
29
|
+
client = IronWorkerNG::Client.new(:env => @env, :project_id => @project_id)
|
17
30
|
|
18
31
|
project = client.projects.get
|
19
|
-
|
20
|
-
|
32
|
+
|
33
|
+
log "Project '#{project.name}' with id='#{project.id}'"
|
21
34
|
|
22
35
|
client
|
23
36
|
end
|
24
37
|
|
25
|
-
def
|
38
|
+
def common_opts(opts)
|
26
39
|
opts.on('-e', '--env ENV', 'environment') do |v|
|
27
40
|
@env = v
|
28
41
|
end
|
42
|
+
|
43
|
+
opts.on('--project-id PROJECT_ID', 'project_id') do |v|
|
44
|
+
@project_id = v
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_time(str)
|
49
|
+
t = Time.parse(str)
|
50
|
+
|
51
|
+
return nil if t == Time.utc(1)
|
52
|
+
|
53
|
+
def t.to_s
|
54
|
+
strftime('%a %b %-d %T')
|
55
|
+
end
|
56
|
+
|
57
|
+
return t
|
29
58
|
end
|
30
59
|
|
31
60
|
if $*.size == 1 && ($*[0] == '-v' || $*[0] == '--version')
|
@@ -33,48 +62,42 @@ if $*.size == 1 && ($*[0] == '-v' || $*[0] == '--version')
|
|
33
62
|
exit 0
|
34
63
|
end
|
35
64
|
|
36
|
-
if $*.size == 0 || (not ['
|
65
|
+
if $*.size == 0 || (not ['upload', 'queue', 'retry', 'schedule', 'log', 'run', 'webhook', 'info', 'install'].include?($*[0]))
|
37
66
|
puts 'usage: iron_worker COMMAND [OPTIONS]'
|
38
|
-
puts ' COMMAND:
|
67
|
+
puts ' COMMAND: upload, queue, retry, schedule, log, run, webhook, info, install'
|
39
68
|
puts ' run iron_worker COMMAND --help to get more information about each command'
|
40
69
|
exit 1
|
41
70
|
end
|
42
71
|
|
43
72
|
command = $*.shift
|
44
73
|
|
45
|
-
command = 'codes.create' if command == 'upload'
|
46
|
-
command = 'tasks.create' if command == 'queue'
|
47
|
-
command = 'schedules.create' if command == 'schedule'
|
48
|
-
command = 'tasks.log' if command == 'log'
|
49
|
-
|
50
|
-
IronCore::Logger.logger.formatter = IronWorkerCLILoggerFormatter.new
|
51
|
-
|
52
74
|
if $*.include?('--debug')
|
53
75
|
IronCore::Logger.logger.level = ::Logger::DEBUG
|
54
76
|
|
55
77
|
$*.reject! { |p| p == '--debug' }
|
56
78
|
end
|
57
79
|
|
58
|
-
if command == '
|
59
|
-
|
60
|
-
$*.unshift('-n')
|
61
|
-
end
|
80
|
+
if command == 'upload'
|
81
|
+
options = {}
|
62
82
|
|
63
83
|
name = nil
|
64
|
-
options = {}
|
65
84
|
|
66
85
|
opts = OptionParser.new do |opts|
|
67
|
-
opts.banner = "usage: iron_worker
|
86
|
+
opts.banner = "usage: iron_worker upload CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPTIONS]"
|
68
87
|
|
69
|
-
opts.on('-n', '--name NAME', 'code name
|
88
|
+
opts.on('-n', '--name NAME', 'override for code name') do |v|
|
70
89
|
name = v
|
71
90
|
end
|
72
91
|
|
73
|
-
opts.on('-c', '--max-concurrency
|
92
|
+
opts.on('-c', '--max-concurrency CONCURRENCY', Integer, 'max number of concurrent workers for this code package') do |v|
|
74
93
|
options[:max_concurrency] = v
|
75
94
|
end
|
76
95
|
|
77
|
-
|
96
|
+
opts.on('-a', '--async', 'don\'t wait for package build') do |v|
|
97
|
+
options[:async] = true
|
98
|
+
end
|
99
|
+
|
100
|
+
common_opts(opts)
|
78
101
|
end
|
79
102
|
|
80
103
|
begin
|
@@ -84,26 +107,46 @@ if command == 'codes.create'
|
|
84
107
|
exit 1
|
85
108
|
end
|
86
109
|
|
87
|
-
|
110
|
+
unless $*.size == 1
|
111
|
+
puts 'Please specify name or path to workerfile'
|
88
112
|
puts opts
|
89
113
|
exit 1
|
90
114
|
end
|
91
115
|
|
92
116
|
client = create_client
|
93
117
|
|
94
|
-
|
95
|
-
|
96
|
-
IronCore::Logger.info 'IronWorkerNG', "Worker '#{code.name}' upload started"
|
97
|
-
|
98
|
-
client.codes.create(code, options)
|
118
|
+
log "#{LOG_GROUP}Discovering workerfile"
|
99
119
|
|
100
|
-
|
101
|
-
elsif command == 'tasks.create' || command == 'schedules.create'
|
102
|
-
if $*.size > 0 && $*[0][0] != '-'
|
103
|
-
$*.unshift('-n')
|
104
|
-
end
|
120
|
+
code = IronWorkerNG::Code::Base.new($*[0])
|
105
121
|
|
106
|
-
name
|
122
|
+
code.name(name) if name
|
123
|
+
|
124
|
+
log "Code package name is '#{code.name}'"
|
125
|
+
|
126
|
+
log "Max concurrency set to '#{options[:max_concurrency]}'" if options[:max_concurrency]
|
127
|
+
|
128
|
+
if code.remote_build_command
|
129
|
+
log "#{LOG_GROUP}Remote building '#{code.name}'"
|
130
|
+
|
131
|
+
async = options[:async]
|
132
|
+
|
133
|
+
builder_task_id = client.codes.create(code, options)
|
134
|
+
|
135
|
+
if async
|
136
|
+
log "Check 'https://hud.iron.io/tq/projects/#{client.api.project_id}/jobs/#{builder_task_id}' for more info"
|
137
|
+
else
|
138
|
+
# TODO: output the same info as for builderless upload
|
139
|
+
end
|
140
|
+
else
|
141
|
+
log "#{LOG_GROUP}Uploading code package"
|
142
|
+
|
143
|
+
code_id = client.codes.create(code, options).id
|
144
|
+
code_info = client.codes.get(code_id)
|
145
|
+
|
146
|
+
log "Code package uploaded with id='#{code_id}' and revision='#{code_info.rev}'"
|
147
|
+
log "Check 'https://hud.iron.io/tq/projects/#{client.api.project_id}/code/#{code_id}' for more info"
|
148
|
+
end
|
149
|
+
elsif command == 'queue' || command == 'schedule'
|
107
150
|
payload = nil
|
108
151
|
payload_file = nil
|
109
152
|
|
@@ -119,11 +162,7 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
119
162
|
print_id = false
|
120
163
|
|
121
164
|
opts = OptionParser.new do |opts|
|
122
|
-
opts.banner = "usage: iron_worker #{command} [OPTIONS]"
|
123
|
-
|
124
|
-
opts.on('-n', '--name NAME', 'code name') do |v|
|
125
|
-
name = v
|
126
|
-
end
|
165
|
+
opts.banner = "usage: iron_worker #{command} CODE_PACKAGE_NAME [OPTIONS]"
|
127
166
|
|
128
167
|
opts.on('-p', '--payload PAYLOAD', String, 'payload to pass') do |v|
|
129
168
|
payload = v
|
@@ -145,7 +184,7 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
145
184
|
delay = v
|
146
185
|
end
|
147
186
|
|
148
|
-
if command == '
|
187
|
+
if command == 'schedule'
|
149
188
|
opts.on('--start-at TIME', 'start task at specified time') do |v|
|
150
189
|
start_at = Time.parse(v)
|
151
190
|
end
|
@@ -167,7 +206,7 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
167
206
|
print_id = true
|
168
207
|
end
|
169
208
|
|
170
|
-
|
209
|
+
common_opts(opts)
|
171
210
|
end
|
172
211
|
|
173
212
|
begin
|
@@ -177,11 +216,14 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
177
216
|
exit 1
|
178
217
|
end
|
179
218
|
|
180
|
-
|
219
|
+
unless $*.size == 1
|
220
|
+
puts 'Please specify code package name'
|
181
221
|
puts opts
|
182
222
|
exit 1
|
183
223
|
end
|
184
224
|
|
225
|
+
name = $*[0]
|
226
|
+
|
185
227
|
if payload.nil? and (not payload_file.nil?)
|
186
228
|
payload = File.read(payload_file)
|
187
229
|
end
|
@@ -192,7 +234,7 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
192
234
|
options[:timeout] = timeout unless timeout.nil?
|
193
235
|
options[:delay] = delay unless delay.nil?
|
194
236
|
|
195
|
-
if command == '
|
237
|
+
if command == 'schedule'
|
196
238
|
options[:start_at] = start_at unless start_at.nil?
|
197
239
|
options[:end_at] = end_at unless end_at.nil?
|
198
240
|
options[:run_times] = run_times unless run_times.nil?
|
@@ -203,38 +245,74 @@ elsif command == 'tasks.create' || command == 'schedules.create'
|
|
203
245
|
|
204
246
|
id = nil
|
205
247
|
|
206
|
-
if command == '
|
248
|
+
if command == 'queue'
|
249
|
+
log "#{LOG_GROUP}Queueing task"
|
250
|
+
|
207
251
|
id = client.tasks.create(name, payload, options).id
|
208
252
|
|
209
|
-
|
253
|
+
log "#{LOG_GROUP}Worker '#{name}' queued with id='#{id}'"
|
254
|
+
|
255
|
+
log "Check 'https://hud.iron.io/tq/projects/#{client.api.project_id}/jobs/#{id}' for more info"
|
210
256
|
else
|
257
|
+
log "#{LOG_GROUP}Scheduling task"
|
258
|
+
|
211
259
|
id = client.schedules.create(name, payload, options).id
|
212
260
|
|
213
|
-
|
261
|
+
log "#{LOG_GROUP}Worker '#{name}' scheduled with id='#{id}'"
|
262
|
+
|
263
|
+
log "Check 'https://hud.iron.io/tq/projects/#{client.api.project_id}/scheduled_jobs/#{id}' for more info"
|
214
264
|
end
|
215
265
|
|
216
266
|
puts id if print_id
|
217
|
-
elsif command == '
|
218
|
-
|
219
|
-
|
267
|
+
elsif command == 'retry'
|
268
|
+
options = {}
|
269
|
+
|
270
|
+
opts = OptionParser.new do |opts|
|
271
|
+
opts.banner = "usage: iron_worker retry TASK_ID [OPTIONS]"
|
272
|
+
|
273
|
+
opts.on('--delay DELAY', Integer, 'delay before start in seconds') do |v|
|
274
|
+
options[:delay] = v
|
275
|
+
end
|
276
|
+
|
277
|
+
common_opts(opts)
|
278
|
+
end
|
279
|
+
|
280
|
+
begin
|
281
|
+
opts.parse!
|
282
|
+
rescue OptionParser::ParseError
|
283
|
+
puts $!.to_s
|
284
|
+
exit 1
|
220
285
|
end
|
221
286
|
|
222
|
-
|
287
|
+
unless $*.size == 1
|
288
|
+
puts 'Please specify task id'
|
289
|
+
puts opts
|
290
|
+
exit 1
|
291
|
+
end
|
292
|
+
|
293
|
+
task_id = $*.first
|
294
|
+
|
295
|
+
client = create_client
|
296
|
+
|
297
|
+
log "#{LOG_GROUP}Retrying task with id='#{task_id}'"
|
298
|
+
|
299
|
+
retry_task_id = client.tasks.retry(task_id, options).id
|
300
|
+
|
301
|
+
log "Retry task id='#{retry_task_id}'"
|
302
|
+
|
303
|
+
log "Check 'https://hud.iron.io/tq/projects/#{client.api.project_id}/jobs/#{retry_task_id}' for more info"
|
304
|
+
elsif command == 'log'
|
223
305
|
live = false
|
224
306
|
wait = false
|
225
307
|
|
226
308
|
opts = OptionParser.new do |opts|
|
227
|
-
opts.banner = "usage: iron_worker
|
228
|
-
|
229
|
-
opts.on('-t', '--task-id ID', 'task id') do |v|
|
230
|
-
task_id = v
|
231
|
-
end
|
309
|
+
opts.banner = "usage: iron_worker log TASK_ID [OPTIONS]"
|
232
310
|
|
233
311
|
opts.on('-w', '--wait', 'wait for task') do |v|
|
234
312
|
wait = true
|
235
313
|
end
|
236
314
|
|
237
|
-
|
315
|
+
common_opts(opts)
|
238
316
|
end
|
239
317
|
|
240
318
|
begin
|
@@ -244,13 +322,18 @@ elsif command == 'tasks.log'
|
|
244
322
|
exit 1
|
245
323
|
end
|
246
324
|
|
247
|
-
|
325
|
+
unless $*.size == 1
|
326
|
+
puts 'Please specify task id'
|
248
327
|
puts opts
|
249
328
|
exit 1
|
250
329
|
end
|
251
330
|
|
331
|
+
task_id = $*.first
|
332
|
+
|
252
333
|
client = create_client
|
253
334
|
|
335
|
+
log "#{LOG_GROUP}Getting log for task with id='#{task_id}'"
|
336
|
+
|
254
337
|
log = ''
|
255
338
|
|
256
339
|
if live
|
@@ -287,20 +370,11 @@ elsif command == 'tasks.log'
|
|
287
370
|
end
|
288
371
|
end
|
289
372
|
elsif command == 'run'
|
290
|
-
if $*.size > 0 && $*[0][0] != '-'
|
291
|
-
$*.unshift('-n')
|
292
|
-
end
|
293
|
-
|
294
|
-
name = nil
|
295
373
|
payload = nil
|
296
374
|
payload_file = nil
|
297
375
|
|
298
376
|
opts = OptionParser.new do |opts|
|
299
|
-
opts.banner = "usage: iron_worker
|
300
|
-
|
301
|
-
opts.on('-n', '--name NAME', 'code name or workerfile') do |v|
|
302
|
-
name = v
|
303
|
-
end
|
377
|
+
opts.banner = "usage: iron_worker run CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPTIONS]"
|
304
378
|
|
305
379
|
opts.on('-p', '--payload PAYLOAD', String, 'payload to pass') do |v|
|
306
380
|
payload = v
|
@@ -309,6 +383,8 @@ elsif command == 'run'
|
|
309
383
|
opts.on('-f', '--payload-file PAYLOAD_FILE', String, 'payload file to pass') do |v|
|
310
384
|
payload_file = v
|
311
385
|
end
|
386
|
+
|
387
|
+
common_opts(opts)
|
312
388
|
end
|
313
389
|
|
314
390
|
begin
|
@@ -318,7 +394,8 @@ elsif command == 'run'
|
|
318
394
|
exit 1
|
319
395
|
end
|
320
396
|
|
321
|
-
|
397
|
+
unless $*.size == 1
|
398
|
+
puts 'Please specify code package name or workerfile'
|
322
399
|
puts opts
|
323
400
|
exit 1
|
324
401
|
end
|
@@ -327,9 +404,168 @@ elsif command == 'run'
|
|
327
404
|
payload = File.read(payload_file)
|
328
405
|
end
|
329
406
|
|
330
|
-
|
407
|
+
log "#{LOG_GROUP}Discovering workerfile"
|
408
|
+
|
409
|
+
code = IronWorkerNG::Code::Base.new($*.first)
|
410
|
+
|
411
|
+
log "Code package name is '#{code.name}'"
|
412
|
+
|
413
|
+
log "#{LOG_GROUP}Running '#{code.name}'"
|
331
414
|
|
332
|
-
IronCore::Logger.info 'IronWorkerNG', "Worker '#{name}' run started"
|
333
|
-
|
334
415
|
code.run(payload)
|
416
|
+
elsif command == 'webhook'
|
417
|
+
opts = OptionParser.new do |opts|
|
418
|
+
opts.banner = 'usage: iron_worker webhook CODE_PACKAGE_NAME [OPTIONS]'
|
419
|
+
|
420
|
+
common_opts(opts)
|
421
|
+
end
|
422
|
+
|
423
|
+
begin
|
424
|
+
opts.parse!
|
425
|
+
rescue OptionParser::ParseError
|
426
|
+
puts $!.to_s
|
427
|
+
exit 1
|
428
|
+
end
|
429
|
+
|
430
|
+
unless $*.size == 1
|
431
|
+
puts 'Please specify code package name'
|
432
|
+
puts opts
|
433
|
+
exit 1
|
434
|
+
end
|
435
|
+
|
436
|
+
name = $*[0]
|
437
|
+
|
438
|
+
client = create_client
|
439
|
+
|
440
|
+
log "#{LOG_GROUP}Detecting webhook for code package with name='#{name}'"
|
441
|
+
log "Use POST to 'https://worker-aws-us-east-1.iron.io/2/projects/#{client.api.project_id}/tasks/webhook?code_name=#{name}&oauth=#{client.api.token}' to invoke worker via webhook"
|
442
|
+
elsif command == 'info'
|
443
|
+
unless $*.size == 2 or %w(info task ).include? $*.first
|
444
|
+
puts 'Usage: iron_worker info <code|task|schedule> NAME_OR_ID'
|
445
|
+
exit 1
|
446
|
+
end
|
447
|
+
|
448
|
+
entity, id = $*
|
449
|
+
client = create_client
|
450
|
+
|
451
|
+
if entity == 'code'
|
452
|
+
code = client.codes.list(:all => true).find { |c| c.name == id }
|
453
|
+
|
454
|
+
unless code
|
455
|
+
log "#{LOG_GROUP}Code named '#{id}' not found"
|
456
|
+
exit 1
|
457
|
+
end
|
458
|
+
|
459
|
+
latest_change = parse_time(code.latest_change)
|
460
|
+
created_at = parse_time(code.created_at)
|
461
|
+
(<<EOL
|
462
|
+
#{LOG_GROUP}Code package '#{code.name}'
|
463
|
+
ID: #{code.id}
|
464
|
+
Created: #{created_at}
|
465
|
+
Last Modified: #{latest_change}
|
466
|
+
Revision: #{code.rev}
|
467
|
+
All Revisions: https://hud.iron.io/tq/projects/#{client.api.project_id}/code/#{code.id}
|
468
|
+
Tasks: https://hud.iron.io/tq/projects/#{client.api.project_id}/jobs/#{code.id}/activity
|
469
|
+
EOL
|
470
|
+
).lines.each{ |msg| log msg.chomp }
|
471
|
+
end
|
472
|
+
|
473
|
+
if entity == 'task'
|
474
|
+
begin
|
475
|
+
prev_level = IronCore::Logger.logger.level
|
476
|
+
IronCore::Logger.logger.level = ::Logger::FATAL
|
477
|
+
task = client.tasks.get(id)
|
478
|
+
rescue IronCore::Error, Rest::RestError
|
479
|
+
# iron_core throws exception if id not found
|
480
|
+
IronCore::Logger.logger.level = prev_level
|
481
|
+
log "#{LOG_GROUP}Task with id #{id} not found"
|
482
|
+
exit(1)
|
483
|
+
ensure
|
484
|
+
IronCore::Logger.logger.level = prev_level
|
485
|
+
end
|
486
|
+
|
487
|
+
queued = parse_time(task.created_at)
|
488
|
+
started = parse_time(task.start_time)
|
489
|
+
finished = parse_time(task.end_time)
|
490
|
+
|
491
|
+
if finished
|
492
|
+
total = finished - started
|
493
|
+
|
494
|
+
seconds = total % 60
|
495
|
+
minutes = (total / 60) % 60
|
496
|
+
hours = total / (60 * 60)
|
497
|
+
|
498
|
+
duration = format("%02d:%02d:%02d", hours, minutes, seconds)
|
499
|
+
end
|
500
|
+
|
501
|
+
log "#{LOG_GROUP}Task id #{id} found"
|
502
|
+
log "Code Package: '#{task.code_name}', rev #{task.code_rev}, download: https://hud.iron.io/tq/projects/#{client.api.project_id}/code/#{task.code_id}/download?hid=#{task.code_history_id}"
|
503
|
+
log " Status: #{task.status}"
|
504
|
+
log " Priority: #{task.priority}" if task.priority
|
505
|
+
log " Queued: #{queued}"
|
506
|
+
log " Started: #{started}" if started
|
507
|
+
log " Finished: #{finished}" if finished
|
508
|
+
log " Duration: #{duration}" if finished
|
509
|
+
log " Payload: #{task.payload}" unless task.payload == 'null'
|
510
|
+
log "Task Details: https://hud.iron.io/tq/projects/#{client.api.project_id}/jobs/#{task.id}"
|
511
|
+
end
|
512
|
+
|
513
|
+
if entity == 'schedule'
|
514
|
+
begin
|
515
|
+
prev_level = IronCore::Logger.logger.level
|
516
|
+
IronCore::Logger.logger.level = ::Logger::FATAL
|
517
|
+
schedule = client.schedules.get(id)
|
518
|
+
rescue IronCore::Error, Rest::RestError
|
519
|
+
# iron_core throws exception if id not found
|
520
|
+
IronCore::Logger.logger.level = prev_level
|
521
|
+
log "#{LOG_GROUP}Schedule with id #{id} not found"
|
522
|
+
exit(1)
|
523
|
+
ensure
|
524
|
+
IronCore::Logger.logger.level = prev_level
|
525
|
+
end
|
526
|
+
|
527
|
+
start_at = parse_time(schedule.start_at)
|
528
|
+
end_at = parse_time(schedule.end_at)
|
529
|
+
next_start = parse_time(schedule.next_start)
|
530
|
+
last_run_time = parse_time(schedule.last_run_time)
|
531
|
+
|
532
|
+
log "#{LOG_GROUP}Schedule id #{id} found"
|
533
|
+
log " Code Name: #{schedule.code_name}"
|
534
|
+
log " Created: #{parse_time(schedule.created_at)}"
|
535
|
+
log " Message: #{schedule.msg}" if schedule.msg
|
536
|
+
log " Status: #{schedule.status}"
|
537
|
+
log " Start: #{start_at}" if start_at
|
538
|
+
log " End: #{end_at}" if end_at
|
539
|
+
log "Next Start: #{next_start}" if next_start
|
540
|
+
log " Run Count: #{schedule.run_count}" if schedule.run_count
|
541
|
+
log " Payload: #{schedule.payload}" unless schedule.payload == 'null'
|
542
|
+
log " Details: https://hud.iron.io/tq/projects/#{client.api.project_id}/scheduled_jobs/#{id}"
|
543
|
+
end
|
544
|
+
elsif command == 'install'
|
545
|
+
opts = OptionParser.new do |opts|
|
546
|
+
opts.banner = 'usage: iron_worker install CODE_PACKAGE_NAME_OR_PATH_TO_WORKERFILE [OPTIONS]'
|
547
|
+
|
548
|
+
common_opts(opts)
|
549
|
+
end
|
550
|
+
|
551
|
+
begin
|
552
|
+
opts.parse!
|
553
|
+
rescue OptionParser::ParseError
|
554
|
+
puts $!.to_s
|
555
|
+
exit 1
|
556
|
+
end
|
557
|
+
|
558
|
+
unless $*.size == 1
|
559
|
+
puts 'Please specify code package name or path to workerfile'
|
560
|
+
puts opts
|
561
|
+
exit 1
|
562
|
+
end
|
563
|
+
|
564
|
+
name = $*[0]
|
565
|
+
|
566
|
+
log "#{LOG_GROUP}Installing worker dependencies for code package with name='#{name}'"
|
567
|
+
|
568
|
+
code = IronWorkerNG::Code::Base.new(name)
|
569
|
+
|
570
|
+
code.install
|
335
571
|
end
|
@@ -91,6 +91,11 @@ module IronWorkerNG
|
|
91
91
|
parse_response(post("projects/#{@project_id}/tasks/#{id}/progress", options))
|
92
92
|
end
|
93
93
|
|
94
|
+
def tasks_retry(id, options = {})
|
95
|
+
check_id(id)
|
96
|
+
parse_response(post("projects/#{@project_id}/tasks/#{id}/retry", options))
|
97
|
+
end
|
98
|
+
|
94
99
|
def schedules_list(options = {})
|
95
100
|
parse_response(get("projects/#{@project_id}/schedules", options))
|
96
101
|
end
|
@@ -51,7 +51,27 @@ module IronWorkerNG
|
|
51
51
|
def codes_list(options = {})
|
52
52
|
IronCore::Logger.debug 'IronWorkerNG', "Calling codes.list with options='#{options.to_s}'"
|
53
53
|
|
54
|
-
|
54
|
+
all = options.delete(:all) || options.delete('all')
|
55
|
+
|
56
|
+
if all
|
57
|
+
result = []
|
58
|
+
|
59
|
+
page = options[:page] || options['page'] || 0
|
60
|
+
per_page = options[:per_page] || options['per_page'] || 100
|
61
|
+
|
62
|
+
while true
|
63
|
+
next_codes = codes_list(options.merge({:page => page}))
|
64
|
+
|
65
|
+
result += next_codes
|
66
|
+
|
67
|
+
break if next_codes.length != per_page
|
68
|
+
page += 1
|
69
|
+
end
|
70
|
+
|
71
|
+
result
|
72
|
+
else
|
73
|
+
@api.codes_list(options)['codes'].map { |c| OpenStruct.new(c) }
|
74
|
+
end
|
55
75
|
end
|
56
76
|
|
57
77
|
def codes_get(code_id)
|
@@ -63,6 +83,8 @@ module IronWorkerNG
|
|
63
83
|
def codes_create(code, options = {})
|
64
84
|
IronCore::Logger.debug 'IronWorkerNG', "Calling codes.create with code='#{code.to_s}' and options='#{options.to_s}'"
|
65
85
|
|
86
|
+
async = options.delete(:async) || options.delete('async')
|
87
|
+
|
66
88
|
container_file = code.create_container
|
67
89
|
|
68
90
|
if code.remote_build_command.nil?
|
@@ -70,13 +92,27 @@ module IronWorkerNG
|
|
70
92
|
else
|
71
93
|
builder_code_name = code.name + (code.name.capitalize == code.name ? '::Builder' : '::builder')
|
72
94
|
|
95
|
+
IronCore::Logger.info 'IronWorkerNG', 'Uploading builder'
|
96
|
+
|
73
97
|
@api.codes_create(builder_code_name, container_file, 'sh', '__runner__.sh', options)
|
74
98
|
|
75
99
|
builder_task = tasks.create(builder_code_name, :code_name => code.name, :client_options => @api.options.to_json, :codes_create_options => options.to_json)
|
100
|
+
|
101
|
+
if async
|
102
|
+
IronCore::Logger.info 'IronWorkerNG', 'Running builder asynchronously'
|
103
|
+
|
104
|
+
File.unlink(container_file)
|
105
|
+
|
106
|
+
return builder_task.id
|
107
|
+
end
|
108
|
+
|
109
|
+
IronCore::Logger.info 'IronWorkerNG', 'Waiting for builder to complete'
|
110
|
+
|
76
111
|
builder_task = tasks.wait_for(builder_task.id)
|
77
112
|
|
78
113
|
unless builder_task.status == 'complete'
|
79
114
|
log = tasks.log(builder_task.id)
|
115
|
+
|
80
116
|
IronCore::Logger.error 'IronWorkerNG', 'Error while remote building worker: ' + log, IronCore::Error
|
81
117
|
end
|
82
118
|
|
@@ -182,6 +218,14 @@ module IronWorkerNG
|
|
182
218
|
task
|
183
219
|
end
|
184
220
|
|
221
|
+
def tasks_retry(task_id, options = {})
|
222
|
+
IronCore::Logger.debug 'IronWorkerNG', "Calling tasks.retry with task_id='#{task_id}' and options='#{options.to_s}'"
|
223
|
+
|
224
|
+
res = @api.tasks_retry(task_id, options)
|
225
|
+
|
226
|
+
OpenStruct.new(res['tasks'][0])
|
227
|
+
end
|
228
|
+
|
185
229
|
def schedules_list(options = {})
|
186
230
|
IronCore::Logger.debug 'IronWorkerNG', "Calling schedules.list with options='#{options.to_s}'"
|
187
231
|
|
@@ -73,7 +73,7 @@ module IronWorkerNG
|
|
73
73
|
src, clean = IronWorkerNG::Fetcher.fetch(wfile)
|
74
74
|
|
75
75
|
unless src.nil?
|
76
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
76
|
+
IronCore::Logger.info 'IronWorkerNG', "Found workerfile with path='#{wfile}'"
|
77
77
|
|
78
78
|
eval(src)
|
79
79
|
|
@@ -136,7 +136,7 @@ module IronWorkerNG
|
|
136
136
|
return @runtime unless runtime
|
137
137
|
|
138
138
|
unless @runtime.nil?
|
139
|
-
IronCore::Logger.error 'IronWorkerNG', "Runtime is already set to #{@runtime}", IronCore::Error
|
139
|
+
IronCore::Logger.error 'IronWorkerNG', "Runtime is already set to '#{@runtime}'", IronCore::Error
|
140
140
|
end
|
141
141
|
|
142
142
|
runtime_module = nil
|
@@ -281,6 +281,9 @@ RUNNER
|
|
281
281
|
FileUtils.rm_f(container_name)
|
282
282
|
end
|
283
283
|
|
284
|
+
def install
|
285
|
+
end
|
286
|
+
|
284
287
|
def to_s
|
285
288
|
"runtime='#{@runtime}', name='#{@name}', exec='#{@inside_builder || @exec.nil? ? '' : @exec.path}'"
|
286
289
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'fileutils'
|
3
|
+
|
1
4
|
require_relative '../../feature/ruby/merge_gem'
|
2
5
|
require_relative '../../feature/ruby/merge_gemfile'
|
3
6
|
require_relative '../../feature/ruby/merge_exec'
|
@@ -90,6 +93,26 @@ RUBY_RUNNER
|
|
90
93
|
#{local ? 'GEM_PATH="" ' : ''}ruby __runner__.rb "$@"
|
91
94
|
RUN_CODE
|
92
95
|
end
|
96
|
+
|
97
|
+
def install
|
98
|
+
gemfile_dir = Dir.tmpdir + '/' + Dir::Tmpname.make_tmpname('iron-worker-ng-', 'gemfile')
|
99
|
+
|
100
|
+
FileUtils.mkdir(gemfile_dir)
|
101
|
+
|
102
|
+
gemfile = File.open(gemfile_dir + '/Gemfile', 'w')
|
103
|
+
|
104
|
+
gemfile.puts('source :rubygems')
|
105
|
+
|
106
|
+
@merge_gem_reqs.each do |req|
|
107
|
+
gemfile.puts("gem '#{req.name}', '#{req.requirement.to_s}'")
|
108
|
+
end
|
109
|
+
|
110
|
+
gemfile.close
|
111
|
+
|
112
|
+
puts `cd #{gemfile_dir} && bundle install`
|
113
|
+
|
114
|
+
FileUtils.rm_r(gemfile_dir)
|
115
|
+
end
|
93
116
|
end
|
94
117
|
end
|
95
118
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Binary::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected binary exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Go::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected go exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -41,7 +41,7 @@ module IronWorkerNG
|
|
41
41
|
|
42
42
|
@exec = IronWorkerNG::Feature::Java::MergeExec::Feature.new(self, path, klass)
|
43
43
|
|
44
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
44
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected java exec with path='#{path}'#{klass.nil? ? '' : " and class='#{klass}'"}"
|
45
45
|
|
46
46
|
@features << @exec
|
47
47
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Mono::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected mono exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Node::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected node exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Perl::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected perl exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::PHP::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected php exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -35,7 +35,7 @@ module IronWorkerNG
|
|
35
35
|
|
36
36
|
@exec = IronWorkerNG::Feature::Python::MergeExec::Feature.new(self, path)
|
37
37
|
|
38
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
38
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected python exec with path='#{path}'"
|
39
39
|
|
40
40
|
@features << @exec
|
41
41
|
end
|
@@ -37,7 +37,7 @@ module IronWorkerNG
|
|
37
37
|
|
38
38
|
@exec = IronWorkerNG::Feature::Ruby::MergeExec::Feature.new(self, path, klass)
|
39
39
|
|
40
|
-
IronCore::Logger.info 'IronWorkerNG', "
|
40
|
+
IronCore::Logger.info 'IronWorkerNG', "Detected ruby exec with path='#{path}'#{klass.nil? ? '' : " and class='#{klass}'"}"
|
41
41
|
|
42
42
|
@features << @exec
|
43
43
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iron_worker_ng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: iron_core
|
@@ -162,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
162
162
|
version: '0'
|
163
163
|
segments:
|
164
164
|
- 0
|
165
|
-
hash:
|
165
|
+
hash: -556831631
|
166
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
167
|
none: false
|
168
168
|
requirements:
|