puppet_litmus 1.0.2 → 1.1.0
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/exe/matrix_from_metadata_v2 +71 -22
- data/lib/puppet_litmus/inventory_manipulation.rb +4 -30
- data/lib/puppet_litmus/puppet_helpers.rb +217 -302
- data/lib/puppet_litmus/rake_helper.rb +84 -183
- data/lib/puppet_litmus/rake_tasks.rb +3 -8
- data/lib/puppet_litmus/version.rb +1 -1
- data/spec/exe/matrix_from_metadata_v2_spec.rb +6 -6
- data/spec/lib/puppet_litmus/puppet_helpers_spec.rb +0 -20
- data/spec/lib/puppet_litmus/rake_tasks_spec.rb +1 -1
- metadata +2 -30
@@ -19,12 +19,9 @@ module PuppetLitmus::PuppetHelpers
|
|
19
19
|
# :noop [Boolean] run puppet apply with the noop flag.
|
20
20
|
# @return [Boolean] The result of the 2 apply manifests.
|
21
21
|
def idempotent_apply(manifest, opts = {})
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
apply_manifest(nil, **opts, catch_failures: true, manifest_file_location: manifest_file_location)
|
26
|
-
apply_manifest(nil, **opts, catch_changes: true, manifest_file_location: manifest_file_location)
|
27
|
-
end
|
22
|
+
manifest_file_location = create_manifest_file(manifest)
|
23
|
+
apply_manifest(nil, **opts, catch_failures: true, manifest_file_location: manifest_file_location)
|
24
|
+
apply_manifest(nil, **opts, catch_changes: true, manifest_file_location: manifest_file_location)
|
28
25
|
end
|
29
26
|
|
30
27
|
# Applies a manifest. returning the result of that apply. Mimics the apply_manifest from beaker
|
@@ -49,99 +46,85 @@ module PuppetLitmus::PuppetHelpers
|
|
49
46
|
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
50
47
|
# @return [Object] A result object from the apply.
|
51
48
|
def apply_manifest(manifest, opts = {})
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
acceptable_exit_codes = [2]
|
77
|
-
else
|
78
|
-
use_detailed_exit_codes = false
|
79
|
-
acceptable_exit_codes = [0]
|
80
|
-
end
|
49
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
50
|
+
raise 'manifest and manifest_file_location in the opts hash are mutually exclusive arguments, pick one' if !manifest.nil? && !opts[:manifest_file_location].nil?
|
51
|
+
raise 'please pass a manifest or the manifest_file_location in the opts hash' if (manifest.nil? || manifest == '') && opts[:manifest_file_location].nil?
|
52
|
+
raise 'please specify only one of `catch_changes`, `expect_changes`, `catch_failures` or `expect_failures`' if
|
53
|
+
[opts[:catch_changes], opts[:expect_changes], opts[:catch_failures], opts[:expect_failures]].compact.length > 1
|
54
|
+
|
55
|
+
opts = { trace: true }.merge(opts)
|
56
|
+
|
57
|
+
if opts[:catch_changes]
|
58
|
+
use_detailed_exit_codes = true
|
59
|
+
acceptable_exit_codes = [0]
|
60
|
+
elsif opts[:catch_failures]
|
61
|
+
use_detailed_exit_codes = true
|
62
|
+
acceptable_exit_codes = [0, 2]
|
63
|
+
elsif opts[:expect_failures]
|
64
|
+
use_detailed_exit_codes = true
|
65
|
+
acceptable_exit_codes = [1, 4, 6]
|
66
|
+
elsif opts[:expect_changes]
|
67
|
+
use_detailed_exit_codes = true
|
68
|
+
acceptable_exit_codes = [2]
|
69
|
+
else
|
70
|
+
use_detailed_exit_codes = false
|
71
|
+
acceptable_exit_codes = [0]
|
72
|
+
end
|
81
73
|
|
82
|
-
|
83
|
-
|
74
|
+
manifest_file_location = opts[:manifest_file_location] || create_manifest_file(manifest)
|
75
|
+
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
77
|
+
target_option = opts['targets'] || opts[:targets]
|
78
|
+
if target_option.nil?
|
79
|
+
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
80
|
+
else
|
81
|
+
target_node_name = search_for_target(target_option, inventory_hash)
|
82
|
+
end
|
91
83
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
span.add_field('litmus.command_to_run', command_to_run)
|
114
|
-
bolt_result = Tempfile.open(['temp', '.ps1']) do |script|
|
115
|
-
script.write(command_to_run)
|
116
|
-
script.close
|
117
|
-
run_script(script.path, target_node_name, [], options: {}, config: nil, inventory: inventory_hash)
|
118
|
-
end
|
119
|
-
else
|
120
|
-
span.add_field('litmus.command_to_run', command_to_run)
|
121
|
-
bolt_result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
122
|
-
end
|
123
|
-
span.add_field('litmus.bolt_result', bolt_result)
|
124
|
-
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
125
|
-
stdout: bolt_result.first['value']['stdout'],
|
126
|
-
stderr: bolt_result.first['value']['stderr'])
|
127
|
-
span.add_field('litmus.result', result.to_h)
|
128
|
-
|
129
|
-
status = result.exit_code
|
130
|
-
if opts[:catch_changes] && !acceptable_exit_codes.include?(status)
|
131
|
-
report_puppet_apply_change(command_to_run, bolt_result)
|
132
|
-
elsif !acceptable_exit_codes.include?(status)
|
133
|
-
report_puppet_apply_error(command_to_run, bolt_result, acceptable_exit_codes)
|
84
|
+
# Forcibly set the locale of the command
|
85
|
+
locale = if os[:family] == 'windows'
|
86
|
+
''
|
87
|
+
else
|
88
|
+
'LC_ALL=en_US.UTF-8 '
|
89
|
+
end
|
90
|
+
command_to_run = "#{locale}#{opts[:prefix_command]} puppet apply #{manifest_file_location}"
|
91
|
+
command_to_run += ' --trace' if !opts[:trace].nil? && (opts[:trace] == true)
|
92
|
+
command_to_run += " --modulepath #{Dir.pwd}/spec/fixtures/modules" if target_node_name == 'litmus_localhost'
|
93
|
+
command_to_run += " --hiera_config='#{opts[:hiera_config]}'" unless opts[:hiera_config].nil?
|
94
|
+
command_to_run += ' --debug' if !opts[:debug].nil? && (opts[:debug] == true)
|
95
|
+
command_to_run += ' --noop' if !opts[:noop].nil? && (opts[:noop] == true)
|
96
|
+
command_to_run += ' --detailed-exitcodes' if use_detailed_exit_codes == true
|
97
|
+
|
98
|
+
if os[:family] == 'windows'
|
99
|
+
# IAC-1365 - Workaround for BOLT-1535 and bolt issue #1650
|
100
|
+
command_to_run = "try { #{command_to_run}; exit $LASTEXITCODE } catch { write-error $_ ; exit 1 }"
|
101
|
+
bolt_result = Tempfile.open(['temp', '.ps1']) do |script|
|
102
|
+
script.write(command_to_run)
|
103
|
+
script.close
|
104
|
+
run_script(script.path, target_node_name, [], options: {}, config: nil, inventory: inventory_hash)
|
134
105
|
end
|
106
|
+
else
|
107
|
+
bolt_result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
108
|
+
end
|
109
|
+
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
110
|
+
stdout: bolt_result.first['value']['stdout'],
|
111
|
+
stderr: bolt_result.first['value']['stderr'])
|
112
|
+
|
113
|
+
status = result.exit_code
|
114
|
+
if opts[:catch_changes] && !acceptable_exit_codes.include?(status)
|
115
|
+
report_puppet_apply_change(command_to_run, bolt_result)
|
116
|
+
elsif !acceptable_exit_codes.include?(status)
|
117
|
+
report_puppet_apply_error(command_to_run, bolt_result, acceptable_exit_codes)
|
118
|
+
end
|
135
119
|
|
136
|
-
|
120
|
+
yield result if block_given?
|
137
121
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
end
|
143
|
-
result
|
122
|
+
if ENV['RSPEC_DEBUG']
|
123
|
+
puts "apply manifest succeded\n #{command_to_run}\n======\nwith status #{result.exit_code}"
|
124
|
+
puts result.stderr
|
125
|
+
puts result.stdout
|
144
126
|
end
|
127
|
+
result
|
145
128
|
end
|
146
129
|
|
147
130
|
# Creates a manifest file locally in a temp location, if its a remote target copy it to there.
|
@@ -149,36 +132,27 @@ module PuppetLitmus::PuppetHelpers
|
|
149
132
|
# @param manifest [String] puppet manifest code.
|
150
133
|
# @return [String] The path to the location of the manifest.
|
151
134
|
def create_manifest_file(manifest, opts = {})
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
manifest_file.
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
# transfer to TARGET_HOST
|
167
|
-
inventory_hash = inventory_hash_from_inventory_file
|
168
|
-
target_option = opts['targets'] || opts[:targets]
|
169
|
-
target_node_name = search_for_target(target_option, inventory_hash) unless target_option.nil?
|
170
|
-
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
171
|
-
|
172
|
-
manifest_file_location = File.basename(manifest_file)
|
173
|
-
bolt_result = upload_file(manifest_file.path, manifest_file_location, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
174
|
-
span.add_field('litmus.bolt_result', bolt_result)
|
175
|
-
raise bolt_result.first['value'].to_s unless bolt_result.first['status'] == 'success'
|
176
|
-
end
|
177
|
-
|
178
|
-
span.add_field('litmus.manifest_file_location', manifest_file_location)
|
135
|
+
require 'tmpdir'
|
136
|
+
target_node_name = ENV.fetch('TARGET_HOST', nil)
|
137
|
+
tmp_filename = File.join(Dir.tmpdir, "manifest_#{Time.now.strftime('%Y%m%d')}_#{Process.pid}_#{rand(0x100000000).to_s(36)}.pp")
|
138
|
+
manifest_file = File.open(tmp_filename, 'w')
|
139
|
+
manifest_file.write(manifest)
|
140
|
+
manifest_file.close
|
141
|
+
if target_node_name.nil? || target_node_name == 'localhost'
|
142
|
+
# no need to transfer
|
143
|
+
manifest_file_location = manifest_file.path
|
144
|
+
else
|
145
|
+
# transfer to TARGET_HOST
|
146
|
+
inventory_hash = inventory_hash_from_inventory_file
|
147
|
+
target_option = opts['targets'] || opts[:targets]
|
148
|
+
target_node_name = search_for_target(target_option, inventory_hash) unless target_option.nil?
|
179
149
|
|
180
|
-
manifest_file_location
|
150
|
+
manifest_file_location = File.basename(manifest_file)
|
151
|
+
bolt_result = upload_file(manifest_file.path, manifest_file_location, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
152
|
+
raise bolt_result.first['value'].to_s unless bolt_result.first['status'] == 'success'
|
181
153
|
end
|
154
|
+
|
155
|
+
manifest_file_location
|
182
156
|
end
|
183
157
|
|
184
158
|
# Writes a string variable to a file on a target node at a specified path.
|
@@ -187,35 +161,27 @@ module PuppetLitmus::PuppetHelpers
|
|
187
161
|
# @param destination [String] The path on the target node to write the file.
|
188
162
|
# @return [Bool] Success. The file was succesfully writtne on the target.
|
189
163
|
def write_file(content, destination, opts = {})
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
tmp_file.
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
else
|
208
|
-
# transfer to TARGET_HOST
|
209
|
-
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
210
|
-
|
211
|
-
bolt_result = upload_file(tmp_file.path, destination, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
212
|
-
span.add_field('litmus.bolt_result.file_upload', bolt_result)
|
213
|
-
raise bolt_result.first['value'].to_s unless bolt_result.first['status'] == 'success'
|
214
|
-
end
|
164
|
+
require 'tmpdir'
|
165
|
+
inventory_hash = inventory_hash_from_inventory_file
|
166
|
+
target_node_name = ENV.fetch('TARGET_HOST', nil)
|
167
|
+
target_option = opts['targets'] || opts[:targets]
|
168
|
+
target_node_name = search_for_target(target_option, inventory_hash) unless target_option.nil?
|
169
|
+
|
170
|
+
Tempfile.create('litmus') do |tmp_file|
|
171
|
+
tmp_file.write(content)
|
172
|
+
tmp_file.flush
|
173
|
+
if target_node_name.nil? || target_node_name == 'localhost'
|
174
|
+
require 'fileutils'
|
175
|
+
# no need to transfer
|
176
|
+
FileUtils.cp(tmp_file.path, destination)
|
177
|
+
else
|
178
|
+
# transfer to TARGET_HOST
|
179
|
+
bolt_result = upload_file(tmp_file.path, destination, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
180
|
+
raise bolt_result.first['value'].to_s unless bolt_result.first['status'] == 'success'
|
215
181
|
end
|
216
|
-
|
217
|
-
true
|
218
182
|
end
|
183
|
+
|
184
|
+
true
|
219
185
|
end
|
220
186
|
|
221
187
|
# Runs a command against the target system
|
@@ -225,36 +191,26 @@ module PuppetLitmus::PuppetHelpers
|
|
225
191
|
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
226
192
|
# @return [Object] A result object from the command.
|
227
193
|
def run_shell(command_to_run, opts = {})
|
228
|
-
|
229
|
-
ENV['HONEYCOMB_TRACE'] = span.to_trace_header
|
230
|
-
span.add_field('litmus.command_to_run', command_to_run)
|
231
|
-
span.add_field('litmus.opts', opts)
|
232
|
-
|
233
|
-
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
194
|
+
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
234
195
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
196
|
+
target_option = opts['targets'] || opts[:targets]
|
197
|
+
if target_option.nil?
|
198
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
199
|
+
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
200
|
+
else
|
201
|
+
target_node_name = search_for_target(target_option, inventory_hash)
|
202
|
+
end
|
244
203
|
|
245
|
-
|
246
|
-
span.add_field('litmus.bolt_result', bolt_result)
|
204
|
+
bolt_result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
247
205
|
|
248
|
-
|
206
|
+
raise "shell failed\n`#{command_to_run}`\n======\n#{bolt_result}" if bolt_result.first['value']['exit_code'] != 0 && opts[:expect_failures] != true
|
249
207
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
result
|
257
|
-
end
|
208
|
+
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
209
|
+
exit_status: bolt_result.first['value']['exit_code'],
|
210
|
+
stdout: bolt_result.first['value']['stdout'],
|
211
|
+
stderr: bolt_result.first['value']['stderr'])
|
212
|
+
yield result if block_given?
|
213
|
+
result
|
258
214
|
end
|
259
215
|
|
260
216
|
# Copies file to the target, using its respective transport
|
@@ -265,51 +221,36 @@ module PuppetLitmus::PuppetHelpers
|
|
265
221
|
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
266
222
|
# @return [Object] A result object from the command.
|
267
223
|
def bolt_upload_file(source, destination, opts = {}, options = {})
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
target_option = opts['targets'] || opts[:targets]
|
277
|
-
if target_option.nil?
|
278
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
279
|
-
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
280
|
-
else
|
281
|
-
target_node_name = search_for_target(target_option, inventory_hash)
|
282
|
-
end
|
283
|
-
|
284
|
-
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
285
|
-
|
286
|
-
bolt_result = upload_file(source, destination, target_node_name, options: options, config: nil, inventory: inventory_hash)
|
287
|
-
span.add_field('litmus.bolt_result', bolt_result)
|
224
|
+
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
225
|
+
target_option = opts['targets'] || opts[:targets]
|
226
|
+
if target_option.nil?
|
227
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
228
|
+
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
229
|
+
else
|
230
|
+
target_node_name = search_for_target(target_option, inventory_hash)
|
231
|
+
end
|
288
232
|
|
289
|
-
|
290
|
-
exit_code: 0,
|
291
|
-
stdout: bolt_result.first['value']['_output'],
|
292
|
-
stderr: nil,
|
293
|
-
result: bolt_result.first['value']
|
294
|
-
}
|
233
|
+
bolt_result = upload_file(source, destination, target_node_name, options: options, config: nil, inventory: inventory_hash)
|
295
234
|
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
235
|
+
result_obj = {
|
236
|
+
exit_code: 0,
|
237
|
+
stdout: bolt_result.first['value']['_output'],
|
238
|
+
stderr: nil,
|
239
|
+
result: bolt_result.first['value']
|
240
|
+
}
|
301
241
|
|
302
|
-
|
303
|
-
|
304
|
-
end
|
242
|
+
if bolt_result.first['status'] != 'success'
|
243
|
+
raise "upload file failed\n======\n#{bolt_result}" if opts[:expect_failures] != true
|
305
244
|
|
306
|
-
|
307
|
-
|
308
|
-
stderr: result_obj[:stderr])
|
309
|
-
span.add_field('litmus.result', result.to_h)
|
310
|
-
yield result if block_given?
|
311
|
-
result
|
245
|
+
result_obj[:exit_code] = 255
|
246
|
+
result_obj[:stderr] = bolt_result.first['value']['_error']['msg']
|
312
247
|
end
|
248
|
+
|
249
|
+
result = OpenStruct.new(exit_code: result_obj[:exit_code],
|
250
|
+
stdout: result_obj[:stdout],
|
251
|
+
stderr: result_obj[:stderr])
|
252
|
+
yield result if block_given?
|
253
|
+
result
|
313
254
|
end
|
314
255
|
|
315
256
|
# Runs a task against the target system.
|
@@ -321,69 +262,56 @@ module PuppetLitmus::PuppetHelpers
|
|
321
262
|
# :inventory_file [String] path to the inventory file to use with the task.
|
322
263
|
# @return [Object] A result object from the task.The values available are stdout, stderr and result.
|
323
264
|
def run_bolt_task(task_name, params = {}, opts = {})
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
target_option = opts['targets'] || opts[:targets]
|
341
|
-
if target_option.nil?
|
342
|
-
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
343
|
-
else
|
344
|
-
target_node_name = search_for_target(target_option, inventory_hash)
|
345
|
-
end
|
346
|
-
|
347
|
-
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
348
|
-
|
349
|
-
bolt_result = run_task(task_name, target_node_name, params, config: config_data, inventory: inventory_hash)
|
350
|
-
result_obj = {
|
351
|
-
exit_code: 0,
|
352
|
-
stdout: nil,
|
353
|
-
stderr: nil,
|
354
|
-
result: bolt_result.first['value']
|
355
|
-
}
|
356
|
-
|
357
|
-
if bolt_result.first['status'] == 'success'
|
358
|
-
# stdout returns unstructured data if structured data is not available
|
359
|
-
result_obj[:stdout] = if bolt_result.first['value']['_output'].nil?
|
360
|
-
bolt_result.first['value'].to_s
|
361
|
-
else
|
362
|
-
bolt_result.first['value']['_output']
|
363
|
-
end
|
364
|
-
|
365
|
-
else
|
366
|
-
if opts[:expect_failures] != true
|
367
|
-
span.add_field('litmus_runtaskfailure', bolt_result)
|
368
|
-
raise "task failed\n`#{task_name}`\n======\n#{bolt_result}"
|
369
|
-
end
|
370
|
-
|
371
|
-
result_obj[:exit_code] = if bolt_result.first['value']['_error']['details'].nil?
|
372
|
-
255
|
373
|
-
else
|
374
|
-
bolt_result.first['value']['_error']['details'].fetch('exitcode', 255)
|
375
|
-
end
|
376
|
-
result_obj[:stderr] = bolt_result.first['value']['_error']['msg']
|
377
|
-
end
|
265
|
+
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
266
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
267
|
+
inventory_hash = if !opts[:inventory_file].nil? && File.exist?(opts[:inventory_file])
|
268
|
+
inventory_hash_from_inventory_file(opts[:inventory_file])
|
269
|
+
elsif File.exist?('spec/fixtures/litmus_inventory.yaml')
|
270
|
+
inventory_hash_from_inventory_file('spec/fixtures/litmus_inventory.yaml')
|
271
|
+
else
|
272
|
+
localhost_inventory_hash
|
273
|
+
end
|
274
|
+
|
275
|
+
target_option = opts['targets'] || opts[:targets]
|
276
|
+
if target_option.nil?
|
277
|
+
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
278
|
+
else
|
279
|
+
target_node_name = search_for_target(target_option, inventory_hash)
|
280
|
+
end
|
378
281
|
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
282
|
+
bolt_result = run_task(task_name, target_node_name, params, config: config_data, inventory: inventory_hash)
|
283
|
+
result_obj = {
|
284
|
+
exit_code: 0,
|
285
|
+
stdout: nil,
|
286
|
+
stderr: nil,
|
287
|
+
result: bolt_result.first['value']
|
288
|
+
}
|
289
|
+
|
290
|
+
if bolt_result.first['status'] == 'success'
|
291
|
+
# stdout returns unstructured data if structured data is not available
|
292
|
+
result_obj[:stdout] = if bolt_result.first['value']['_output'].nil?
|
293
|
+
bolt_result.first['value'].to_s
|
294
|
+
else
|
295
|
+
bolt_result.first['value']['_output']
|
296
|
+
end
|
297
|
+
|
298
|
+
else
|
299
|
+
raise "task failed\n`#{task_name}`\n======\n#{bolt_result}" if opts[:expect_failures] != true
|
300
|
+
|
301
|
+
result_obj[:exit_code] = if bolt_result.first['value']['_error']['details'].nil?
|
302
|
+
255
|
303
|
+
else
|
304
|
+
bolt_result.first['value']['_error']['details'].fetch('exitcode', 255)
|
305
|
+
end
|
306
|
+
result_obj[:stderr] = bolt_result.first['value']['_error']['msg']
|
386
307
|
end
|
308
|
+
|
309
|
+
result = OpenStruct.new(exit_code: result_obj[:exit_code],
|
310
|
+
stdout: result_obj[:stdout],
|
311
|
+
stderr: result_obj[:stderr],
|
312
|
+
result: result_obj[:result])
|
313
|
+
yield result if block_given?
|
314
|
+
result
|
387
315
|
end
|
388
316
|
|
389
317
|
# Runs a script against the target system.
|
@@ -394,37 +322,24 @@ module PuppetLitmus::PuppetHelpers
|
|
394
322
|
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
395
323
|
# @return [Object] A result object from the script run.
|
396
324
|
def bolt_run_script(script, opts = {}, arguments: [])
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
target_node_name =
|
404
|
-
|
405
|
-
target_option = opts['targets'] || opts[:targets]
|
406
|
-
if target_option.nil?
|
407
|
-
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
408
|
-
else
|
409
|
-
target_node_name = search_for_target(target_option, inventory_hash)
|
410
|
-
end
|
325
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
326
|
+
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
327
|
+
target_option = opts['targets'] || opts[:targets]
|
328
|
+
if target_option.nil?
|
329
|
+
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
330
|
+
else
|
331
|
+
target_node_name = search_for_target(target_option, inventory_hash)
|
332
|
+
end
|
411
333
|
|
412
|
-
|
334
|
+
bolt_result = run_script(script, target_node_name, arguments, options: opts, config: nil, inventory: inventory_hash)
|
413
335
|
|
414
|
-
|
336
|
+
raise "script run failed\n`#{script}`\n======\n#{bolt_result}" if bolt_result.first['value']['exit_code'] != 0 && opts[:expect_failures] != true
|
415
337
|
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
422
|
-
stdout: bolt_result.first['value']['stdout'],
|
423
|
-
stderr: bolt_result.first['value']['stderr'])
|
424
|
-
yield result if block_given?
|
425
|
-
span.add_field('litmus.result', result.to_h)
|
426
|
-
result
|
427
|
-
end
|
338
|
+
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
339
|
+
stdout: bolt_result.first['value']['stdout'],
|
340
|
+
stderr: bolt_result.first['value']['stderr'])
|
341
|
+
yield result if block_given?
|
342
|
+
result
|
428
343
|
end
|
429
344
|
|
430
345
|
# Determines if the current execution is targeting localhost or not
|