jackal-cfn 0.2.26 → 0.2.28
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +11 -3
- data/lib/jackal-cfn/resource/orchestration_unit.rb +89 -14
- data/lib/jackal-cfn/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 088e25e5d30d7eb4a390ca828fab69c6975d064f
|
|
4
|
+
data.tar.gz: 16fddf96b436841f9a527fa7391633feb6562b37
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8e8ec86af5481f38ba6325abcd606de0d6222d39068df53e71da0ca1bc9e398ed51b3d0933de286dd7a2ab4ae10513848b0b3521cc52e83537a557d5820c2815
|
|
7
|
+
data.tar.gz: b819b5eb2f5af7b4c48db3362a706e5b31866a3edc81de7d422eb3a916f73362452331718d9ff78eda94c89ee21db0bac981f8492398b71997e9bfcc1a1a4b6d
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
# v0.2.28
|
|
2
|
+
* [fix] Break out of command loop at correct context in OrchestrationUnit
|
|
3
|
+
* [enhancement] Reduce maximum allowed size of result included within response in OrchestrationUnit
|
|
4
|
+
* [enhancement] Add keepalive while OrchestrationUnit is processed
|
|
5
|
+
* [enhancement] Add conditional support to unit execution in OrchestrationUnit
|
|
6
|
+
|
|
1
7
|
# v0.2.26
|
|
2
8
|
* [fix] Update readpartial usage in OrchestrationUnit
|
|
3
9
|
* [enhancement] Add debug output to OrchestrationUnit execution
|
data/README.md
CHANGED
|
@@ -337,13 +337,17 @@ Resource Usage:
|
|
|
337
337
|
"CUSTOM_ENV_VARS": "FOR_COMMAND"
|
|
338
338
|
},
|
|
339
339
|
"RawResult": true,
|
|
340
|
+
"OnlyIf": "STRING_COMMAND",
|
|
341
|
+
"NotIf": "STRING_COMMAND",
|
|
340
342
|
"OnCreate": {
|
|
341
343
|
"Exec": "STRING_COMMAND",
|
|
342
344
|
"ExecZip": "REMOTE_URL_TO_ZIP",
|
|
343
345
|
"Env": {
|
|
344
346
|
"CUSTOM_ENV_VARS": "FOR_COMMAND"
|
|
345
347
|
},
|
|
346
|
-
"RawResult": true
|
|
348
|
+
"RawResult": true,
|
|
349
|
+
"OnlyIf": "STRING_COMMAND",
|
|
350
|
+
"NotIf": "STRING_COMMAND"
|
|
347
351
|
},
|
|
348
352
|
"OnUpdate": {
|
|
349
353
|
"Exec": "STRING_COMMAND",
|
|
@@ -351,7 +355,9 @@ Resource Usage:
|
|
|
351
355
|
"Env": {
|
|
352
356
|
"CUSTOM_ENV_VARS": "FOR_COMMAND"
|
|
353
357
|
},
|
|
354
|
-
"RawResult": true
|
|
358
|
+
"RawResult": true,
|
|
359
|
+
"OnlyIf": "STRING_COMMAND",
|
|
360
|
+
"NotIf": "STRING_COMMAND"
|
|
355
361
|
},
|
|
356
362
|
"OnDelete": {
|
|
357
363
|
"Exec": "STRING_COMMAND",
|
|
@@ -359,7 +365,9 @@ Resource Usage:
|
|
|
359
365
|
"Env": {
|
|
360
366
|
"CUSTOM_ENV_VARS": "FOR_COMMAND"
|
|
361
367
|
},
|
|
362
|
-
"RawResult": true
|
|
368
|
+
"RawResult": true,
|
|
369
|
+
"OnlyIf": "STRING_COMMAND",
|
|
370
|
+
"NotIf": "STRING_COMMAND"
|
|
363
371
|
}
|
|
364
372
|
}
|
|
365
373
|
}
|
|
@@ -14,27 +14,36 @@ module Jackal
|
|
|
14
14
|
# "ExecZip": "DOWNLOAD_URI",
|
|
15
15
|
# "RawResult": true,
|
|
16
16
|
# "Env": {
|
|
17
|
-
# }
|
|
17
|
+
# },
|
|
18
|
+
# OnlyIf": "SHELL_COMMAND",
|
|
19
|
+
# NotIf": "SHELL_COMMAND"
|
|
18
20
|
# },
|
|
19
21
|
# "OnUpdate": {
|
|
20
22
|
# "Exec": "SHELL_COMMAND",
|
|
21
23
|
# "ExecZip": "DOWNLOAD_URI",
|
|
22
24
|
# "RawResult": true,
|
|
23
25
|
# "Env": {
|
|
24
|
-
# }
|
|
26
|
+
# },
|
|
27
|
+
# },
|
|
28
|
+
# OnlyIf": "SHELL_COMMAND",
|
|
29
|
+
# NotIf": "SHELL_COMMAND"
|
|
25
30
|
# },
|
|
26
31
|
# "OnDelete": {
|
|
27
32
|
# "Exec": "SHELL_COMMAND",
|
|
28
33
|
# "ExecZip": "DOWNLOAD_URI",
|
|
29
34
|
# "RawResult": true,
|
|
30
35
|
# "Env": {
|
|
31
|
-
# }
|
|
36
|
+
# },
|
|
37
|
+
# OnlyIf": "SHELL_COMMAND",
|
|
38
|
+
# NotIf": "SHELL_COMMAND"
|
|
32
39
|
# },
|
|
33
40
|
# "Exec": "SHELL_COMMAND",
|
|
34
41
|
# "ExecZip": "DOWNLOAD_URI",
|
|
35
42
|
# "Env": {
|
|
36
43
|
# },
|
|
37
|
-
# "RawResult": true
|
|
44
|
+
# "RawResult": true,
|
|
45
|
+
# "OnlyIf": "SHELL_COMMAND",
|
|
46
|
+
# "NotIf": "SHELL_COMMAND"
|
|
38
47
|
# }
|
|
39
48
|
# }
|
|
40
49
|
# }
|
|
@@ -42,7 +51,7 @@ module Jackal
|
|
|
42
51
|
class OrchestrationUnit < Jackal::Cfn::Resource
|
|
43
52
|
|
|
44
53
|
# Max result size
|
|
45
|
-
MAX_RESULT_SIZE =
|
|
54
|
+
MAX_RESULT_SIZE = 2048
|
|
46
55
|
|
|
47
56
|
# Execute orchestration unit
|
|
48
57
|
#
|
|
@@ -54,9 +63,18 @@ module Jackal
|
|
|
54
63
|
parameters = rekey_hash(properties[:parameters])
|
|
55
64
|
cfn_response = build_response(cfn_resource)
|
|
56
65
|
unit = unit_for(cfn_resource[:request_type], parameters)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
if(unit_runnable?(unit))
|
|
67
|
+
working_dir = create_working_directory(payload[:id])
|
|
68
|
+
keepalive = every(10){ message.touch! }
|
|
69
|
+
begin
|
|
70
|
+
run_unit(unit, working_dir, cfn_response)
|
|
71
|
+
ensure
|
|
72
|
+
keepalive.cancel
|
|
73
|
+
end
|
|
74
|
+
FileUtils.rm_rf(working_dir)
|
|
75
|
+
else
|
|
76
|
+
debug "Received unit for #{message} is not runnable due to conditions! #{unit}"
|
|
77
|
+
end
|
|
60
78
|
respond_to_stack(cfn_response, cfn_resource[:response_url])
|
|
61
79
|
job_completed(:jackal_cfn, payload, message)
|
|
62
80
|
end
|
|
@@ -78,6 +96,57 @@ module Jackal
|
|
|
78
96
|
dir_path
|
|
79
97
|
end
|
|
80
98
|
|
|
99
|
+
# Determine if unit should be run based on conditional
|
|
100
|
+
# fields
|
|
101
|
+
#
|
|
102
|
+
# @param unit [Hash]
|
|
103
|
+
# @return [TrueClass, FalseClass]
|
|
104
|
+
def unit_runnable?(unit)
|
|
105
|
+
result = true
|
|
106
|
+
conditionals = Smash[
|
|
107
|
+
[:only_if, :not_if].map do |conditional_key|
|
|
108
|
+
stdout = process_manager.create_io_tmp(Carnivore.uuid, 'stdout')
|
|
109
|
+
stderr = process_manager.create_io_tmp(Carnivore.uuid, 'stderr')
|
|
110
|
+
if(unit[conditional_key])
|
|
111
|
+
debug "Executing conditional `#{conditional_key}`: #{unit[conditional_key]}"
|
|
112
|
+
conditional_result = false
|
|
113
|
+
process_manager.process(unit.hash, unit[conditional_key]) do |process|
|
|
114
|
+
process.io.stdout = stdout
|
|
115
|
+
process.io.stderr = stderr
|
|
116
|
+
process.cwd = '/tmp'
|
|
117
|
+
if(unit[:env])
|
|
118
|
+
debug "Custom environment defined: #{unit[:env]}"
|
|
119
|
+
process.environment.replace(unit[:env])
|
|
120
|
+
end
|
|
121
|
+
process.leader = true
|
|
122
|
+
process.start
|
|
123
|
+
begin
|
|
124
|
+
process.poll_for_exit(config.fetch(:max_execution_time, 60))
|
|
125
|
+
debug "Result of conditional `#{conditional_key}`: #{process.exit_code}"
|
|
126
|
+
stdout.rewind
|
|
127
|
+
stderr.rewind
|
|
128
|
+
debug "Result of conditional `#{conditional_key}` output STDOUT: #{stdout.read}"
|
|
129
|
+
debug "Result of conditional `#{conditional_key}` output STDERR: #{stderr.read}"
|
|
130
|
+
conditional_result = process.exit_code == 0
|
|
131
|
+
rescue ChildProcess::TimeoutError
|
|
132
|
+
process.stop
|
|
133
|
+
conditional_result = false
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
[conditional_key, conditional_result]
|
|
137
|
+
end
|
|
138
|
+
end.compact
|
|
139
|
+
]
|
|
140
|
+
if(conditionals.key?(:not_if) && conditionals.key?(:only_if))
|
|
141
|
+
result = !conditionals[:not_if] && conditionals[:only_if]
|
|
142
|
+
elsif(conditionals.key?(:not_if))
|
|
143
|
+
result = !conditionals.key?(:not_if)
|
|
144
|
+
elsif(conditionals.key?(:only_if))
|
|
145
|
+
result = conditionals[:only_if]
|
|
146
|
+
end
|
|
147
|
+
result
|
|
148
|
+
end
|
|
149
|
+
|
|
81
150
|
# Fetch compressed zip file from remote location and unpack into
|
|
82
151
|
# provided working directory
|
|
83
152
|
#
|
|
@@ -128,9 +197,8 @@ module Jackal
|
|
|
128
197
|
process.leader = true
|
|
129
198
|
process.start
|
|
130
199
|
begin
|
|
131
|
-
process.poll_for_exit(config.fetch(:max_execution_time,
|
|
200
|
+
process.poll_for_exit(config.fetch(:max_execution_time, 500))
|
|
132
201
|
result[:exit_code] = process.exit_code
|
|
133
|
-
break if result[:exit_code] != 0
|
|
134
202
|
debug "Execution of command successful - #{exec_command}"
|
|
135
203
|
rescue ChildProcess::TimeoutError
|
|
136
204
|
process.stop
|
|
@@ -138,17 +206,18 @@ module Jackal
|
|
|
138
206
|
result[:exit_code] = process.exit_code
|
|
139
207
|
end
|
|
140
208
|
end
|
|
209
|
+
break if result[:exit_code] != 0
|
|
141
210
|
end
|
|
142
211
|
result[:stop_time] = Time.now.to_i
|
|
143
212
|
stdout.rewind
|
|
144
213
|
if(stdout.size > MAX_RESULT_SIZE)
|
|
145
214
|
warn "Command result greater than allowed size: #{stdout.size} > #{MAX_RESULT_SIZE}"
|
|
146
215
|
end
|
|
147
|
-
result[:content] = stdout.readpartial(MAX_RESULT_SIZE)
|
|
216
|
+
result[:content] = stdout.size > 0 ? stdout.readpartial(MAX_RESULT_SIZE) : ''
|
|
148
217
|
if(result[:exit_code] != 0)
|
|
149
218
|
debug "Execution of unit failed - #{unit}"
|
|
150
219
|
stderr.rewind
|
|
151
|
-
result[:error_message] = stderr.readpartial(MAX_RESULT_SIZE)
|
|
220
|
+
result[:error_message] = stderr.size > 0 ? stderr.readpartial(MAX_RESULT_SIZE) : ''
|
|
152
221
|
stderr.rewind
|
|
153
222
|
stdout.rewind
|
|
154
223
|
debug "Failed unit STDOUT: #{stdout.read}"
|
|
@@ -184,9 +253,10 @@ module Jackal
|
|
|
184
253
|
base_key = "on_#{request_type.to_s.downcase}"
|
|
185
254
|
result = Smash.new
|
|
186
255
|
if(direct_unit = parameters[base_key])
|
|
187
|
-
|
|
256
|
+
direct_unit = rekey_hash(direct_unit)
|
|
257
|
+
[:exec, :exec_zip, :env, :raw_result, :only_if, :not_if].each do |p_key|
|
|
188
258
|
if(direct_unit[p_key])
|
|
189
|
-
result[p_key] =
|
|
259
|
+
result[p_key] = direct_unit[p_key]
|
|
190
260
|
end
|
|
191
261
|
end
|
|
192
262
|
end
|
|
@@ -207,6 +277,11 @@ module Jackal
|
|
|
207
277
|
unless(result.key?('raw_result'))
|
|
208
278
|
result[:raw_result] = parameters.fetch('raw_result', true)
|
|
209
279
|
end
|
|
280
|
+
[:only_if, :not_if].each do |conditional_key|
|
|
281
|
+
if(!result.key?(conditional_key) && parameters.key?(conditional_key))
|
|
282
|
+
result[conditional_key] = parameters[conditional_key]
|
|
283
|
+
end
|
|
284
|
+
end
|
|
210
285
|
result[:env] ||= Smash.new
|
|
211
286
|
result[:env]['CFN_REQUEST_TYPE'] = request_type.to_s.upcase
|
|
212
287
|
result
|
data/lib/jackal-cfn/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jackal-cfn
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.28
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Roberts
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-03-
|
|
11
|
+
date: 2016-03-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jackal
|