puppet_litmus 0.36.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/matrix_from_metadata +8 -12
- data/exe/matrix_from_metadata_v2 +15 -21
- data/lib/puppet_litmus/inventory_manipulation.rb +16 -26
- data/lib/puppet_litmus/puppet_helpers.rb +13 -15
- data/lib/puppet_litmus/rake_helper.rb +23 -25
- data/lib/puppet_litmus/rake_tasks.rb +14 -16
- data/lib/puppet_litmus/spec_helper_acceptance.rb +7 -7
- data/lib/puppet_litmus/version.rb +1 -1
- data/spec/exe/matrix_from_metadata_v2_spec.rb +12 -12
- data/spec/lib/puppet_litmus/inventory_manipulation_spec.rb +4 -6
- data/spec/lib/puppet_litmus/puppet_helpers_spec.rb +13 -11
- data/spec/lib/puppet_litmus/puppet_litmus_version_spec.rb +2 -2
- data/spec/lib/puppet_litmus/rake_helper_spec.rb +6 -6
- data/spec/lib/puppet_litmus/rake_tasks_spec.rb +9 -6
- data/spec/lib/puppet_litmus/util_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -2
- data/spec/support/inventory.rb +11 -11
- metadata +41 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f2e5cb7497ccf31dbdb164f7a408c92940831f6e46b5ec5dc6b369bc39b8277
|
4
|
+
data.tar.gz: 1f38af54816bb26cd8787c9e209afe7b3f1589355cb324c60eb3ca9fcde05dc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cdcccf05f113f0ea462ceac7709c5299a622b1343d6ed8fd1f26dc51122e7068bb7f7ab5808fd5f052e83d4f9efc1631b7a69d933e3078b32fbec335ea91de6
|
7
|
+
data.tar.gz: 12f93057558409cad13d67b705f1a7a021d470f8885e4fe8421591eb091dc1a8869e2637d95991a5efb77348c0a96abecda1d22ad047aa8ae5be75a61cfa78a7
|
data/exe/matrix_from_metadata
CHANGED
@@ -31,7 +31,7 @@ IMAGE_TABLE = {
|
|
31
31
|
'SLES-15' => 'sles-15',
|
32
32
|
'Windows-2012 R2' => 'windows-2012-r2-core',
|
33
33
|
'Windows-2016' => 'windows-2016',
|
34
|
-
'Windows-2019' => 'windows-2019-core'
|
34
|
+
'Windows-2019' => 'windows-2019-core'
|
35
35
|
}.freeze
|
36
36
|
|
37
37
|
DOCKER_PLATFORMS = [
|
@@ -48,26 +48,26 @@ DOCKER_PLATFORMS = [
|
|
48
48
|
'Ubuntu-14.04',
|
49
49
|
'Ubuntu-16.04',
|
50
50
|
'Ubuntu-18.04',
|
51
|
-
'Ubuntu-20.04'
|
51
|
+
'Ubuntu-20.04'
|
52
52
|
].freeze
|
53
53
|
|
54
54
|
# This table uses the latest version in each collection for accurate
|
55
55
|
# comparison when evaluating puppet requirements from the metadata
|
56
56
|
COLLECTION_TABLE = {
|
57
57
|
'6.21.0' => 'puppet6-nightly',
|
58
|
-
'7.4.0' => 'puppet7-nightly'
|
58
|
+
'7.4.0' => 'puppet7-nightly'
|
59
59
|
}.freeze
|
60
60
|
|
61
61
|
matrix = {
|
62
62
|
platform: [],
|
63
|
-
collection: []
|
63
|
+
collection: []
|
64
64
|
}
|
65
65
|
|
66
66
|
metadata = JSON.parse(File.read('metadata.json'))
|
67
67
|
# Set platforms based on declared operating system support
|
68
68
|
metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup|
|
69
69
|
os = sup['operatingsystem']
|
70
|
-
sup['operatingsystemrelease'].sort_by
|
70
|
+
sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver|
|
71
71
|
image_key = "#{os}-#{ver}"
|
72
72
|
if IMAGE_TABLE.key? image_key
|
73
73
|
matrix[:platform] << IMAGE_TABLE[image_key]
|
@@ -84,7 +84,7 @@ if metadata.key?('requirements') && metadata['requirements'].length.positive?
|
|
84
84
|
metadata['requirements'].each do |req|
|
85
85
|
next unless req.key?('name') && req.key?('version_requirement') && req['name'] == 'puppet'
|
86
86
|
|
87
|
-
ver_regexp =
|
87
|
+
ver_regexp = /^([>=<]{1,2})\s*([\d.]+)\s+([>=<]{1,2})\s*([\d.]+)$/
|
88
88
|
match = ver_regexp.match(req['version_requirement'])
|
89
89
|
if match.nil?
|
90
90
|
puts "::warning::Didn't recognize version_requirement '#{req['version_requirement']}'"
|
@@ -95,17 +95,13 @@ if metadata.key?('requirements') && metadata['requirements'].length.positive?
|
|
95
95
|
reqs = ["#{cmp_one} #{ver_one}", "#{cmp_two} #{ver_two}"]
|
96
96
|
|
97
97
|
COLLECTION_TABLE.each do |key, val|
|
98
|
-
if Gem::Requirement.create(reqs).satisfied_by?(Gem::Version.new(key))
|
99
|
-
matrix[:collection] << val
|
100
|
-
end
|
98
|
+
matrix[:collection] << val if Gem::Requirement.create(reqs).satisfied_by?(Gem::Version.new(key))
|
101
99
|
end
|
102
100
|
end
|
103
101
|
end
|
104
102
|
|
105
103
|
# Set to defaults (all collections) if no matches are found
|
106
|
-
if matrix[:collection].empty?
|
107
|
-
matrix[:collection] = COLLECTION_TABLE.values
|
108
|
-
end
|
104
|
+
matrix[:collection] = COLLECTION_TABLE.values if matrix[:collection].empty?
|
109
105
|
|
110
106
|
# Just to make sure there aren't any duplicates
|
111
107
|
matrix[:platform] = matrix[:platform].uniq.sort
|
data/exe/matrix_from_metadata_v2
CHANGED
@@ -32,7 +32,7 @@ IMAGE_TABLE = {
|
|
32
32
|
'SLES-15' => 'sles-15',
|
33
33
|
'Windows-2016' => 'windows-2016',
|
34
34
|
'Windows-2019' => 'windows-2019',
|
35
|
-
'Windows-2022' => 'windows-2022'
|
35
|
+
'Windows-2022' => 'windows-2022'
|
36
36
|
}.freeze
|
37
37
|
|
38
38
|
DOCKER_PLATFORMS = {
|
@@ -53,44 +53,40 @@ DOCKER_PLATFORMS = {
|
|
53
53
|
# 'Ubuntu-16.04' => 'litmusimage/ubuntu:16.04', Support Dropped
|
54
54
|
'Ubuntu-18.04' => 'litmusimage/ubuntu:18.04',
|
55
55
|
'Ubuntu-20.04' => 'litmusimage/ubuntu:20.04',
|
56
|
-
'Ubuntu-22.04' => 'litmusimage/ubuntu:22.04'
|
56
|
+
'Ubuntu-22.04' => 'litmusimage/ubuntu:22.04'
|
57
57
|
}.freeze
|
58
58
|
|
59
59
|
# This table uses the latest version in each collection for accurate
|
60
60
|
# comparison when evaluating puppet requirements from the metadata
|
61
61
|
COLLECTION_TABLE = [
|
62
|
-
{
|
63
|
-
puppet_maj_version: 6,
|
64
|
-
ruby_version: 2.5,
|
65
|
-
},
|
66
62
|
{
|
67
63
|
puppet_maj_version: 7,
|
68
|
-
ruby_version: 2.7
|
64
|
+
ruby_version: 2.7
|
69
65
|
},
|
70
66
|
{
|
71
67
|
puppet_maj_version: 8,
|
72
|
-
ruby_version: 3.2
|
73
|
-
}
|
68
|
+
ruby_version: 3.2
|
69
|
+
}
|
74
70
|
].freeze
|
75
71
|
|
76
72
|
matrix = {
|
77
73
|
platforms: [],
|
78
|
-
collection: []
|
74
|
+
collection: []
|
79
75
|
}
|
80
76
|
|
81
77
|
spec_matrix = {
|
82
|
-
include: []
|
78
|
+
include: []
|
83
79
|
}
|
84
80
|
|
85
81
|
if ARGV.include?('--exclude-platforms')
|
86
|
-
exclude_platforms_occurencies = ARGV.
|
82
|
+
exclude_platforms_occurencies = ARGV.count { |arg| arg == '--exclude-platforms' }
|
87
83
|
raise '--exclude-platforms argument should be present just one time in the command' unless exclude_platforms_occurencies <= 1
|
88
84
|
|
89
85
|
exclude_platforms_list = ARGV[ARGV.find_index('--exclude-platforms') + 1]
|
90
86
|
raise 'you need to provide a list of platforms in JSON format' if exclude_platforms_list.nil?
|
91
87
|
|
92
88
|
begin
|
93
|
-
exclude_list = JSON.parse(exclude_platforms_list).map
|
89
|
+
exclude_list = JSON.parse(exclude_platforms_list).map(&:downcase)
|
94
90
|
rescue JSON::ParserError
|
95
91
|
raise 'the exclude platforms list must valid JSON'
|
96
92
|
end
|
@@ -103,20 +99,20 @@ metadata = JSON.parse(File.read(metadata_path))
|
|
103
99
|
# Set platforms based on declared operating system support
|
104
100
|
metadata['operatingsystem_support'].sort_by { |a| a['operatingsystem'] }.each do |sup|
|
105
101
|
os = sup['operatingsystem']
|
106
|
-
sup['operatingsystemrelease'].sort_by
|
102
|
+
sup['operatingsystemrelease'].sort_by(&:to_i).each do |ver|
|
107
103
|
image_key = "#{os}-#{ver}"
|
108
104
|
|
109
105
|
if IMAGE_TABLE.key?(image_key) && !exclude_list.include?(image_key.downcase)
|
110
106
|
matrix[:platforms] << {
|
111
107
|
label: image_key,
|
112
108
|
provider: 'provision::provision_service',
|
113
|
-
image: IMAGE_TABLE[image_key]
|
109
|
+
image: IMAGE_TABLE[image_key]
|
114
110
|
}
|
115
111
|
elsif DOCKER_PLATFORMS.key?(image_key) && !exclude_list.include?(image_key.downcase)
|
116
112
|
matrix[:platforms] << {
|
117
113
|
label: image_key,
|
118
114
|
provider: 'provision::docker',
|
119
|
-
image: DOCKER_PLATFORMS[image_key]
|
115
|
+
image: DOCKER_PLATFORMS[image_key]
|
120
116
|
}
|
121
117
|
else
|
122
118
|
puts "::warning::#{image_key} was excluded from testing" if exclude_list.include?(image_key.downcase)
|
@@ -130,7 +126,7 @@ if metadata.key?('requirements') && metadata['requirements'].length.positive?
|
|
130
126
|
metadata['requirements'].each do |req|
|
131
127
|
next unless req.key?('name') && req.key?('version_requirement') && req['name'] == 'puppet'
|
132
128
|
|
133
|
-
ver_regexp =
|
129
|
+
ver_regexp = /^([>=<]{1,2})\s*([\d.]+)\s+([>=<]{1,2})\s*([\d.]+)$/
|
134
130
|
match = ver_regexp.match(req['version_requirement'])
|
135
131
|
if match.nil?
|
136
132
|
puts "::warning::Didn't recognize version_requirement '#{req['version_requirement']}'"
|
@@ -156,12 +152,10 @@ if metadata.key?('requirements') && metadata['requirements'].length.positive?
|
|
156
152
|
end
|
157
153
|
|
158
154
|
# Set to defaults (all collections) if no matches are found
|
159
|
-
if matrix[:collection].empty?
|
160
|
-
matrix[:collection] = COLLECTION_TABLE.map { |collection| "puppet#{collection[:puppet_maj_version]}-nightly" }
|
161
|
-
end
|
155
|
+
matrix[:collection] = COLLECTION_TABLE.map { |collection| "puppet#{collection[:puppet_maj_version]}-nightly" } if matrix[:collection].empty?
|
162
156
|
|
163
157
|
# Just to make sure there aren't any duplicates
|
164
|
-
matrix[:platforms] = matrix[:platforms].uniq.
|
158
|
+
matrix[:platforms] = matrix[:platforms].uniq.sort_by { |a| a[:label] }
|
165
159
|
matrix[:collection] = matrix[:collection].uniq.sort
|
166
160
|
|
167
161
|
set_output('matrix', JSON.generate(matrix))
|
@@ -32,11 +32,11 @@ module PuppetLitmus::InventoryManipulation
|
|
32
32
|
{
|
33
33
|
'uri' => 'litmus_localhost',
|
34
34
|
'config' => { 'transport' => 'local' },
|
35
|
-
'feature' => 'puppet-agent'
|
36
|
-
}
|
37
|
-
]
|
38
|
-
}
|
39
|
-
]
|
35
|
+
'feature' => 'puppet-agent'
|
36
|
+
}
|
37
|
+
]
|
38
|
+
}
|
39
|
+
]
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
@@ -47,7 +47,7 @@ module PuppetLitmus::InventoryManipulation
|
|
47
47
|
# @return [Array] array of targets.
|
48
48
|
def find_targets(inventory_hash, targets)
|
49
49
|
if targets.nil?
|
50
|
-
inventory_hash.to_s.scan(
|
50
|
+
inventory_hash.to_s.scan(/uri"=>"(\S*)"/).flatten
|
51
51
|
else
|
52
52
|
[targets]
|
53
53
|
end
|
@@ -62,7 +62,7 @@ module PuppetLitmus::InventoryManipulation
|
|
62
62
|
def groups_in_inventory(inventory_hash, &block)
|
63
63
|
inventory_hash['groups'].flat_map do |group|
|
64
64
|
output_collector = []
|
65
|
-
output_collector << if
|
65
|
+
output_collector << if block
|
66
66
|
yield group
|
67
67
|
else
|
68
68
|
group['name'].downcase
|
@@ -104,7 +104,7 @@ module PuppetLitmus::InventoryManipulation
|
|
104
104
|
targets_in_inventory(inventory) do |target|
|
105
105
|
vars = target['vars']
|
106
106
|
roles = [(vars['role'] || vars['roles'])].flatten
|
107
|
-
roles = roles.map
|
107
|
+
roles = roles.map(&:downcase)
|
108
108
|
output_collector << target['uri'] if roles.include? role.downcase
|
109
109
|
end
|
110
110
|
output_collector unless output_collector.empty?
|
@@ -166,7 +166,7 @@ module PuppetLitmus::InventoryManipulation
|
|
166
166
|
# @return [Hash] config for node of name node_name
|
167
167
|
def config_from_node(inventory_hash, node_name)
|
168
168
|
config = targets_in_inventory(inventory_hash) do |target|
|
169
|
-
next unless target['uri'].
|
169
|
+
next unless target['uri'].casecmp(node_name).zero?
|
170
170
|
|
171
171
|
return target['config'] unless target['config'].nil?
|
172
172
|
end
|
@@ -181,7 +181,7 @@ module PuppetLitmus::InventoryManipulation
|
|
181
181
|
# @return [Hash] facts for node of name node_name
|
182
182
|
def facts_from_node(inventory_hash, node_name)
|
183
183
|
facts = targets_in_inventory(inventory_hash) do |target|
|
184
|
-
next unless target['uri'].
|
184
|
+
next unless target['uri'].casecmp(node_name).zero?
|
185
185
|
|
186
186
|
target['facts'] unless target['facts'].nil?
|
187
187
|
end
|
@@ -196,7 +196,7 @@ module PuppetLitmus::InventoryManipulation
|
|
196
196
|
# @return [Hash] vars for node of name node_name
|
197
197
|
def vars_from_node(inventory_hash, node_name)
|
198
198
|
vars = targets_in_inventory(inventory_hash) do |target|
|
199
|
-
next unless target['uri'].
|
199
|
+
next unless target['uri'].casecmp(node_name).zero?
|
200
200
|
|
201
201
|
target['vars'] unless target['vars'].nil?
|
202
202
|
end
|
@@ -213,9 +213,7 @@ module PuppetLitmus::InventoryManipulation
|
|
213
213
|
# check if group exists
|
214
214
|
if inventory_hash['groups'].any? { |g| g['name'] == group_name }
|
215
215
|
inventory_hash['groups'].each do |group|
|
216
|
-
if group['name'] == group_name
|
217
|
-
group['targets'].push node
|
218
|
-
end
|
216
|
+
group['targets'].push node if group['name'] == group_name
|
219
217
|
end
|
220
218
|
else
|
221
219
|
# add new group
|
@@ -248,9 +246,7 @@ module PuppetLitmus::InventoryManipulation
|
|
248
246
|
i = 0
|
249
247
|
inventory_hash['groups'].each do |group|
|
250
248
|
if group['name'] == group_name
|
251
|
-
if group['features'].nil? == true
|
252
|
-
group = group.merge('features' => [])
|
253
|
-
end
|
249
|
+
group = group.merge('features' => []) if group['features'].nil? == true
|
254
250
|
group['features'].push feature_name unless group['features'].include?(feature_name)
|
255
251
|
inventory_hash['groups'][i] = group
|
256
252
|
end
|
@@ -268,9 +264,7 @@ module PuppetLitmus::InventoryManipulation
|
|
268
264
|
# @return [Hash] inventory_hash with feature added to group if group_name exists in inventory hash.
|
269
265
|
def remove_feature_from_group(inventory_hash, feature_name, group_name)
|
270
266
|
inventory_hash['groups'].each do |group|
|
271
|
-
if group['name'] == group_name && group['features'].nil? != true
|
272
|
-
group['features'].delete(feature_name)
|
273
|
-
end
|
267
|
+
group['features'].delete(feature_name) if group['name'] == group_name && group['features'].nil? != true
|
274
268
|
end
|
275
269
|
inventory_hash
|
276
270
|
end
|
@@ -288,9 +282,7 @@ module PuppetLitmus::InventoryManipulation
|
|
288
282
|
node_index = 0
|
289
283
|
group['targets'].each do |node|
|
290
284
|
if node['uri'] == node_name
|
291
|
-
if node['features'].nil? == true
|
292
|
-
node = node.merge('features' => [])
|
293
|
-
end
|
285
|
+
node = node.merge('features' => []) if node['features'].nil? == true
|
294
286
|
node['features'].push feature_name unless node['features'].include?(feature_name)
|
295
287
|
inventory_hash['groups'][group_index]['targets'][node_index] = node
|
296
288
|
end
|
@@ -311,9 +303,7 @@ module PuppetLitmus::InventoryManipulation
|
|
311
303
|
def remove_feature_from_node(inventory_hash, feature_name, node_name)
|
312
304
|
inventory_hash['groups'].each do |group|
|
313
305
|
group['targets'].each do |node|
|
314
|
-
if node['uri'] == node_name && node['features'].nil? != true
|
315
|
-
node['features'].delete(feature_name)
|
316
|
-
end
|
306
|
+
node['features'].delete(feature_name) if node['uri'] == node_name && node['features'].nil? != true
|
317
307
|
end
|
318
308
|
end
|
319
309
|
inventory_hash
|
@@ -54,7 +54,7 @@ module PuppetLitmus::PuppetHelpers
|
|
54
54
|
span.add_field('litmus.manifest', manifest)
|
55
55
|
span.add_field('litmus.opts', opts)
|
56
56
|
|
57
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV
|
57
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
58
58
|
raise 'manifest and manifest_file_location in the opts hash are mutually exclusive arguments, pick one' if !manifest.nil? && !opts[:manifest_file_location].nil?
|
59
59
|
raise 'please pass a manifest or the manifest_file_location in the opts hash' if (manifest.nil? || manifest == '') && opts[:manifest_file_location].nil?
|
60
60
|
raise 'please specify only one of `catch_changes`, `expect_changes`, `catch_failures` or `expect_failures`' if
|
@@ -92,10 +92,10 @@ module PuppetLitmus::PuppetHelpers
|
|
92
92
|
add_node_fields_to_span(span, target_node_name, inventory_hash)
|
93
93
|
|
94
94
|
# Forcibly set the locale of the command
|
95
|
-
locale = if os[:family]
|
96
|
-
'LC_ALL=en_US.UTF-8 '
|
97
|
-
else
|
95
|
+
locale = if os[:family] == 'windows'
|
98
96
|
''
|
97
|
+
else
|
98
|
+
'LC_ALL=en_US.UTF-8 '
|
99
99
|
end
|
100
100
|
command_to_run = "#{locale}#{opts[:prefix_command]} puppet apply #{manifest_file_location}"
|
101
101
|
command_to_run += ' --trace' if !opts[:trace].nil? && (opts[:trace] == true)
|
@@ -154,7 +154,7 @@ module PuppetLitmus::PuppetHelpers
|
|
154
154
|
span.add_field('litmus.manifest', manifest)
|
155
155
|
|
156
156
|
require 'tmpdir'
|
157
|
-
target_node_name = ENV
|
157
|
+
target_node_name = ENV.fetch('TARGET_HOST', nil)
|
158
158
|
tmp_filename = File.join(Dir.tmpdir, "manifest_#{Time.now.strftime('%Y%m%d')}_#{Process.pid}_#{rand(0x100000000).to_s(36)}.pp")
|
159
159
|
manifest_file = File.open(tmp_filename, 'w')
|
160
160
|
manifest_file.write(manifest)
|
@@ -193,7 +193,7 @@ module PuppetLitmus::PuppetHelpers
|
|
193
193
|
|
194
194
|
require 'tmpdir'
|
195
195
|
inventory_hash = inventory_hash_from_inventory_file
|
196
|
-
target_node_name = ENV
|
196
|
+
target_node_name = ENV.fetch('TARGET_HOST', nil)
|
197
197
|
target_option = opts['targets'] || opts[:targets]
|
198
198
|
target_node_name = search_for_target(target_option, inventory_hash) unless target_option.nil?
|
199
199
|
|
@@ -234,7 +234,7 @@ module PuppetLitmus::PuppetHelpers
|
|
234
234
|
|
235
235
|
target_option = opts['targets'] || opts[:targets]
|
236
236
|
if target_option.nil?
|
237
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV
|
237
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
238
238
|
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
239
239
|
else
|
240
240
|
target_node_name = search_for_target(target_option, inventory_hash)
|
@@ -245,9 +245,7 @@ module PuppetLitmus::PuppetHelpers
|
|
245
245
|
bolt_result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
246
246
|
span.add_field('litmus.bolt_result', bolt_result)
|
247
247
|
|
248
|
-
if bolt_result.first['value']['exit_code'] != 0 && opts[:expect_failures] != true
|
249
|
-
raise "shell failed\n`#{command_to_run}`\n======\n#{bolt_result}"
|
250
|
-
end
|
248
|
+
raise "shell failed\n`#{command_to_run}`\n======\n#{bolt_result}" if bolt_result.first['value']['exit_code'] != 0 && opts[:expect_failures] != true
|
251
249
|
|
252
250
|
result = OpenStruct.new(exit_code: bolt_result.first['value']['exit_code'],
|
253
251
|
exit_status: bolt_result.first['value']['exit_code'],
|
@@ -277,7 +275,7 @@ module PuppetLitmus::PuppetHelpers
|
|
277
275
|
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
278
276
|
target_option = opts['targets'] || opts[:targets]
|
279
277
|
if target_option.nil?
|
280
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV
|
278
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
281
279
|
raise "Target '#{target_node_name}' not found in spec/fixtures/litmus_inventory.yaml" unless target_in_inventory?(inventory_hash, target_node_name)
|
282
280
|
else
|
283
281
|
target_node_name = search_for_target(target_option, inventory_hash)
|
@@ -292,7 +290,7 @@ module PuppetLitmus::PuppetHelpers
|
|
292
290
|
exit_code: 0,
|
293
291
|
stdout: bolt_result.first['value']['_output'],
|
294
292
|
stderr: nil,
|
295
|
-
result: bolt_result.first['value']
|
293
|
+
result: bolt_result.first['value']
|
296
294
|
}
|
297
295
|
|
298
296
|
if bolt_result.first['status'] != 'success'
|
@@ -330,7 +328,7 @@ module PuppetLitmus::PuppetHelpers
|
|
330
328
|
span.add_field('litmus.opts', opts)
|
331
329
|
|
332
330
|
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
333
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV
|
331
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
334
332
|
inventory_hash = if !opts[:inventory_file].nil? && File.exist?(opts[:inventory_file])
|
335
333
|
inventory_hash_from_inventory_file(opts[:inventory_file])
|
336
334
|
elsif File.exist?('spec/fixtures/litmus_inventory.yaml')
|
@@ -353,7 +351,7 @@ module PuppetLitmus::PuppetHelpers
|
|
353
351
|
exit_code: 0,
|
354
352
|
stdout: nil,
|
355
353
|
stderr: nil,
|
356
|
-
result: bolt_result.first['value']
|
354
|
+
result: bolt_result.first['value']
|
357
355
|
}
|
358
356
|
|
359
357
|
if bolt_result.first['status'] == 'success'
|
@@ -402,7 +400,7 @@ module PuppetLitmus::PuppetHelpers
|
|
402
400
|
span.add_field('litmus.opts', opts)
|
403
401
|
span.add_field('litmus.arguments', arguments)
|
404
402
|
|
405
|
-
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV
|
403
|
+
target_node_name = targeting_localhost? ? 'litmus_localhost' : ENV.fetch('TARGET_HOST', nil)
|
406
404
|
inventory_hash = File.exist?('spec/fixtures/litmus_inventory.yaml') ? inventory_hash_from_inventory_file : localhost_inventory_hash
|
407
405
|
target_option = opts['targets'] || opts[:targets]
|
408
406
|
if target_option.nil?
|
@@ -5,11 +5,9 @@ require 'honeycomb-beeline'
|
|
5
5
|
require 'puppet_litmus/version'
|
6
6
|
Honeycomb.configure do |config|
|
7
7
|
# override client if no configuration is provided, so that the pesky libhoney warning about lack of configuration is not shown
|
8
|
-
unless ENV['HONEYCOMB_WRITEKEY'] && ENV['HONEYCOMB_DATASET']
|
9
|
-
config.client = Libhoney::NullClient.new
|
10
|
-
end
|
8
|
+
config.client = Libhoney::NullClient.new unless ENV['HONEYCOMB_WRITEKEY'] && ENV['HONEYCOMB_DATASET']
|
11
9
|
end
|
12
|
-
process_span = Honeycomb.start_span(name: "litmus: #{([$PROGRAM_NAME] + ($ARGV || [])).join(' ')}", serialized_trace: ENV
|
10
|
+
process_span = Honeycomb.start_span(name: "litmus: #{([$PROGRAM_NAME] + ($ARGV || [])).join(' ')}", serialized_trace: ENV.fetch('HONEYCOMB_TRACE', nil))
|
13
11
|
ENV['HONEYCOMB_TRACE'] = process_span.to_trace_header
|
14
12
|
Honeycomb.add_field_to_trace('litmus.pid', Process.pid)
|
15
13
|
if defined? PuppetLitmus::VERSION
|
@@ -18,27 +16,27 @@ else
|
|
18
16
|
Honeycomb.add_field_to_trace('litmus.version', 'undefined')
|
19
17
|
end
|
20
18
|
if ENV['CI'] == 'true' && ENV['TRAVIS'] == 'true'
|
21
|
-
Honeycomb.add_field_to_trace('module_name', ENV
|
19
|
+
Honeycomb.add_field_to_trace('module_name', ENV.fetch('TRAVIS_REPO_SLUG', nil))
|
22
20
|
Honeycomb.add_field_to_trace('ci.provider', 'travis')
|
23
|
-
Honeycomb.add_field_to_trace('ci.build_id', ENV
|
24
|
-
Honeycomb.add_field_to_trace('ci.build_url', ENV
|
25
|
-
Honeycomb.add_field_to_trace('ci.job_url', ENV
|
26
|
-
Honeycomb.add_field_to_trace('ci.commit_message', ENV
|
27
|
-
Honeycomb.add_field_to_trace('ci.sha', ENV['TRAVIS_PULL_REQUEST_SHA'] || ENV
|
21
|
+
Honeycomb.add_field_to_trace('ci.build_id', ENV.fetch('TRAVIS_BUILD_ID', nil))
|
22
|
+
Honeycomb.add_field_to_trace('ci.build_url', ENV.fetch('TRAVIS_BUILD_WEB_URL', nil))
|
23
|
+
Honeycomb.add_field_to_trace('ci.job_url', ENV.fetch('TRAVIS_JOB_WEB_URL', nil))
|
24
|
+
Honeycomb.add_field_to_trace('ci.commit_message', ENV.fetch('TRAVIS_COMMIT_MESSAGE', nil))
|
25
|
+
Honeycomb.add_field_to_trace('ci.sha', ENV['TRAVIS_PULL_REQUEST_SHA'] || ENV.fetch('TRAVIS_COMMIT', nil))
|
28
26
|
elsif ENV['CI'] == 'True' && ENV['APPVEYOR'] == 'True'
|
29
|
-
Honeycomb.add_field_to_trace('module_name', ENV
|
27
|
+
Honeycomb.add_field_to_trace('module_name', ENV.fetch('APPVEYOR_PROJECT_SLUG', nil))
|
30
28
|
Honeycomb.add_field_to_trace('ci.provider', 'appveyor')
|
31
|
-
Honeycomb.add_field_to_trace('ci.build_id', ENV
|
32
|
-
Honeycomb.add_field_to_trace('ci.build_url', "https://ci.appveyor.com/project/#{ENV
|
33
|
-
Honeycomb.add_field_to_trace('ci.job_url', "https://ci.appveyor.com/project/#{ENV
|
34
|
-
Honeycomb.add_field_to_trace('ci.commit_message', ENV
|
35
|
-
Honeycomb.add_field_to_trace('ci.sha', ENV['APPVEYOR_PULL_REQUEST_HEAD_COMMIT'] || ENV
|
29
|
+
Honeycomb.add_field_to_trace('ci.build_id', ENV.fetch('APPVEYOR_BUILD_ID', nil))
|
30
|
+
Honeycomb.add_field_to_trace('ci.build_url', "https://ci.appveyor.com/project/#{ENV.fetch('APPVEYOR_REPO_NAME', nil)}/builds/#{ENV.fetch('APPVEYOR_BUILD_ID', nil)}")
|
31
|
+
Honeycomb.add_field_to_trace('ci.job_url', "https://ci.appveyor.com/project/#{ENV.fetch('APPVEYOR_REPO_NAME', nil)}/build/job/#{ENV.fetch('APPVEYOR_JOB_ID', nil)}")
|
32
|
+
Honeycomb.add_field_to_trace('ci.commit_message', ENV.fetch('APPVEYOR_REPO_COMMIT_MESSAGE', nil))
|
33
|
+
Honeycomb.add_field_to_trace('ci.sha', ENV['APPVEYOR_PULL_REQUEST_HEAD_COMMIT'] || ENV.fetch('APPVEYOR_REPO_COMMIT', nil))
|
36
34
|
elsif ENV['GITHUB_ACTIONS'] == 'true'
|
37
|
-
Honeycomb.add_field_to_trace('module_name', ENV
|
35
|
+
Honeycomb.add_field_to_trace('module_name', ENV.fetch('GITHUB_REPOSITORY', nil))
|
38
36
|
Honeycomb.add_field_to_trace('ci.provider', 'github')
|
39
|
-
Honeycomb.add_field_to_trace('ci.build_id', ENV
|
40
|
-
Honeycomb.add_field_to_trace('ci.build_url', "https://github.com/#{ENV
|
41
|
-
Honeycomb.add_field_to_trace('ci.sha', ENV
|
37
|
+
Honeycomb.add_field_to_trace('ci.build_id', ENV.fetch('GITHUB_RUN_ID', nil))
|
38
|
+
Honeycomb.add_field_to_trace('ci.build_url', "https://github.com/#{ENV.fetch('GITHUB_REPOSITORY', nil)}/actions/runs/#{ENV.fetch('GITHUB_RUN_ID', nil)}")
|
39
|
+
Honeycomb.add_field_to_trace('ci.sha', ENV.fetch('GITHUB_SHA', nil))
|
42
40
|
end
|
43
41
|
at_exit do
|
44
42
|
if $ERROR_INFO.is_a?(SystemExit)
|
@@ -54,8 +52,8 @@ end
|
|
54
52
|
# helper methods for the litmus rake tasks
|
55
53
|
module PuppetLitmus::RakeHelper
|
56
54
|
# DEFAULT_CONFIG_DATA should be frozen for our safety, but it needs to work around https://github.com/puppetlabs/bolt/pull/1696
|
57
|
-
DEFAULT_CONFIG_DATA
|
58
|
-
SUPPORTED_PROVISIONERS
|
55
|
+
DEFAULT_CONFIG_DATA = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') } # .freeze # rubocop:disable Style/MutableConstant
|
56
|
+
SUPPORTED_PROVISIONERS = %w[abs docker docker_exp provision_service vagrant vmpooler].freeze
|
59
57
|
|
60
58
|
# Gets a string representing the operating system and version.
|
61
59
|
#
|
@@ -318,7 +316,7 @@ module PuppetLitmus::RakeHelper
|
|
318
316
|
|
319
317
|
module_repository_opts = "--module_repository '#{module_repository}'" unless module_repository.nil?
|
320
318
|
install_module_command = "puppet module install #{module_repository_opts} #{File.basename(module_tar)}"
|
321
|
-
install_module_command += ' --ignore-dependencies --force' if ignore_dependencies.to_s.
|
319
|
+
install_module_command += ' --ignore-dependencies --force' if ignore_dependencies.to_s.casecmp('true').zero?
|
322
320
|
span.add_field('litmus.install_module_command', install_module_command)
|
323
321
|
|
324
322
|
bolt_result = run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash.clone)
|
@@ -428,7 +426,7 @@ module PuppetLitmus::RakeHelper
|
|
428
426
|
end
|
429
427
|
|
430
428
|
def start_spinner(message)
|
431
|
-
if (ENV['CI'] || '').
|
429
|
+
if (ENV['CI'] || '').casecmp('true').zero?
|
432
430
|
puts message
|
433
431
|
spinner = Thread.new do
|
434
432
|
# CI systems are strange beasts, we only output a '.' every wee while to keep the terminal alive.
|
@@ -446,7 +444,7 @@ module PuppetLitmus::RakeHelper
|
|
446
444
|
end
|
447
445
|
|
448
446
|
def stop_spinner(spinner)
|
449
|
-
if (ENV['CI'] || '').
|
447
|
+
if (ENV['CI'] || '').casecmp('true').zero?
|
450
448
|
Thread.kill(spinner)
|
451
449
|
else
|
452
450
|
spinner.success
|
@@ -42,10 +42,10 @@ namespace :litmus do
|
|
42
42
|
stop_spinner(spinner)
|
43
43
|
end
|
44
44
|
|
45
|
-
if result.first['status']
|
46
|
-
failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
|
47
|
-
else
|
45
|
+
if result.first['status'] == 'success'
|
48
46
|
$stdout.puts 'Success'
|
47
|
+
else
|
48
|
+
failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
|
49
49
|
end
|
50
50
|
else
|
51
51
|
provision_hash[args[:key]]['images'].each do |image|
|
@@ -56,10 +56,10 @@ namespace :litmus do
|
|
56
56
|
stop_spinner(spinner)
|
57
57
|
end
|
58
58
|
|
59
|
-
if result.first['status']
|
60
|
-
failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
|
61
|
-
else
|
59
|
+
if result.first['status'] == 'success'
|
62
60
|
$stdout.puts "#{result.first['value']['node_name']}, #{image}"
|
61
|
+
else
|
62
|
+
failed_image_message += "=====\n#{result.first['target']}\n#{result.first['value']['_output']}\n#{result.inspect}"
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -80,9 +80,7 @@ namespace :litmus do
|
|
80
80
|
|
81
81
|
results = provision(args[:provisioner], args[:platform], args[:inventory_vars])
|
82
82
|
|
83
|
-
unless results.first['status'] == 'success'
|
84
|
-
raise "Failed provisioning #{args[:platform]} using #{args[:provisioner]}\n#{results.first}"
|
85
|
-
end
|
83
|
+
raise "Failed provisioning #{args[:platform]} using #{args[:provisioner]}\n#{results.first}" unless results.first['status'] == 'success'
|
86
84
|
|
87
85
|
puts "Successfully provisioned #{args[:platform]} using #{args[:provisioner]}\n"
|
88
86
|
|
@@ -320,10 +318,10 @@ namespace :litmus do
|
|
320
318
|
bad_results = []
|
321
319
|
results = tear_down_nodes(targets, inventory_hash)
|
322
320
|
results.each do |node, result|
|
323
|
-
if result.first['status']
|
324
|
-
bad_results << "#{node}, #{result.first['value']['_error']['msg']}"
|
325
|
-
else
|
321
|
+
if result.first['status'] == 'success'
|
326
322
|
puts "#{node}: #{result.first['status']}"
|
323
|
+
else
|
324
|
+
bad_results << "#{node}, #{result.first['value']['_error']['msg']}"
|
327
325
|
end
|
328
326
|
end
|
329
327
|
puts ''
|
@@ -361,8 +359,8 @@ namespace :litmus do
|
|
361
359
|
title = "#{target}, #{facts_from_node(inventory_hash, target)['platform']}"
|
362
360
|
options = {
|
363
361
|
env: {
|
364
|
-
'TARGET_HOST' => target
|
365
|
-
}
|
362
|
+
'TARGET_HOST' => target
|
363
|
+
}
|
366
364
|
}
|
367
365
|
payloads << [title, test, options]
|
368
366
|
end
|
@@ -395,9 +393,9 @@ namespace :litmus do
|
|
395
393
|
# because we cannot modify variables inside of Parallel
|
396
394
|
results.each do |result|
|
397
395
|
if result.last.to_i.zero?
|
398
|
-
success_list.push(result.first.scan(
|
396
|
+
success_list.push(result.first.scan(/.*/)[3])
|
399
397
|
else
|
400
|
-
failure_list.push(result.first.scan(
|
398
|
+
failure_list.push(result.first.scan(/.*/)[3])
|
401
399
|
end
|
402
400
|
end
|
403
401
|
Thread.kill(progress)
|
@@ -22,13 +22,13 @@ module PuppetLitmus
|
|
22
22
|
else
|
23
23
|
# load inventory
|
24
24
|
inventory_hash = inventory_hash_from_inventory_file
|
25
|
-
node_config = config_from_node(inventory_hash, ENV
|
25
|
+
node_config = config_from_node(inventory_hash, ENV.fetch('TARGET_HOST', nil))
|
26
26
|
|
27
|
-
if target_in_group(inventory_hash, ENV
|
28
|
-
host = ENV
|
27
|
+
if target_in_group(inventory_hash, ENV.fetch('TARGET_HOST', nil), 'docker_nodes')
|
28
|
+
host = ENV.fetch('TARGET_HOST', nil)
|
29
29
|
set :backend, :docker
|
30
30
|
set :docker_container, host
|
31
|
-
elsif target_in_group(inventory_hash, ENV
|
31
|
+
elsif target_in_group(inventory_hash, ENV.fetch('TARGET_HOST', nil), 'ssh_nodes')
|
32
32
|
set :backend, :ssh
|
33
33
|
options = Net::SSH::Config.for(host)
|
34
34
|
options[:user] = node_config.dig('ssh', 'user') unless node_config.dig('ssh', 'user').nil?
|
@@ -70,14 +70,14 @@ module PuppetLitmus
|
|
70
70
|
set :request_pty, false
|
71
71
|
set :sudo_password, options[:password] if run_as
|
72
72
|
puts "Running tests as #{run_as}" if run_as
|
73
|
-
elsif target_in_group(inventory_hash, ENV
|
73
|
+
elsif target_in_group(inventory_hash, ENV.fetch('TARGET_HOST', nil), 'winrm_nodes')
|
74
74
|
require 'winrm'
|
75
75
|
|
76
76
|
set :backend, :winrm
|
77
77
|
set :os, family: 'windows'
|
78
78
|
user = node_config.dig('winrm', 'user') unless node_config.dig('winrm', 'user').nil?
|
79
79
|
pass = node_config.dig('winrm', 'password') unless node_config.dig('winrm', 'password').nil?
|
80
|
-
endpoint = URI("http://#{ENV
|
80
|
+
endpoint = URI("http://#{ENV.fetch('TARGET_HOST', nil)}")
|
81
81
|
endpoint.port = 5985 if endpoint.port == 80
|
82
82
|
endpoint.path = '/wsman'
|
83
83
|
|
@@ -85,7 +85,7 @@ module PuppetLitmus
|
|
85
85
|
user: user,
|
86
86
|
password: pass,
|
87
87
|
endpoint: endpoint,
|
88
|
-
operation_timeout: 300
|
88
|
+
operation_timeout: 300
|
89
89
|
}
|
90
90
|
|
91
91
|
winrm = WinRM::Connection.new opts
|
@@ -8,7 +8,7 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
8
8
|
let(:github_output_content) { github_output.read }
|
9
9
|
let(:result) { run_matrix_from_metadata_v2 }
|
10
10
|
|
11
|
-
before
|
11
|
+
before do
|
12
12
|
ENV['GITHUB_OUTPUT'] = github_output.path
|
13
13
|
end
|
14
14
|
|
@@ -29,11 +29,11 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
29
29
|
'"collection":[',
|
30
30
|
'"puppet7-nightly","puppet8-nightly"',
|
31
31
|
']',
|
32
|
-
'}'
|
33
|
-
].join
|
32
|
+
'}'
|
33
|
+
].join
|
34
34
|
)
|
35
35
|
expect(github_output_content).to include(
|
36
|
-
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"
|
36
|
+
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"https://github.com/puppetlabs/puppet","ruby_version":3.2}]}'
|
37
37
|
)
|
38
38
|
expect(result.stdout).to include("Created matrix with 8 cells:\n - Acceptance Test Cells: 6\n - Spec Test Cells: 2")
|
39
39
|
end
|
@@ -44,7 +44,7 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
44
44
|
let(:github_output_content) { github_output.read }
|
45
45
|
let(:result) { run_matrix_from_metadata_v2({ '--exclude-platforms' => ['ubuntu-18.04'] }) }
|
46
46
|
|
47
|
-
before
|
47
|
+
before do
|
48
48
|
ENV['GITHUB_OUTPUT'] = github_output.path
|
49
49
|
end
|
50
50
|
|
@@ -65,11 +65,11 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
65
65
|
'"collection":[',
|
66
66
|
'"puppet7-nightly","puppet8-nightly"',
|
67
67
|
']',
|
68
|
-
'}'
|
69
|
-
].join
|
68
|
+
'}'
|
69
|
+
].join
|
70
70
|
)
|
71
71
|
expect(github_output_content).to include(
|
72
|
-
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"
|
72
|
+
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"https://github.com/puppetlabs/puppet","ruby_version":3.2}]}'
|
73
73
|
)
|
74
74
|
expect(result.stdout).to include("Created matrix with 6 cells:\n - Acceptance Test Cells: 4\n - Spec Test Cells: 2")
|
75
75
|
end
|
@@ -80,7 +80,7 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
80
80
|
let(:github_output_content) { github_output.read }
|
81
81
|
let(:result) { run_matrix_from_metadata_v2({ '--exclude-platforms' => ['ubuntu-18.04', 'redhat-8'] }) }
|
82
82
|
|
83
|
-
before
|
83
|
+
before do
|
84
84
|
ENV['GITHUB_OUTPUT'] = github_output.path
|
85
85
|
end
|
86
86
|
|
@@ -101,11 +101,11 @@ RSpec.describe 'matrix_from_metadata_v2' do
|
|
101
101
|
'"collection":[',
|
102
102
|
'"puppet7-nightly","puppet8-nightly"',
|
103
103
|
']',
|
104
|
-
'}'
|
105
|
-
].join
|
104
|
+
'}'
|
105
|
+
].join
|
106
106
|
)
|
107
107
|
expect(github_output_content).to include(
|
108
|
-
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"
|
108
|
+
'spec_matrix={"include":[{"puppet_version":"~> 7.0","ruby_version":2.7},{"puppet_version":"https://github.com/puppetlabs/puppet","ruby_version":3.2}]}'
|
109
109
|
)
|
110
110
|
expect(result.stdout).to include("Created matrix with 4 cells:\n - Acceptance Test Cells: 2\n - Spec Test Cells: 2")
|
111
111
|
end
|
@@ -8,11 +8,11 @@ RSpec.describe PuppetLitmus::InventoryManipulation do
|
|
8
8
|
|
9
9
|
context 'with config_from_node' do
|
10
10
|
it 'no matching node, returns nil' do
|
11
|
-
expect(config_from_node(config_hash, 'not.here')).to
|
11
|
+
expect(config_from_node(config_hash, 'not.here')).to be_nil
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'no config section, returns nil' do
|
15
|
-
expect(config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to
|
15
|
+
expect(config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to be_nil
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'config exists, and returns' do
|
@@ -82,9 +82,7 @@ RSpec.describe PuppetLitmus::InventoryManipulation do
|
|
82
82
|
|
83
83
|
it 'applies a code block to groups' do
|
84
84
|
counts = groups_in_inventory(complex_inventory) do |group|
|
85
|
-
if group.key? 'targets'
|
86
|
-
group['targets'].count
|
87
|
-
end
|
85
|
+
group['targets'].count if group.key? 'targets'
|
88
86
|
end
|
89
87
|
expect(counts.sum).to be 4
|
90
88
|
end
|
@@ -133,7 +131,7 @@ RSpec.describe PuppetLitmus::InventoryManipulation do
|
|
133
131
|
end
|
134
132
|
|
135
133
|
it 'searches for roles as symbols' do
|
136
|
-
expect(search_for_target([
|
134
|
+
expect(search_for_target(%i[iis nginx], complex_inventory)).to eql ['test4.delivery.puppetlabs.net', 'test3.delivery.puppetlabs.net']
|
137
135
|
end
|
138
136
|
|
139
137
|
it 'raises an error if target not found' do
|
@@ -33,7 +33,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
33
33
|
let(:result) { ['value' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
|
34
34
|
let :os do
|
35
35
|
{
|
36
|
-
family: 'redhat'
|
36
|
+
family: 'redhat'
|
37
37
|
}
|
38
38
|
end
|
39
39
|
let(:command) { "LC_ALL=en_US.UTF-8 puppet apply /bla.pp --trace --modulepath #{Dir.pwd}/spec/fixtures/modules --hiera_config='/hiera.yaml'" }
|
@@ -54,7 +54,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
54
54
|
let(:command) { "LC_ALL=en_US.UTF-8 puppet apply /bla.pp --trace --modulepath #{Dir.pwd}/spec/fixtures/modules --detailed-exitcodes" }
|
55
55
|
let :os do
|
56
56
|
{
|
57
|
-
family: 'redhat'
|
57
|
+
family: 'redhat'
|
58
58
|
}
|
59
59
|
end
|
60
60
|
|
@@ -176,7 +176,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
176
176
|
expect(self).to receive(:target_in_inventory?).and_return(true)
|
177
177
|
expect(self).to receive(:target_in_inventory?).and_return(true)
|
178
178
|
expect(self).to receive(:upload_file).with(local, remote, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(result_failure)
|
179
|
-
expect { bolt_upload_file(local, remote) }.to raise_error(RuntimeError,
|
179
|
+
expect { bolt_upload_file(local, remote) }.to raise_error(RuntimeError, /upload file failed/)
|
180
180
|
end
|
181
181
|
|
182
182
|
it 'returns the exit code and error message when expecting failure' do
|
@@ -307,7 +307,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
307
307
|
expect(self).to receive(:target_in_inventory?).and_return(true)
|
308
308
|
expect(self).to receive(:target_in_inventory?).and_return(true)
|
309
309
|
expect(self).to receive(:run_task).with(task_name, 'some.host', params, config: config_data, inventory: inventory_hash).and_return(result_failure)
|
310
|
-
expect { run_bolt_task(task_name, params, opts: {}) }.to raise_error(RuntimeError,
|
310
|
+
expect { run_bolt_task(task_name, params, opts: {}) }.to raise_error(RuntimeError, /task failed/)
|
311
311
|
end
|
312
312
|
|
313
313
|
it 'returns the exit code and error message when expecting failure' do
|
@@ -330,7 +330,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
330
330
|
let(:owner) { 'foo:foo' }
|
331
331
|
let(:local_path) { '/tmp/local_foo' }
|
332
332
|
|
333
|
-
before
|
333
|
+
before do
|
334
334
|
allow_any_instance_of(File).to receive(:path).and_return(local_path)
|
335
335
|
end
|
336
336
|
|
@@ -342,9 +342,10 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
342
342
|
it 'call upload file with the correct params' do
|
343
343
|
stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
|
344
344
|
expect(self).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
|
345
|
-
|
346
|
-
|
347
|
-
expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(
|
345
|
+
|
346
|
+
expected_result = [{ 'status' => 'success' }]
|
347
|
+
expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(expected_result)
|
348
|
+
|
348
349
|
result = write_file(content, destination)
|
349
350
|
expect(result).to be true
|
350
351
|
end
|
@@ -354,9 +355,10 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
354
355
|
it 'call upload file with the correct params' do
|
355
356
|
stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
|
356
357
|
expect(self).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
|
357
|
-
|
358
|
-
|
359
|
-
expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(
|
358
|
+
|
359
|
+
expected_result = [{ 'status' => 'failure', 'value' => 'foo error' }]
|
360
|
+
expect(self).to receive(:upload_file).with(local_path, destination, 'some.host', options: {}, config: nil, inventory: inventory_hash).and_return(expected_result)
|
361
|
+
|
360
362
|
expect { write_file(content, destination) }.to raise_error 'foo error'
|
361
363
|
end
|
362
364
|
end
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe PuppetLitmus do
|
6
6
|
it 'has a version number' do
|
7
|
-
expect(described_class::VERSION).not_to
|
8
|
-
expect(described_class::VERSION).to
|
7
|
+
expect(described_class::VERSION).not_to be_nil
|
8
|
+
expect(described_class::VERSION).to be_a(String)
|
9
9
|
end
|
10
10
|
end
|
@@ -42,7 +42,7 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
42
42
|
inventory_vars: nil,
|
43
43
|
provision_hash: { 'default' => { 'provisioner' => 'docker', 'images' => ['waffleimage/centos7'] } },
|
44
44
|
results: [],
|
45
|
-
params: { 'action' => 'provision', 'platform' => 'waffleimage/centos7', 'inventory' => Dir.pwd }
|
45
|
+
params: { 'action' => 'provision', 'platform' => 'waffleimage/centos7', 'inventory' => Dir.pwd }
|
46
46
|
},
|
47
47
|
{
|
48
48
|
provisioner: 'vagrant',
|
@@ -50,8 +50,8 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
50
50
|
inventory_vars: nil,
|
51
51
|
provision_hash: { 'default' => { 'provisioner' => 'vagrant', 'images' => ['centos7'] } },
|
52
52
|
results: [],
|
53
|
-
params: { 'action' => 'provision', 'platform' => 'centos7', 'inventory' => Dir.pwd }
|
54
|
-
}
|
53
|
+
params: { 'action' => 'provision', 'platform' => 'centos7', 'inventory' => Dir.pwd }
|
54
|
+
}
|
55
55
|
].freeze
|
56
56
|
|
57
57
|
examples.each do |e|
|
@@ -85,7 +85,7 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
85
85
|
{ 'uri' => 'one.host', 'facts' => { 'provisioner' => 'abs', 'platform' => 'ubuntu-1604-x86_64', 'job_id' => 'iac-task-pid-21648' } },
|
86
86
|
{ 'uri' => 'two.host', 'facts' => { 'provisioner' => 'abs', 'platform' => 'ubuntu-1804-x86_64', 'job_id' => 'iac-task-pid-21648' } },
|
87
87
|
{ 'uri' => 'three.host', 'facts' => { 'provisioner' => 'abs', 'platform' => 'ubuntu-2004-x86_64', 'job_id' => 'iac-task-pid-21648' } },
|
88
|
-
{ 'uri' => 'four.host', 'facts' => { 'provisioner' => 'abs', 'platform' => 'ubuntu-2004-x86_64', 'job_id' => 'iac-task-pid-21649' } }
|
88
|
+
{ 'uri' => 'four.host', 'facts' => { 'provisioner' => 'abs', 'platform' => 'ubuntu-2004-x86_64', 'job_id' => 'iac-task-pid-21649' } }
|
89
89
|
] }] }
|
90
90
|
end
|
91
91
|
let(:targets) { ['one.host'] }
|
@@ -103,7 +103,7 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
103
103
|
'removed' =>
|
104
104
|
['one.host',
|
105
105
|
'two.host',
|
106
|
-
'three.host'] } }]
|
106
|
+
'three.host'] } }]
|
107
107
|
)
|
108
108
|
results = tear_down_nodes(targets, inventory_hash)
|
109
109
|
expect(results.keys).to eq(['one.host', 'two.host', 'three.host'])
|
@@ -170,7 +170,7 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
170
170
|
|
171
171
|
it 'node unavailable' do
|
172
172
|
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(command, targets, config: nil, inventory: inventory_hash).and_return([{ 'target' => 'some.host', 'status' => 'failure' }])
|
173
|
-
expect { check_connectivity?(inventory_hash, 'some.host') }.to raise_error(RuntimeError,
|
173
|
+
expect { check_connectivity?(inventory_hash, 'some.host') }.to raise_error(RuntimeError, /Connectivity has failed on:/)
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -59,6 +59,13 @@ describe 'litmus rake tasks' do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
context 'with litmus:provision task' do
|
62
|
+
let(:expected_output) do
|
63
|
+
<<~OUTPUT
|
64
|
+
Successfully provisioned centos:7 using docker
|
65
|
+
localhost:2222, centos:7
|
66
|
+
OUTPUT
|
67
|
+
end
|
68
|
+
|
62
69
|
it 'happy path' do
|
63
70
|
results = [{ 'target' => 'localhost',
|
64
71
|
'action' => 'task',
|
@@ -71,11 +78,7 @@ describe 'litmus rake tasks' do
|
|
71
78
|
allow_any_instance_of(PuppetLitmus::InventoryManipulation).to receive(:inventory_hash_from_inventory_file).with(any_args).and_return({})
|
72
79
|
allow_any_instance_of(PuppetLitmus::RakeHelper).to receive(:check_connectivity?).with(any_args).and_return(true)
|
73
80
|
|
74
|
-
expect
|
75
|
-
expect($stdout).to receive(:puts).with("Successfully provisioned centos:7 using docker\n")
|
76
|
-
expect($stdout).to receive(:puts).with('localhost:2222, centos:7')
|
77
|
-
|
78
|
-
Rake::Task['litmus:provision'].invoke('docker', 'centos:7')
|
81
|
+
expect { Rake::Task['litmus:provision'].invoke('docker', 'centos:7') }.to output(expected_output).to_stdout
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
@@ -86,7 +89,7 @@ describe 'litmus rake tasks' do
|
|
86
89
|
it 'no key in provision file' do
|
87
90
|
allow(File).to receive(:file?).with(any_args).and_return(true)
|
88
91
|
expect(YAML).to receive(:load_file).with(provision_file).and_return(provision_hash)
|
89
|
-
expect { Rake::Task['litmus:provision_list'].invoke('deet') }.to raise_error(
|
92
|
+
expect { Rake::Task['litmus:provision_list'].invoke('deet') }.to raise_error(/deet/)
|
90
93
|
end
|
91
94
|
end
|
92
95
|
|
@@ -6,10 +6,10 @@ load File.expand_path('../../../lib/puppet_litmus/util.rb', __dir__)
|
|
6
6
|
RSpec.describe PuppetLitmus::Util do
|
7
7
|
context 'when using interpolate_powershell' do
|
8
8
|
it 'interpolates the command' do
|
9
|
-
expect(described_class.interpolate_powershell('foo')).to match(
|
10
|
-
expect(described_class.interpolate_powershell('foo')).to match(
|
11
|
-
expect(described_class.interpolate_powershell('foo')).to match(
|
12
|
-
expect(described_class.interpolate_powershell('foo')).not_to match(
|
9
|
+
expect(described_class.interpolate_powershell('foo')).to match(/powershell\.exe/)
|
10
|
+
expect(described_class.interpolate_powershell('foo')).to match(/NoProfile/)
|
11
|
+
expect(described_class.interpolate_powershell('foo')).to match(/EncodedCommand/)
|
12
|
+
expect(described_class.interpolate_powershell('foo')).not_to match(/foo/)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,7 +12,7 @@ if ENV['COVERAGE'] == 'yes'
|
|
12
12
|
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
13
13
|
else
|
14
14
|
SimpleCov.formatters = [
|
15
|
-
SimpleCov::Formatter::HTMLFormatter
|
15
|
+
SimpleCov::Formatter::HTMLFormatter
|
16
16
|
]
|
17
17
|
end
|
18
18
|
SimpleCov.start do
|
@@ -41,7 +41,7 @@ def run_matrix_from_metadata_v2(options = {})
|
|
41
41
|
OpenStruct.new(
|
42
42
|
stdout: result[0],
|
43
43
|
stderr: result[1],
|
44
|
-
status_code: result[2]
|
44
|
+
status_code: result[2]
|
45
45
|
)
|
46
46
|
end
|
47
47
|
|
data/spec/support/inventory.rb
CHANGED
@@ -7,7 +7,7 @@ def no_config_hash
|
|
7
7
|
'targets' =>
|
8
8
|
[{ 'uri' => 'test.delivery.puppetlabs.net',
|
9
9
|
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
10
|
-
{ 'name' => 'winrm_nodes', 'targets' => [] }
|
10
|
+
{ 'name' => 'winrm_nodes', 'targets' => [] }
|
11
11
|
] }
|
12
12
|
end
|
13
13
|
|
@@ -99,21 +99,21 @@ def complex_inventory
|
|
99
99
|
'uri' => 'test.delivery.puppetlabs.net',
|
100
100
|
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
101
101
|
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' },
|
102
|
-
'vars' => { 'role' => 'agent' }
|
102
|
+
'vars' => { 'role' => 'agent' }
|
103
103
|
},
|
104
104
|
{
|
105
105
|
'uri' => 'test2.delivery.puppetlabs.net',
|
106
106
|
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
107
107
|
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' },
|
108
|
-
'vars' => { 'role' => 'server' }
|
108
|
+
'vars' => { 'role' => 'server' }
|
109
109
|
},
|
110
110
|
{
|
111
111
|
'uri' => 'test3.delivery.puppetlabs.net',
|
112
112
|
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
113
|
-
'vars' => { 'roles' => %w[agent nginx webserver] }
|
114
|
-
}
|
115
|
-
] }
|
116
|
-
]
|
113
|
+
'vars' => { 'roles' => %w[agent nginx webserver] }
|
114
|
+
}
|
115
|
+
] }
|
116
|
+
]
|
117
117
|
},
|
118
118
|
{
|
119
119
|
'name' => 'winrm_nodes',
|
@@ -122,9 +122,9 @@ def complex_inventory
|
|
122
122
|
'uri' => 'test4.delivery.puppetlabs.net',
|
123
123
|
'config' => { 'transport' => 'winrm', 'winrm' => { 'user' => 'admin', 'password' => 'Qu@lity!' } },
|
124
124
|
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' },
|
125
|
-
'vars' => { 'roles' => %w[agent iis webserver] }
|
126
|
-
}
|
127
|
-
]
|
128
|
-
}
|
125
|
+
'vars' => { 'roles' => %w[agent iis webserver] }
|
126
|
+
}
|
127
|
+
]
|
128
|
+
}
|
129
129
|
] }
|
130
130
|
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.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bolt
|
@@ -25,93 +25,87 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: docker-api
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '1.34'
|
34
34
|
- - "<"
|
35
35
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
36
|
+
version: 3.0.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
41
|
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
43
|
+
version: '1.34'
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 3.0.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: honeycomb-beeline
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0
|
54
|
-
- - "<"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: 1.0.0
|
53
|
+
version: '0'
|
57
54
|
type: :runtime
|
58
55
|
prerelease: false
|
59
56
|
version_requirements: !ruby/object:Gem::Requirement
|
60
57
|
requirements:
|
61
58
|
- - ">="
|
62
59
|
- !ruby/object:Gem::Version
|
63
|
-
version: 0
|
64
|
-
- - "<"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.0.0
|
60
|
+
version: '0'
|
67
61
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
62
|
+
name: parallel
|
69
63
|
requirement: !ruby/object:Gem::Requirement
|
70
64
|
requirements:
|
71
65
|
- - ">="
|
72
66
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
74
|
-
- - "<"
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 3.0.0
|
67
|
+
version: '0'
|
77
68
|
type: :runtime
|
78
69
|
prerelease: false
|
79
70
|
version_requirements: !ruby/object:Gem::Requirement
|
80
71
|
requirements:
|
81
72
|
- - ">="
|
82
73
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
84
|
-
- - "<"
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 3.0.0
|
74
|
+
version: '0'
|
87
75
|
- !ruby/object:Gem::Dependency
|
88
|
-
name:
|
76
|
+
name: puppet-modulebuilder
|
89
77
|
requirement: !ruby/object:Gem::Requirement
|
90
78
|
requirements:
|
91
|
-
- - "
|
79
|
+
- - ">="
|
92
80
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
81
|
+
version: 0.2.1
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.0.0.rc
|
94
85
|
type: :runtime
|
95
86
|
prerelease: false
|
96
87
|
version_requirements: !ruby/object:Gem::Requirement
|
97
88
|
requirements:
|
98
|
-
- - "
|
89
|
+
- - ">="
|
99
90
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
91
|
+
version: 0.2.1
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.0.0.rc
|
101
95
|
- !ruby/object:Gem::Dependency
|
102
|
-
name:
|
96
|
+
name: retryable
|
103
97
|
requirement: !ruby/object:Gem::Requirement
|
104
98
|
requirements:
|
105
|
-
- - "
|
99
|
+
- - "~>"
|
106
100
|
- !ruby/object:Gem::Version
|
107
|
-
version: '0'
|
101
|
+
version: '3.0'
|
108
102
|
type: :runtime
|
109
103
|
prerelease: false
|
110
104
|
version_requirements: !ruby/object:Gem::Requirement
|
111
105
|
requirements:
|
112
|
-
- - "
|
106
|
+
- - "~>"
|
113
107
|
- !ruby/object:Gem::Version
|
114
|
-
version: '0'
|
108
|
+
version: '3.0'
|
115
109
|
- !ruby/object:Gem::Dependency
|
116
110
|
name: rspec
|
117
111
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,7 +121,7 @@ dependencies:
|
|
127
121
|
- !ruby/object:Gem::Version
|
128
122
|
version: '0'
|
129
123
|
- !ruby/object:Gem::Dependency
|
130
|
-
name:
|
124
|
+
name: rspec_honeycomb_formatter
|
131
125
|
requirement: !ruby/object:Gem::Requirement
|
132
126
|
requirements:
|
133
127
|
- - ">="
|
@@ -141,19 +135,25 @@ dependencies:
|
|
141
135
|
- !ruby/object:Gem::Version
|
142
136
|
version: '0'
|
143
137
|
- !ruby/object:Gem::Dependency
|
144
|
-
name:
|
138
|
+
name: tty-spinner
|
145
139
|
requirement: !ruby/object:Gem::Requirement
|
146
140
|
requirements:
|
147
141
|
- - ">="
|
148
142
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
143
|
+
version: 0.5.0
|
144
|
+
- - "<"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 1.0.0
|
150
147
|
type: :runtime
|
151
148
|
prerelease: false
|
152
149
|
version_requirements: !ruby/object:Gem::Requirement
|
153
150
|
requirements:
|
154
151
|
- - ">="
|
155
152
|
- !ruby/object:Gem::Version
|
156
|
-
version:
|
153
|
+
version: 0.5.0
|
154
|
+
- - "<"
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: 1.0.0
|
157
157
|
description: " Providing a simple command line tool for puppet content creators,
|
158
158
|
to enable simple and complex test deployments.\n"
|
159
159
|
email:
|
@@ -202,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
202
|
requirements:
|
203
203
|
- - ">="
|
204
204
|
- !ruby/object:Gem::Version
|
205
|
-
version: 2.
|
205
|
+
version: 2.7.0
|
206
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
207
|
requirements:
|
208
208
|
- - ">="
|
@@ -214,18 +214,4 @@ signing_key:
|
|
214
214
|
specification_version: 4
|
215
215
|
summary: Providing a simple command line tool for puppet content creators, to enable
|
216
216
|
simple and complex test deployments.
|
217
|
-
test_files:
|
218
|
-
- spec/exe/matrix_from_metadata_v2_spec.rb
|
219
|
-
- spec/exe/fake_metadata.json
|
220
|
-
- spec/lib/puppet_litmus/util_spec.rb
|
221
|
-
- spec/lib/puppet_litmus/inventory_manipulation_spec.rb
|
222
|
-
- spec/lib/puppet_litmus/rake_tasks_spec.rb
|
223
|
-
- spec/lib/puppet_litmus/puppet_helpers_spec.rb
|
224
|
-
- spec/lib/puppet_litmus/rake_helper_spec.rb
|
225
|
-
- spec/lib/puppet_litmus/puppet_litmus_version_spec.rb
|
226
|
-
- spec/spec_helper.rb
|
227
|
-
- spec/support/inventorytesting.yaml
|
228
|
-
- spec/support/inventory.rb
|
229
|
-
- spec/data/doot.tar.gz
|
230
|
-
- spec/data/inventory.yaml
|
231
|
-
- spec/data/jim.yaml
|
217
|
+
test_files: []
|