puppet_litmus 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffba803cc6b53c4bdb7084bf11be4fac807f3b3cd237c5ddb297dcf6ca3a403d
4
- data.tar.gz: 5cdb613f2be957e20a63fc1250b10113e468e162817657f0f987675f2ba7c055
3
+ metadata.gz: 6f012bba513b46a7010b134d2ca78b733c9bdad8320e13798a4439ae1a7b43e3
4
+ data.tar.gz: da8f952b4faf060ffe4ec4913235e065a17019ede06437dddb0077a123d61149
5
5
  SHA512:
6
- metadata.gz: ea1fd95a69bfac81b56f94f3ee28b91be2587c501bf24729931c128315e41d5eaf937dce013ee0d63ec7a350469ac32ab0d7711e50411a0e5fe00340dabdd803
7
- data.tar.gz: 899ac2b0edb422ccf35c9cdb5f46bec6b2a6a97557dca12ffc994e046ed8cf1e6eec2553865a3c4439b272d1dd29b0111fc24b2e1bb93575cb77fc0bfd7606b1
6
+ metadata.gz: 1889d8192777dfb2e2a006c96c549e58b6c080d59a8c0279bf66ce07d048ebb03e5ce4cc694bb24e20ad37560bb19e2112e7030dad57dab8c9b8d142b1046f21
7
+ data.tar.gz: ffe79dd1557c4d40bc9f04eb737964cadd807c8b4f72a3615e1d13b7d6fb5e15c7c5cc8732f8e6b57aa8a36d8d370c83b6ae571ad68cfe217751cee3db3824a0
@@ -262,7 +262,12 @@ module PuppetLitmus::InventoryManipulation
262
262
  # @param inventory_hash [Hash] hash of the inventory.yaml file
263
263
  # @param node_name [String] node of nodes to limit the search for the node_name in
264
264
  def add_platform_field(inventory_hash, node_name)
265
- facts = facts_from_node(inventory_hash, node_name)
265
+ facts = begin
266
+ facts_from_node(inventory_hash, node_name)
267
+ rescue StandardError => e
268
+ warn e
269
+ {}
270
+ end
266
271
  Honeycomb.current_span.add_field('litmus.platform', facts&.dig('platform'))
267
272
  end
268
273
  end
@@ -192,7 +192,6 @@ module PuppetLitmus::RakeHelper
192
192
  params = if collection.nil?
193
193
  {}
194
194
  else
195
- Honeycomb.current_span.add_field('litmus.collection', collection)
196
195
  { 'collection' => collection }
197
196
  end
198
197
  raise "puppet_agent was not found in #{DEFAULT_CONFIG_DATA['modulepath']}, please amend the .fixtures.yml file" \
@@ -336,19 +335,24 @@ module PuppetLitmus::RakeHelper
336
335
  ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
337
336
  # if we're only checking connectivity for a single node
338
337
  if target_node_name
339
- span.add_field('litmus.node_name', target_node_name)
338
+ span.add_field('litmus.target_node_name', target_node_name)
340
339
  add_platform_field(inventory_hash, target_node_name)
341
340
  end
342
341
 
343
342
  include ::BoltSpec::Run
344
343
  target_nodes = find_targets(inventory_hash, target_node_name)
344
+ puts "Checking connectivity for #{target_nodes.inspect}"
345
+ span.add_field('litmus.target_nodes', target_nodes)
346
+
345
347
  results = run_command('cd .', target_nodes, config: nil, inventory: inventory_hash)
346
348
  span.add_field('litmus.bolt_result', results)
347
349
  failed = []
348
- results.each do |result|
349
- failed.push(result['target']) if result['status'] == 'failure'
350
+ results.reject { |r| r['status'] == 'success' }.each do |result|
351
+ puts "Failure connecting to #{result['target']}:\n#{result.inspect}"
352
+ failed.push(result['target'])
350
353
  end
351
- span.add_field('litmus.connectivity_failed', failed)
354
+ span.add_field('litmus.connectivity_success', results.select { |r| r['status'] == 'success' })
355
+ span.add_field('litmus.connectivity_failure', results.reject { |r| r['status'] == 'success' })
352
356
  raise "Connectivity has failed on: #{failed}" unless failed.length.zero?
353
357
 
354
358
  true
@@ -397,4 +401,50 @@ module PuppetLitmus::RakeHelper
397
401
 
398
402
  nil
399
403
  end
404
+
405
+ def start_spinner(message)
406
+ if (ENV['CI'] || '').downcase == 'true'
407
+ puts message
408
+ spinner = Thread.new do
409
+ # CI systems are strange beasts, we only output a '.' every wee while to keep the terminal alive.
410
+ loop do
411
+ printf '.'
412
+ sleep(10)
413
+ end
414
+ end
415
+ else
416
+ require 'tty-spinner'
417
+ spinner = TTY::Spinner.new("[:spinner] #{message}")
418
+ spinner.auto_spin
419
+ end
420
+ spinner
421
+ end
422
+
423
+ def stop_spinner(spinner)
424
+ if (ENV['CI'] || '').downcase == 'true'
425
+ Thread.kill(spinner)
426
+ else
427
+ spinner.success
428
+ end
429
+ end
430
+
431
+ require 'retryable'
432
+
433
+ Retryable.configure do |config|
434
+ config.sleep = ->(n) { (1.5**n) + Random.rand(0.5) }
435
+ # config.log_method = ->(retries, exception) do
436
+ # Logger.new($stdout).debug("[Attempt ##{retries}] Retrying because [#{exception.class} - #{exception.message}]: #{exception.backtrace.first(5).join(' | ')}")
437
+ # end
438
+ end
439
+
440
+ class LitmusTimeoutError < StandardError; end
441
+
442
+ def with_retries(options: { tries: Float::INFINITY }, max_wait_minutes: 5)
443
+ stop = Time.now + (max_wait_minutes * 60)
444
+ Retryable.retryable(options.merge(not: [LitmusTimeoutError])) do
445
+ raise LitmusTimeoutError if Time.now > stop
446
+
447
+ yield
448
+ end
449
+ end
400
450
  end
@@ -36,24 +36,11 @@ namespace :litmus do
36
36
  results = []
37
37
  failed_image_message = ''
38
38
  provision_hash[args[:key]]['images'].each do |image|
39
- if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
40
- progress = Thread.new do
41
- loop do
42
- printf '.'
43
- sleep(10)
44
- end
45
- end
46
- else
47
- require 'tty-spinner'
48
- spinner = TTY::Spinner.new("Provisioning #{image} using #{provisioner} provisioner.[:spinner]")
49
- spinner.auto_spin
50
- end
51
- result = provision(provisioner, image, inventory_vars)
52
-
53
- if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
54
- Thread.kill(progress)
55
- else
56
- spinner.success
39
+ begin
40
+ spinner = start_spinner("Provisioning #{image} using #{provisioner} provisioner.")
41
+ result = provision(provisioner, image, inventory_vars)
42
+ ensure
43
+ stop_spinner(spinner)
57
44
  end
58
45
 
59
46
  if result.first['status'] != 'success'
@@ -74,28 +61,35 @@ namespace :litmus do
74
61
  desc 'provision a test system using the given provisioner and platform name. See the puppetlabs-provision module tasks for more documentation'
75
62
  task :provision, [:provisioner, :platform, :inventory_vars] do |_task, args|
76
63
  Rake::Task['spec_prep'].invoke
77
- if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
78
- progress = Thread.new do
79
- loop do
80
- printf '.'
81
- sleep(10)
64
+
65
+ begin
66
+ spinner = start_spinner("Provisioning #{args[:platform]} using #{args[:provisioner]} provisioner.")
67
+
68
+ results = provision(args[:provisioner], args[:platform], args[:inventory_vars])
69
+
70
+ unless results.first['status'] == 'success'
71
+ raise "Failed provisioning #{args[:platform]} using #{args[:provisioner]}\n#{results.first}"
72
+ end
73
+
74
+ puts "Successfully provisioned #{args[:platform]} using #{args[:provisioner]}\n"
75
+
76
+ target_names = if results.first['value']['node']
77
+ [results.first['value']['node']['uri']]
78
+ else
79
+ results.first['value']['target_names'] || [] # provision_service multi-node provisioning
80
+ end
81
+ target_names.each do |target|
82
+ Honeycomb.start_span(name: 'litmus.provision.check_connectivity') do |span|
83
+ span.add_field('target_name', target)
84
+ with_retries do
85
+ check_connectivity?(inventory_hash_from_inventory_file, target)
86
+ end
82
87
  end
83
88
  end
84
- else
85
- require 'tty-spinner'
86
- spinner = TTY::Spinner.new("Provisioning #{args[:platform]} using #{args[:provisioner]} provisioner.[:spinner]")
87
- spinner.auto_spin
88
- end
89
- results = provision(args[:provisioner], args[:platform], args[:inventory_vars])
90
- if results.first['status'] != 'success'
91
- raise "Failed provisioning #{args[:platform]} using #{args[:provisioner]}\n#{results.first}"
89
+ ensure
90
+ stop_spinner(spinner)
92
91
  end
93
92
 
94
- if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
95
- Thread.kill(progress)
96
- else
97
- spinner.success
98
- end
99
93
  puts "#{results.first['value']['node_name']}, #{args[:platform]}"
100
94
  end
101
95
 
@@ -134,8 +128,10 @@ namespace :litmus do
134
128
  puts "ERROR:#{e}"
135
129
  # fix the path
136
130
  path_changes = configure_path(inventory_hash)
137
- path_changes.each do |change|
138
- puts "Configuring puppet path result: #{change.inspect}"
131
+ if ENV['DEBUG'] == true
132
+ path_changes.each do |change|
133
+ puts "Configuring puppet path result: #{change.inspect}"
134
+ end
139
135
  end
140
136
 
141
137
  retries += 1
@@ -362,7 +358,7 @@ namespace :litmus do
362
358
  success_list = []
363
359
  failure_list = []
364
360
  # Provision targets depending on what environment we're in
365
- if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
361
+ if ENV['CI'] == 'true'
366
362
  # CI systems are strange beasts, we only output a '.' every wee while to keep the terminal alive.
367
363
  puts "Running against #{targets.size} targets.\n"
368
364
  progress = Thread.new do
@@ -2,5 +2,5 @@
2
2
 
3
3
  # version of this gem
4
4
  module PuppetLitmus
5
- VERSION ||= '0.19.0'
5
+ VERSION ||= '0.20.0'
6
6
  end
@@ -68,6 +68,9 @@ 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_any_instance_of(PuppetLitmus::InventoryManipulation).to receive(:inventory_hash_from_inventory_file).and_return({})
72
+ allow_any_instance_of(PuppetLitmus::RakeHelper).to receive(:check_connectivity?).with(any_args).and_return(true)
73
+ expect($stdout).to receive(:puts).with("Successfully provisioned centos:7 using docker\n")
71
74
  expect($stdout).to receive(:puts).with('localhost:2222, centos:7')
72
75
  Rake::Task['litmus:provision'].invoke('docker', 'centos:7')
73
76
  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.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet, Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-23 00:00:00.000000000 Z
11
+ date: 2020-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bolt
@@ -90,6 +90,20 @@ dependencies:
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: 3.0.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: retryable
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '3.0'
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '3.0'
93
107
  - !ruby/object:Gem::Dependency
94
108
  name: parallel
95
109
  requirement: !ruby/object:Gem::Requirement
@@ -180,7 +194,7 @@ homepage: https://github.com/puppetlabs/puppet_litmus
180
194
  licenses:
181
195
  - Apache-2.0
182
196
  metadata: {}
183
- post_install_message:
197
+ post_install_message:
184
198
  rdoc_options: []
185
199
  require_paths:
186
200
  - lib
@@ -196,18 +210,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
210
  version: '0'
197
211
  requirements: []
198
212
  rubygems_version: 3.1.4
199
- signing_key:
213
+ signing_key:
200
214
  specification_version: 4
201
215
  summary: Providing a simple command line tool for puppet content creators, to enable
202
216
  simple and complex test deployments.
203
217
  test_files:
204
- - spec/spec_helper.rb
205
- - spec/lib/puppet_litmus/rake_tasks_spec.rb
206
- - spec/lib/puppet_litmus/version_spec.rb
218
+ - spec/data/doot.tar.gz
219
+ - spec/data/inventory.yaml
220
+ - spec/data/jim.yaml
207
221
  - spec/lib/puppet_litmus/util_spec.rb
222
+ - spec/lib/puppet_litmus/version_spec.rb
208
223
  - spec/lib/puppet_litmus/inventory_manipulation_spec.rb
209
224
  - spec/lib/puppet_litmus/rake_helper_spec.rb
210
225
  - spec/lib/puppet_litmus/puppet_helpers_spec.rb
211
- - spec/data/doot.tar.gz
212
- - spec/data/jim.yaml
213
- - spec/data/inventory.yaml
226
+ - spec/lib/puppet_litmus/rake_tasks_spec.rb
227
+ - spec/spec_helper.rb