dtk-action-agent 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 91b2a5186f6e4ccaba5687ce9ffac7b2baa1c603
4
- data.tar.gz: 7b2176431344e9e2078fe2372616cff51b705627
3
+ metadata.gz: 5789ee64fd987ef9f0ad70e04cb6b1022bab5189
4
+ data.tar.gz: b67bce545ec9ea72603ddc4b1ea53a54eafe248b
5
5
  SHA512:
6
- metadata.gz: a0e490c27b693136932285d1e1632270725b4a2381eef22f0e00c59cdcf281f5fcf704faad40a3ca7d021f2fdf37cdd935845c63fce90f6306fdab5049e9fedd
7
- data.tar.gz: ac498ebb4fd65f5f289e61a198d8e2dcd2de13f2b7f74a1d01db6f25ba5d7c710ed9f32195b5df30363e1d6f4bacde956b70c3f9aef3d13cd4985be3f265675c
6
+ metadata.gz: fa34c66700cc5b7d5d385062cc7d617f068aafe8a1e64c36638415286e62d4828e9e982929a4e0323dffe28dd290d66d6228e9cc6fda8566cbb5108e12a06ef9
7
+ data.tar.gz: 08a7c4184e8e0c9d9184876715e4facfa9e4e5fbdaea905a2e367fa31ee4b0ddf7d0aae35349d69ef308905b3da8cab6c4d7120b896519bc4e6717c884c20c6b
@@ -1,11 +1,14 @@
1
1
  require 'open3'
2
2
  require 'timeout'
3
3
 
4
+
5
+
4
6
  module DTK
5
7
  module Agent
6
8
 
7
9
  ##
8
10
  # This is container for command as received from Node Agent
11
+ #
9
12
 
10
13
  class Command
11
14
 
@@ -20,6 +23,7 @@ module DTK
20
23
  #
21
24
 
22
25
  STDOUT_REDIRECT = ' 2>&1'
26
+ STREAM_TIMEOUT = 5
23
27
 
24
28
  def initialize(value_hash)
25
29
  @command_type = value_hash['type']
@@ -45,13 +49,15 @@ module DTK
45
49
  begin
46
50
  Commander.set_environment_variables(@env_vars)
47
51
 
48
- Timeout.timeout(@timeout) do
49
- Log.debug("Command started: '#{self.to_s}'")
50
- @out, @err, @process_status = Open3.capture3(formulate_command)
51
- end
52
52
 
53
- rescue Timeout::Error
54
- @error_message = "Timeout (#{@timeout} sec) for this action has been exceeded"
53
+ results = capture3_with_timeout(formulate_command)
54
+
55
+ @out = results[:stdout]
56
+ @err = results[:stderr]
57
+ @process_status = results[:status]
58
+
59
+ @error_message = "Timeout (#{@timeout} sec) for this action has been exceeded" if results[:timeout]
60
+
55
61
  rescue Exception => e
56
62
  @error_message = e.message
57
63
  @backtrace = e.backtrace
@@ -128,6 +134,83 @@ module DTK
128
134
 
129
135
  private
130
136
 
137
+ ##
138
+ # Open3 method extended with timeout, more info https://gist.github.com/pasela/9392115
139
+ #
140
+
141
+ def capture3_with_timeout(*cmd)
142
+ spawn_opts = Hash === cmd.last ? cmd.pop.dup : {}
143
+ opts = {
144
+ :stdin_data => "",
145
+ :timeout => @timeout,
146
+ :signal => :TERM,
147
+ :kill_after => nil,
148
+ }
149
+
150
+ in_r, in_w = IO.pipe
151
+ out_r, out_w = IO.pipe
152
+ err_r, err_w = IO.pipe
153
+ in_w.sync = true
154
+
155
+ spawn_opts[:in] = in_r
156
+ spawn_opts[:out] = out_w
157
+ spawn_opts[:err] = err_w
158
+
159
+ result = {
160
+ :pid => nil,
161
+ :status => nil,
162
+ :stdout => nil,
163
+ :stderr => nil,
164
+ :timeout => false,
165
+ }
166
+
167
+ out_reader = nil
168
+ err_reader = nil
169
+ wait_thr = nil
170
+
171
+ begin
172
+ Timeout.timeout(opts[:timeout]) do
173
+ result[:pid] = spawn(*cmd, spawn_opts)
174
+ wait_thr = Process.detach(result[:pid])
175
+ in_r.close
176
+ out_w.close
177
+ err_w.close
178
+
179
+ out_reader = Thread.new { out_r.read }
180
+ err_reader = Thread.new { err_r.read }
181
+
182
+ in_w.close
183
+
184
+ result[:status] = wait_thr.value
185
+ end
186
+ rescue Timeout::Error
187
+ result[:timeout] = true
188
+ pid = result[:pid]
189
+ Process.kill(opts[:signal], pid)
190
+ if opts[:kill_after]
191
+ unless wait_thr.join(opts[:kill_after])
192
+ Process.kill(:KILL, pid)
193
+ end
194
+ end
195
+ ensure
196
+ result[:status] = wait_thr.value if wait_thr
197
+ begin
198
+ # there is a bug where there is infinite leg on out_reader (e.g. hohup) commands
199
+ Timeout.timeout(STREAM_TIMEOUT) do
200
+ result[:stdout] = out_reader.value if out_reader
201
+ result[:stderr] = err_reader.value if err_reader
202
+ end
203
+ rescue Timeout::Error
204
+ result[:stdout] ||= ''
205
+ result[:stderr] ||= ''
206
+ end
207
+ out_r.close unless out_r.closed?
208
+ err_r.close unless err_r.closed?
209
+ end
210
+
211
+ result
212
+ end
213
+
131
214
  #
132
215
  # Based on stdout-redirect flag
133
216
  #
@@ -1,5 +1,5 @@
1
1
  module DTK
2
2
  module ActionAgent
3
- VERSION = "0.0.7"
3
+ VERSION = "0.0.8"
4
4
  end
5
5
  end
@@ -96,10 +96,12 @@ module DTK
96
96
  def position_git()
97
97
  unless File.directory?(@target_path)
98
98
  begin
99
+ tries ||= 2
99
100
  g_repo = Git.clone("#{@git_url}", '', :path => @target_path, :branch => @branch)
100
101
  Log.info("Positioner successfully cloned git repository '#{@git_url}@#{@branch}' to location '#{@target_path}'")
101
102
  rescue Exception => e
102
103
  cleanup_path()
104
+ retry unless (tries -= 1).zero?
103
105
  trigger_error("Positioner unable to clone provided url #{@git_url}. Reasone: #{e.message}", 1, e.backtrace)
104
106
  end
105
107
  else
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-action-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rich PELAVIN
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-16 00:00:00.000000000 Z
11
+ date: 2015-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print