puppet_litmus 0.18.4 → 0.19.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60fc5eef658171b749a429d8d302e94c05e8812858206124e90c915a035a8e4e
4
- data.tar.gz: 2016992ffee484e5c2ab2b92e0011d98678b21bc1c0e62dd1d75c857ad50db65
3
+ metadata.gz: ffba803cc6b53c4bdb7084bf11be4fac807f3b3cd237c5ddb297dcf6ca3a403d
4
+ data.tar.gz: 5cdb613f2be957e20a63fc1250b10113e468e162817657f0f987675f2ba7c055
5
5
  SHA512:
6
- metadata.gz: f4bb7954ab40c5345dacb291f0fd82a745c7ac5da4e939e07323e23f6c06b7c4758303cc5f9faccf75f67134337ad409edb429ebb438ffe879682460722cacb3
7
- data.tar.gz: 3367726403b6691edbb3439377617f894fdffec96f964965bb1e62aa175ade0494920ec166b49da367449c331a9ca6f8e7f87ed2ede707bb7cd7410077e63c38
6
+ metadata.gz: ea1fd95a69bfac81b56f94f3ee28b91be2587c501bf24729931c128315e41d5eaf937dce013ee0d63ec7a350469ac32ab0d7711e50411a0e5fe00340dabdd803
7
+ data.tar.gz: 899ac2b0edb422ccf35c9cdb5f46bec6b2a6a97557dca12ffc994e046ed8cf1e6eec2553865a3c4439b272d1dd29b0111fc24b2e1bb93575cb77fc0bfd7606b1
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # this script creates a build matrix for github actions from the claimed supported platforms in metadata.json
5
+
6
+ require 'json'
7
+
8
+ IMAGE_TABLE = {
9
+ 'RedHat-6' => 'rhel-6',
10
+ 'RedHat-7' => 'rhel-7',
11
+ 'RedHat-8' => 'rhel-8',
12
+ 'SLES-12' => 'sles-12',
13
+ 'SLES-15' => 'sles-15',
14
+ 'Windows-2012 R2' => 'windows-2012-r2-core',
15
+ 'Windows-2016' => 'windows-2016',
16
+ 'Windows-2019' => 'windows-2019-core',
17
+ }.freeze
18
+
19
+ DOCKER_PLATFORMS = [
20
+ 'CentOS-6',
21
+ 'CentOS-7',
22
+ 'CentOS-8',
23
+ 'Debian-10',
24
+ 'Debian-8',
25
+ 'Debian-9',
26
+ 'OracleLinux-6',
27
+ 'OracleLinux-7',
28
+ 'Scientific-6',
29
+ 'Scientific-7',
30
+ 'Ubuntu-14.04',
31
+ 'Ubuntu-16.04',
32
+ 'Ubuntu-18.04',
33
+ 'Ubuntu-20.04',
34
+ ].freeze
35
+
36
+ matrix = {
37
+ platform: [],
38
+ collection: %w[
39
+ puppet5
40
+ puppet6
41
+ puppet7-nightly
42
+ ],
43
+ }
44
+
45
+ metadata = JSON.parse(File.read('metadata.json'))
46
+ metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup|
47
+ os = sup['operatingsystem']
48
+ sup['operatingsystemrelease'].sort_by { |a| a.to_i }.each do |ver|
49
+ image_key = "#{os}-#{ver}"
50
+ if IMAGE_TABLE.key? image_key
51
+ matrix[:platform] << IMAGE_TABLE[image_key]
52
+ elsif DOCKER_PLATFORMS.include? image_key
53
+ puts "Expecting #{image_key} test using docker on travis"
54
+ else
55
+ puts "::warning::Cannot find image for #{image_key}"
56
+ end
57
+ end
58
+ end
59
+
60
+ puts "::set-output name=matrix::#{JSON.generate(matrix)}"
61
+
62
+ puts "Created matrix with #{matrix[:platform].length * matrix[:collection].length} cells."
@@ -18,7 +18,7 @@ module PuppetLitmus::InventoryManipulation
18
18
  raise "There is no inventory file at '#{inventory_full_path}'." unless File.exist?(inventory_full_path)
19
19
 
20
20
  inventory_hash = YAML.load_file(inventory_full_path)
21
- raise "Inventory file is incompatible (version 2 and up). Try the 'bolt project migrate' command." if inventory_hash.dig('version').nil? || (inventory_hash['version'] < 2)
21
+ raise "Inventory file is incompatible (version 2 and up). Try the 'bolt project migrate' command." if inventory_hash['version'].nil? || (inventory_hash['version'] < 2)
22
22
 
23
23
  inventory_hash
24
24
  end
@@ -50,12 +50,11 @@ module PuppetLitmus::InventoryManipulation
50
50
  # @param targets [Array]
51
51
  # @return [Array] array of targets.
52
52
  def find_targets(inventory_hash, targets)
53
- targets = if targets.nil?
54
- inventory_hash.to_s.scan(%r{uri"=>"(\S*)"}).flatten
55
- else
56
- [targets]
57
- end
58
- targets
53
+ if targets.nil?
54
+ inventory_hash.to_s.scan(%r{uri"=>"(\S*)"}).flatten
55
+ else
56
+ [targets]
57
+ end
59
58
  end
60
59
 
61
60
  # Determines if a node_name exists in a group in the inventory_hash.
@@ -147,6 +147,42 @@ module PuppetLitmus::PuppetHelpers
147
147
  end
148
148
  end
149
149
 
150
+ # Writes a string variable to a file on a target node at a specified path.
151
+ #
152
+ # @param content [String] String data to write to the file.
153
+ # @param destination [String] The path on the target node to write the file.
154
+ # @return [Bool] Success. The file was succesfully writtne on the target.
155
+ def write_file(content, destination)
156
+ Honeycomb.start_span(name: 'litmus.write_file') do |span|
157
+ ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
158
+ span.add_field('litmus.destination', destination)
159
+
160
+ require 'tmpdir'
161
+ target_node_name = ENV['TARGET_HOST']
162
+
163
+ Tempfile.create('litmus') do |tmp_file|
164
+ tmp_file.write(content)
165
+ tmp_file.flush
166
+ if target_node_name.nil? || target_node_name == 'localhost'
167
+ require 'fileutils'
168
+ # no need to transfer
169
+ FileUtils.cp(tmp_file.path, destination)
170
+ else
171
+ # transfer to TARGET_HOST
172
+ inventory_hash = inventory_hash_from_inventory_file
173
+ span.add_field('litmus.node_name', target_node_name)
174
+ add_platform_field(inventory_hash, target_node_name)
175
+
176
+ bolt_result = upload_file(tmp_file.path, destination, target_node_name, options: {}, config: nil, inventory: inventory_hash)
177
+ span.add_field('litmus.bolt_result.file_upload', bolt_result)
178
+ raise bolt_result.first['value'].to_s unless bolt_result.first['status'] == 'success'
179
+ end
180
+ end
181
+
182
+ true
183
+ end
184
+ end
185
+
150
186
  # Runs a command against the target system
151
187
  #
152
188
  # @param command_to_run [String] The command to execute.
@@ -382,7 +418,7 @@ module PuppetLitmus::PuppetHelpers
382
418
 
383
419
  # Return the stdout of the puppet run
384
420
  def puppet_output(bolt_result)
385
- bolt_result.dig(0, 'value', 'stderr').to_s << \
421
+ bolt_result.dig(0, 'value', 'stderr').to_s + \
386
422
  bolt_result.dig(0, 'value', 'stdout').to_s
387
423
  end
388
424
 
@@ -48,7 +48,7 @@ end
48
48
  module PuppetLitmus::RakeHelper
49
49
  # DEFAULT_CONFIG_DATA should be frozen for our safety, but it needs to work around https://github.com/puppetlabs/bolt/pull/1696
50
50
  DEFAULT_CONFIG_DATA ||= { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') } # .freeze # rubocop:disable Style/MutableConstant
51
- SUPPORTED_PROVISIONERS ||= %w[abs docker docker_exp vagrant vmpooler].freeze
51
+ SUPPORTED_PROVISIONERS ||= %w[abs docker docker_exp provision_service vagrant vmpooler].freeze
52
52
 
53
53
  # Gets a string representing the operating system and version.
54
54
  #
@@ -208,9 +208,13 @@ module PuppetLitmus::RakeHelper
208
208
  def configure_path(inventory_hash)
209
209
  results = []
210
210
  # fix the path on ssh_nodes
211
- unless inventory_hash['groups'].select { |group| group['name'] == 'ssh_nodes' }.size.zero?
212
- results = run_command('echo PATH="$PATH:/opt/puppetlabs/puppet/bin" > /etc/environment',
213
- 'ssh_nodes', config: nil, inventory: inventory_hash)
211
+ unless inventory_hash['groups'].select { |group| group['name'] == 'ssh_nodes' && !group['targets'].empty? }.size.zero?
212
+ results << run_command('echo PATH="$PATH:/opt/puppetlabs/puppet/bin" > /etc/environment',
213
+ 'ssh_nodes', config: nil, inventory: inventory_hash)
214
+ end
215
+ unless inventory_hash['groups'].select { |group| group['name'] == 'winrm_nodes' && !group['targets'].empty? }.size.zero?
216
+ results << run_command('[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Puppet Labs\Puppet\bin;C:\Program Files (x86)\Puppet Labs\Puppet\bin", "Machine")',
217
+ 'winrm_nodes', config: nil, inventory: inventory_hash)
214
218
  end
215
219
  results
216
220
  end
@@ -227,7 +231,7 @@ module PuppetLitmus::RakeHelper
227
231
  module_dir ||= Dir.pwd
228
232
  target_dir ||= File.join(source_dir, 'pkg')
229
233
 
230
- puts "Building '#{module_dir}' into '#{target_dir}''"
234
+ puts "Building '#{module_dir}' into '#{target_dir}'"
231
235
  builder = Puppet::Modulebuilder::Builder.new(module_dir, target_dir, nil)
232
236
 
233
237
  # Force the metadata to be read. Raises if metadata could not be found
@@ -269,8 +273,9 @@ module PuppetLitmus::RakeHelper
269
273
  # @param target_node_name [String] the name of the target where the module should be installed
270
274
  # @param module_tar [String] the filename of the module tarball to upload
271
275
  # @param module_repository [String] the URL for the forge to use for downloading modules. Defaults to the public Forge API.
276
+ # @param ignore_dependencies [Boolean] flag used to ignore module dependencies defaults to false.
272
277
  # @return a bolt result
273
- def install_module(inventory_hash, target_node_name, module_tar, module_repository = nil)
278
+ def install_module(inventory_hash, target_node_name, module_tar, module_repository = nil, ignore_dependencies = false) # rubocop:disable Style/OptionalBooleanParameter
274
279
  Honeycomb.start_span(name: 'install_module') do |span|
275
280
  ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
276
281
  span.add_field('litmus.target_node_name', target_node_name)
@@ -290,6 +295,7 @@ module PuppetLitmus::RakeHelper
290
295
 
291
296
  module_repository_opts = "--module_repository '#{module_repository}'" unless module_repository.nil?
292
297
  install_module_command = "puppet module install #{module_repository_opts} #{File.basename(module_tar)}"
298
+ install_module_command += ' --ignore-dependencies --force' if ignore_dependencies.to_s.downcase == 'true'
293
299
  span.add_field('litmus.install_module_command', install_module_command)
294
300
 
295
301
  bolt_result = run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash.clone)
@@ -59,7 +59,7 @@ namespace :litmus do
59
59
  if result.first['status'] != 'success'
60
60
  failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
61
61
  else
62
- STDOUT.puts "#{result.first['value']['node_name']}, #{image}"
62
+ $stdout.puts "#{result.first['value']['node_name']}, #{image}"
63
63
  end
64
64
  results << result
65
65
  end
@@ -122,21 +122,34 @@ namespace :litmus do
122
122
  command_to_run = "bolt task run puppet_agent::install --targets #{result['target']} --inventoryfile inventory.yaml --modulepath #{DEFAULT_CONFIG_DATA['modulepath']}"
123
123
  raise "Failed on #{result['target']}\n#{result}\ntry running '#{command_to_run}'"
124
124
  else
125
+ # validate successful install
126
+ puts "Successfull install result: #{result.inspect}" if ENV['DEBUG'] == true
127
+ retries = 0
128
+ begin
129
+ responses = run_command('puppet --version', targets, options: {}, config: DEFAULT_CONFIG_DATA, inventory: inventory_hash.clone)
130
+ responses.each do |response|
131
+ raise "Error checking puppet version on #{response.to_json}" if response['status'] != 'success'
132
+ end
133
+ rescue StandardError => e
134
+ puts "ERROR:#{e}"
135
+ # fix the path
136
+ path_changes = configure_path(inventory_hash)
137
+ path_changes.each do |change|
138
+ puts "Configuring puppet path result: #{change.inspect}"
139
+ end
140
+
141
+ retries += 1
142
+ sleep 3
143
+ retry if retries <= 300
144
+ raise 'Failed to detect installed puppet version after 5 minutes'
145
+ end
146
+
125
147
  # add puppet-agent feature to successful nodes
126
148
  inventory_hash = add_feature_to_node(inventory_hash, 'puppet-agent', result['target'])
127
149
  end
128
150
  end
129
151
  # update the inventory with the puppet-agent feature set per node
130
152
  write_to_inventory_file(inventory_hash, 'inventory.yaml')
131
-
132
- # fix the path on ssh_nodes
133
- results = configure_path(inventory_hash)
134
-
135
- results.each do |result|
136
- if result['status'] != 'success'
137
- puts "Failed on #{result['target']}\n#{result}"
138
- end
139
- end
140
153
  end
141
154
 
142
155
  # Add a given feature to a selection of nodes
@@ -195,8 +208,8 @@ namespace :litmus do
195
208
  # @param :source [String] source directory to look in (ignores symlinks) defaults do './spec/fixtures/modules'.
196
209
  # @param :target_node_name [Array] nodes on which to install a puppet module for testing.
197
210
  desc 'build and install all modules from a directory'
198
- task :install_modules_from_directory, [:source, :target_node_name, :module_repository] do |_task, args|
199
- args.with_defaults(source: nil, target_node_name: nil, module_repository: nil)
211
+ task :install_modules_from_directory, [:source, :target_node_name, :module_repository, :ignore_dependencies] do |_task, args|
212
+ args.with_defaults(source: nil, target_node_name: nil, module_repository: nil, ignore_dependencies: false)
200
213
  inventory_hash = inventory_hash_from_inventory_file
201
214
  target_nodes = find_targets(inventory_hash, args[:target_node_name])
202
215
  if target_nodes.empty?
@@ -217,7 +230,7 @@ namespace :litmus do
217
230
  module_tars.each do |module_tar|
218
231
  puts "Installing '#{module_tar}'"
219
232
  target_nodes.each do |target_node_name|
220
- install_module(inventory_hash, target_node_name, module_tar, args[:module_repository])
233
+ install_module(inventory_hash, target_node_name, module_tar, args[:module_repository], args[:ignore_dependencies])
221
234
  puts "Installed '#{module_tar}' on #{target_node_name}"
222
235
  end
223
236
  end
@@ -321,15 +334,21 @@ namespace :litmus do
321
334
 
322
335
  # Run acceptance tests against all machines in the inventory file in parallel.
323
336
  desc 'Run tests in parallel against all machines in the inventory file'
324
- task :parallel do
337
+ task :parallel, [:tag] do |_task, args|
338
+ args.with_defaults(tag: nil)
325
339
  if targets.empty?
326
340
  puts 'No targets found'
327
341
  exit 0
328
342
  end
343
+ tag_value = if args[:tag].nil?
344
+ nil
345
+ else
346
+ "--tag #{args[:tag]}"
347
+ end
329
348
  payloads = []
330
349
  # Generate list of targets to provision
331
350
  targets.each do |target|
332
- test = 'bundle exec rspec ./spec/acceptance --format progress --require rspec_honeycomb_formatter --format RSpecHoneycombFormatter'
351
+ test = "bundle exec rspec ./spec/acceptance #{tag_value} --format progress --require rspec_honeycomb_formatter --format RSpecHoneycombFormatter"
333
352
  title = "#{target}, #{facts_from_node(inventory_hash, target)['platform']}"
334
353
  options = {
335
354
  env: {
@@ -367,9 +386,9 @@ namespace :litmus do
367
386
  # because we cannot modify variables inside of Parallel
368
387
  results.each do |result|
369
388
  if result.last.to_i.zero?
370
- success_list.push(result.first.scan(%r{.*})[2])
389
+ success_list.push(result.first.scan(%r{.*})[3])
371
390
  else
372
- failure_list.push(result.first.scan(%r{.*})[2])
391
+ failure_list.push(result.first.scan(%r{.*})[3])
373
392
  end
374
393
  end
375
394
  Thread.kill(progress)
@@ -411,8 +430,9 @@ namespace :litmus do
411
430
  desc "Run serverspec against #{target}"
412
431
  next if target == 'litmus_localhost'
413
432
 
414
- RSpec::Core::RakeTask.new(target.to_sym) do |t|
433
+ RSpec::Core::RakeTask.new(target.to_sym, :tag) do |t, args|
415
434
  t.pattern = 'spec/acceptance/**{,/*/**}/*_spec.rb'
435
+ t.rspec_opts = "--tag #{args[:tag]}" unless args[:tag].nil?
416
436
  ENV['TARGET_HOST'] = target
417
437
  end
418
438
  end
@@ -421,8 +441,9 @@ namespace :litmus do
421
441
  # add localhost separately
422
442
  desc 'Run serverspec against localhost, USE WITH CAUTION, this action can be potentially dangerous.'
423
443
  host = 'localhost'
424
- RSpec::Core::RakeTask.new(host.to_sym) do |t|
444
+ RSpec::Core::RakeTask.new(host.to_sym, :tag) do |t, args|
425
445
  t.pattern = 'spec/acceptance/**{,/*/**}/*_spec.rb'
446
+ t.rspec_opts = "--tag #{args[:tag]}" unless args[:tag].nil?
426
447
  Rake::Task['spec_prep'].invoke
427
448
  ENV['TARGET_HOST'] = host
428
449
  end
@@ -35,6 +35,7 @@ module PuppetLitmus
35
35
  options[:port] = node_config.dig('ssh', 'port') unless node_config.dig('ssh', 'port').nil?
36
36
  options[:keys] = node_config.dig('ssh', 'private-key') unless node_config.dig('ssh', 'private-key').nil?
37
37
  options[:password] = node_config.dig('ssh', 'password') unless node_config.dig('ssh', 'password').nil?
38
+ run_as = node_config.dig('ssh', 'run-as') unless node_config.dig('ssh', 'run-as').nil?
38
39
  # Support both net-ssh 4 and 5.
39
40
  # rubocop:disable Metrics/BlockNesting
40
41
  options[:verify_host_key] = if node_config.dig('ssh', 'host-key-check').nil?
@@ -67,6 +68,8 @@ module PuppetLitmus
67
68
  set :host, options[:host_name] || host
68
69
  set :ssh_options, options
69
70
  set :request_pty, false
71
+ set :sudo_password, options[:password] if run_as
72
+ puts "Running tests as #{run_as}" if run_as
70
73
  elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'winrm_nodes')
71
74
  require 'winrm'
72
75
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  # version of this gem
4
4
  module PuppetLitmus
5
- VERSION ||= '0.18.4'
5
+ VERSION ||= '0.19.0'
6
6
  end
@@ -113,10 +113,10 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
113
113
  let(:local) { '/tmp' }
114
114
  let(:remote) { '/remote_tmp' }
115
115
  # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
116
- # rubocop:disable Layout/SpaceInsideHashLiteralBraces, Layout/SpaceInsideBlockBraces, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
117
- let(:result_success) {[{'target'=>'some.host','action'=>'upload','object'=>'C:\foo\bar.ps1','status'=>'success','value'=>{'_output'=>'Uploaded \'C:\foo\bar.ps1\' to \'some.host:C:\bar\''}}]}
118
- let(:result_failure) {[{'target'=>'some.host','action'=>nil,'object'=>nil,'status'=>'failure','value'=>{'_error'=>{'kind'=>'puppetlabs.tasks/task_file_error','msg'=>'No such file or directory @ rb_sysopen - /nonexistant/file/path','details'=>{},'issue_code'=>'WRITE_ERROR'}}}]}
119
- # rubocop:enable Layout/SpaceInsideHashLiteralBraces, Layout/SpaceInsideBlockBraces, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
116
+ # rubocop:disable Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
117
+ let(:result_success) { [{ 'target'=>'some.host','action'=>'upload','object'=>'C:\foo\bar.ps1','status'=>'success','value'=>{ '_output'=>'Uploaded \'C:\foo\bar.ps1\' to \'some.host:C:\bar\'' } }] }
118
+ let(:result_failure) { [{ 'target'=>'some.host','action'=>nil,'object'=>nil,'status'=>'failure','value'=>{ '_error'=>{ 'kind'=>'puppetlabs.tasks/task_file_error','msg'=>'No such file or directory @ rb_sysopen - /nonexistant/file/path','details'=>{},'issue_code'=>'WRITE_ERROR' } } }] }
119
+ # rubocop:enable, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
120
120
 
121
121
  it 'responds to run_shell' do
122
122
  expect(self).to respond_to(:bolt_upload_file).with(2..3).arguments
@@ -212,11 +212,11 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
212
212
  let(:params) { { 'action' => 'install', 'name' => 'foo' } }
213
213
  let(:config_data) { { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') } }
214
214
  # Ignore rubocop because these hashes are representative of output from an external method and editing them leads to test failures.
215
- # rubocop:disable Layout/SpaceInsideHashLiteralBraces, Layout/SpaceBeforeBlockBraces, Layout/SpaceInsideBlockBraces, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
216
- let(:result_unstructured_task_success){ [{'target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'success','value'=>{'_output'=>'SUCCESS!'}}]}
217
- let(:result_structured_task_success){ [{'target'=>'some.host','action'=>'task','object'=>'testtask::structured','status'=>'success','value'=>{'key1'=>'foo','key2'=>'bar'}}]}
218
- let(:result_failure) {[{'target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'failure','value'=>{'_error'=>{'msg'=>'FAILURE!','kind'=>'puppetlabs.tasks/task-error','details'=>{'exitcode'=>123}}}}]}
219
- # rubocop:enable Layout/SpaceInsideHashLiteralBraces, Layout/SpaceBeforeBlockBraces, Layout/SpaceInsideBlockBraces, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
215
+ # rubocop:disable Layout/SpaceBeforeBlockBraces
216
+ let(:result_unstructured_task_success){ [{ 'target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'success','value'=>{ '_output'=>'SUCCESS!' } }] }
217
+ let(:result_structured_task_success){ [{ 'target'=>'some.host','action'=>'task','object'=>'testtask::structured','status'=>'success','value'=>{ 'key1'=>'foo','key2'=>'bar' } }] }
218
+ let(:result_failure) { [{ 'target'=>'some.host','action'=>'task','object'=>'testtask::unstructured','status'=>'failure','value'=>{ '_error'=>{ 'msg'=>'FAILURE!','kind'=>'puppetlabs.tasks/task-error','details'=>{ 'exitcode'=>123 } } } }] }
219
+ # rubocop:enable Layout/SpaceBeforeBlockBraces, Layout/SpaceAroundOperators, Layout/LineLength, Layout/SpaceAfterComma
220
220
 
221
221
  it 'responds to bolt_run_task' do
222
222
  expect(self).to respond_to(:run_bolt_task).with(2..3).arguments
@@ -286,4 +286,42 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
286
286
  end
287
287
  end
288
288
  end
289
+
290
+ describe '.write_file' do
291
+ let(:content) { 'foo' }
292
+ let(:destination) { '/tmp/foo' }
293
+ let(:owner) { 'foo:foo' }
294
+ let(:local_path) { '/tmp/local_foo' }
295
+
296
+ before(:each) do
297
+ allow_any_instance_of(File).to receive(:path).and_return(local_path)
298
+ end
299
+
300
+ it 'responds to write_file' do
301
+ expect(self).to respond_to(:write_file).with(2).arguments
302
+ end
303
+
304
+ context 'without setting owner' do
305
+ it 'call upload file with the correct params' do
306
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
307
+ expect(self).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
308
+ result = instance_double('result')
309
+ allow(result).to receive(:first).and_return({ 'status' => 'success' })
310
+ expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result)
311
+ result = write_file(content, destination)
312
+ expect(result).to be true
313
+ end
314
+ end
315
+
316
+ context 'when upload encounters an error' do
317
+ it 'call upload file with the correct params' do
318
+ stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
319
+ expect(self).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
320
+ result = instance_double('result')
321
+ allow(result).to receive(:first).and_return({ 'status' => 'failure', 'value' => 'foo error' })
322
+ expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result)
323
+ expect { write_file(content, destination) }.to raise_error 'foo error'
324
+ end
325
+ end
326
+ end
289
327
  end
@@ -19,9 +19,9 @@ describe 'litmus rake tasks' do
19
19
  'template-ref' => 'heads/master-0-g7827fc2' }
20
20
  expect(File).to receive(:read).with(any_args).once
21
21
  expect(JSON).to receive(:parse).with(any_args).and_return(metadata)
22
- expect(STDOUT).to receive(:puts).with('redhat-5-x86_64')
23
- expect(STDOUT).to receive(:puts).with('ubuntu-1404-x86_64')
24
- expect(STDOUT).to receive(:puts).with('ubuntu-1804-x86_64')
22
+ expect($stdout).to receive(:puts).with('redhat-5-x86_64')
23
+ expect($stdout).to receive(:puts).with('ubuntu-1404-x86_64')
24
+ expect($stdout).to receive(:puts).with('ubuntu-1804-x86_64')
25
25
  Rake::Task['litmus:metadata'].invoke
26
26
  end
27
27
  end
@@ -39,11 +39,11 @@ describe 'litmus rake tasks' do
39
39
  expect_any_instance_of(PuppetLitmus::InventoryManipulation).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
40
40
  expect(File).to receive(:directory?).with(target_dir).and_return(true)
41
41
  expect_any_instance_of(Object).to receive(:build_modules_in_dir).with(target_dir).and_return([dummy_tar])
42
- expect(STDOUT).to receive(:puts).with(start_with('Building all modules in'))
42
+ expect($stdout).to receive(:puts).with(start_with('Building all modules in'))
43
43
  expect_any_instance_of(Object).to receive(:upload_file).once.and_return([])
44
- expect(STDOUT).to receive(:puts).with(start_with('Installing \'spec/data/doot.tar.gz\''))
44
+ expect($stdout).to receive(:puts).with(start_with('Installing \'spec/data/doot.tar.gz\''))
45
45
  expect_any_instance_of(Object).to receive(:run_command).twice.and_return([])
46
- expect(STDOUT).to receive(:puts).with(start_with('Installed \'spec/data/doot.tar.gz\''))
46
+ expect($stdout).to receive(:puts).with(start_with('Installed \'spec/data/doot.tar.gz\''))
47
47
  Rake::Task['litmus:install_modules_from_directory'].invoke('./spec/fixtures/modules')
48
48
  end
49
49
  end
@@ -68,7 +68,7 @@ describe 'litmus rake tasks' do
68
68
 
69
69
  allow(File).to receive(:directory?).with(any_args).and_return(true)
70
70
  allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with(any_args).and_return(results)
71
- expect(STDOUT).to receive(:puts).with('localhost:2222, centos:7')
71
+ expect($stdout).to receive(:puts).with('localhost:2222, centos:7')
72
72
  Rake::Task['litmus:provision'].invoke('docker', 'centos:7')
73
73
  end
74
74
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet_litmus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.4
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-01 00:00:00.000000000 Z
11
+ date: 2020-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bolt
@@ -79,7 +79,7 @@ dependencies:
79
79
  version: '1.34'
80
80
  - - "<"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.0.0
82
+ version: 3.0.0
83
83
  type: :runtime
84
84
  prerelease: false
85
85
  version_requirements: !ruby/object:Gem::Requirement
@@ -89,7 +89,7 @@ dependencies:
89
89
  version: '1.34'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
- version: 2.0.0
92
+ version: 3.0.0
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: parallel
95
95
  requirement: !ruby/object:Gem::Requirement
@@ -150,12 +150,14 @@ description: " Providing a simple command line tool for puppet content creato
150
150
  to enable simple and complex test deployments.\n"
151
151
  email:
152
152
  - info@puppet.com
153
- executables: []
153
+ executables:
154
+ - matrix_from_metadata
154
155
  extensions: []
155
156
  extra_rdoc_files: []
156
157
  files:
157
158
  - LICENSE
158
159
  - README.md
160
+ - exe/matrix_from_metadata
159
161
  - lib/puppet_litmus.rb
160
162
  - lib/puppet_litmus/inventory_manipulation.rb
161
163
  - lib/puppet_litmus/puppet_helpers.rb
@@ -193,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
195
  - !ruby/object:Gem::Version
194
196
  version: '0'
195
197
  requirements: []
196
- rubygems_version: 3.1.2
198
+ rubygems_version: 3.1.4
197
199
  signing_key:
198
200
  specification_version: 4
199
201
  summary: Providing a simple command line tool for puppet content creators, to enable