task-orchestrator 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/flock +12 -0
- data/examples/timeouts +4 -4
- data/lib/orchestrator/cli.rb +4 -1
- data/lib/orchestrator/task.rb +68 -2
- data/lib/orchestrator/version.rb +1 -1
- metadata +8 -7
data/examples/flock
ADDED
data/examples/timeouts
CHANGED
@@ -8,10 +8,10 @@ orchestrator:
|
|
8
8
|
# on_failure: die
|
9
9
|
on_failure: ignore
|
10
10
|
scripts:
|
11
|
-
- command: sleep
|
12
|
-
timeout:
|
13
|
-
- command: sleep
|
14
|
-
timeout:
|
11
|
+
- command: sleep 50
|
12
|
+
timeout: 10
|
13
|
+
- command: sleep 10
|
14
|
+
timeout: 5
|
15
15
|
timeouts2:
|
16
16
|
description: timeouts test 2
|
17
17
|
save: true
|
data/lib/orchestrator/cli.rb
CHANGED
@@ -32,7 +32,10 @@ module Orchestrator
|
|
32
32
|
end
|
33
33
|
|
34
34
|
options.reset = false
|
35
|
-
parser.on( '--reset', 'Do not use state file if it exists' ) {
|
35
|
+
parser.on( '--reset', 'Do not use state file if it exists' ) { options.reset = true }
|
36
|
+
|
37
|
+
options.kill = false
|
38
|
+
parser.on( '--kill', 'Kill running task based on statefile pid then lock can not be acquired' ) { options.kill = true }
|
36
39
|
|
37
40
|
parser.on( '--args ARGS,', Array, 'extra args for interpolation as arg1=val1,arg2=val2,...]' ) do |extra_args|
|
38
41
|
extra_args.each do |extra_arg|
|
data/lib/orchestrator/task.rb
CHANGED
@@ -14,6 +14,8 @@ module Orchestrator
|
|
14
14
|
Thread.abort_on_exception = true
|
15
15
|
@log = ''
|
16
16
|
|
17
|
+
@children = {}
|
18
|
+
|
17
19
|
@options = options
|
18
20
|
|
19
21
|
@defaults = {}
|
@@ -32,7 +34,52 @@ module Orchestrator
|
|
32
34
|
FileUtils.mkdir_p(@settings['orchestrator']['statedir'])
|
33
35
|
end
|
34
36
|
end
|
35
|
-
|
37
|
+
|
38
|
+
if @options.statefile
|
39
|
+
if File.exist?(@options.statefile)
|
40
|
+
File.open(@options.statefile, "r") do |file|
|
41
|
+
@got_lock = file.flock( File::LOCK_NB | File::LOCK_EX )
|
42
|
+
end
|
43
|
+
unless @got_lock
|
44
|
+
if @options.kill
|
45
|
+
@state = YAML.load_file(@options.statefile)
|
46
|
+
begin
|
47
|
+
Process.kill("TERM", @state['pid']) if @state.has_key?('pid')
|
48
|
+
rescue Errno::ESRCH
|
49
|
+
end
|
50
|
+
sleep 0.1
|
51
|
+
File.open(@options.statefile, "r") do |file|
|
52
|
+
@got_lock = file.flock( File::LOCK_NB | File::LOCK_EX )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
invalid("The state file #{@options.statefile} is already locked by other process") unless @got_lock
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@state = (File.exist?(@options.statefile) && !@options.reset) ? YAML.load_file(@options.statefile) : @settings['orchestrator'][@options.name]
|
60
|
+
|
61
|
+
@state['pid'] = Process.pid
|
62
|
+
|
63
|
+
@statefile_handle = File.open(@options.statefile, "w")
|
64
|
+
@statefile_handle.flock( File::LOCK_NB | File::LOCK_EX )
|
65
|
+
@statefile_handle.sync = true
|
66
|
+
### @statefile_handle.close_on_exec = true
|
67
|
+
Signal.trap("TERM") do
|
68
|
+
@children.each do |pid, command|
|
69
|
+
begin
|
70
|
+
Process.kill("TERM", pid)
|
71
|
+
puts "KILLED #{pid}: #{command}\n" if @options.verbose
|
72
|
+
@log += "KILLED #{pid}: #{command}\n"
|
73
|
+
rescue Errno::ESRCH
|
74
|
+
end
|
75
|
+
end
|
76
|
+
puts "KILLED ORCHESTRATOR\n" if @options.verbose
|
77
|
+
@log += "KILLED ORCHESTRATOR\n"
|
78
|
+
fail
|
79
|
+
end
|
80
|
+
else
|
81
|
+
@state = @settings['orchestrator'][@options.name]
|
82
|
+
end
|
36
83
|
|
37
84
|
@options.email = false unless @state.has_key?('email')
|
38
85
|
@options.email_on_success = (@options.email and @state['email'].has_key?('on_success')) ? @state['email']['on_success'] : true
|
@@ -49,7 +96,14 @@ module Orchestrator
|
|
49
96
|
def save_state
|
50
97
|
if @options.statefile
|
51
98
|
@mutex.synchronize do
|
52
|
-
File.
|
99
|
+
unless File.exist?(@options.statefile)
|
100
|
+
@statefile_handle.close
|
101
|
+
@statefile_handle = File.open(@options.statefile, "w")
|
102
|
+
@statefile_handle.flock( File::LOCK_NB | File::LOCK_EX )
|
103
|
+
@statefile_handle.sync = true
|
104
|
+
end
|
105
|
+
@statefile_handle.rewind
|
106
|
+
YAML.dump(@state, @statefile_handle)
|
53
107
|
end
|
54
108
|
end
|
55
109
|
end
|
@@ -185,9 +239,12 @@ module Orchestrator
|
|
185
239
|
# start = Time.now
|
186
240
|
|
187
241
|
status = 'STARTED'
|
242
|
+
child = nil
|
188
243
|
begin
|
189
244
|
Timeout::timeout(timeout) do
|
190
245
|
status = POpen4::popen4(command) do |stdout, stderr, stdin, pid|
|
246
|
+
@children[pid] = command
|
247
|
+
child = pid
|
191
248
|
result = stdout.read.strip
|
192
249
|
error = stderr.read.strip
|
193
250
|
end
|
@@ -195,12 +252,21 @@ module Orchestrator
|
|
195
252
|
end
|
196
253
|
rescue Timeout::Error
|
197
254
|
status = 'TIMEOUT'
|
255
|
+
if child
|
256
|
+
begin
|
257
|
+
Process.kill("TERM", child)
|
258
|
+
result += "\nKILLED #{child}: #{command}\n"
|
259
|
+
rescue Errno::ESRCH
|
260
|
+
end
|
261
|
+
end
|
198
262
|
end
|
199
263
|
|
200
264
|
# runtime = Time.now - start
|
201
265
|
# runtime = runtime > 60 ? runtime/60 : runtime
|
202
266
|
|
203
267
|
@mutex.synchronize do
|
268
|
+
@children.delete(child) if child
|
269
|
+
|
204
270
|
output = <<-EOF
|
205
271
|
|
206
272
|
Running: #{command} - #{status}
|
data/lib/orchestrator/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: task-orchestrator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pony
|
@@ -85,16 +85,17 @@ extra_rdoc_files: []
|
|
85
85
|
files:
|
86
86
|
- bin/orchestrator
|
87
87
|
- lib/orchestrator.rb
|
88
|
-
- lib/orchestrator/task.rb
|
89
88
|
- lib/orchestrator/version.rb
|
90
89
|
- lib/orchestrator/cli.rb
|
90
|
+
- lib/orchestrator/task.rb
|
91
|
+
- examples/timeouts
|
92
|
+
- examples/interpolation
|
93
|
+
- examples/dependencies
|
91
94
|
- examples/sequential
|
92
95
|
- examples/failure_handler
|
93
|
-
- examples/multistep
|
94
96
|
- examples/parallel
|
95
|
-
- examples/
|
96
|
-
- examples/
|
97
|
-
- examples/dependencies
|
97
|
+
- examples/flock
|
98
|
+
- examples/multistep
|
98
99
|
- task-orchestrator.gemspec
|
99
100
|
- LICENSE
|
100
101
|
- README.md
|