puppet_litmus 0.18.2 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/puppet_litmus/puppet_helpers.rb +7 -7
- data/lib/puppet_litmus/rake_helper.rb +67 -44
- data/lib/puppet_litmus/rake_tasks.rb +75 -74
- data/lib/puppet_litmus/version.rb +1 -1
- data/spec/lib/puppet_litmus/rake_helper_spec.rb +4 -4
- data/spec/lib/puppet_litmus/rake_tasks_spec.rb +7 -6
- metadata +19 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ace2d5a5ae33d1e795535b4704d84a54b9d97e48bd5a77b39866887c077e300
|
4
|
+
data.tar.gz: 611dbd8bd462331462506280920ac3355a732c18ca2a6edc2ce15e4da5071214
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f2024d6a7afed0976cdc5ab48ab1fe1e42ff17f75a39637feed9cf102d0a8defc8fd2c8bf54dac45512f9849fd9ec1a1862691455c6246e79afc55008376d23
|
7
|
+
data.tar.gz: 8a91349dc69667bdb7e701fa64a60fe71b0f8e311c017d5bda53b4fd0d1fa17c0276db50982076abdbf2d56408ea88cd6d9de8fac151ba609f41c75282c7125b
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ Install Litmus as a gem by running ```gem install puppet_litmus```.
|
|
24
24
|
|
25
25
|
## Documentation
|
26
26
|
|
27
|
-
For documentation, see our [Litmus
|
27
|
+
For documentation, see our [Litmus Docs Site](https://puppetlabs.github.io/litmus/).
|
28
28
|
|
29
29
|
## Other Resources
|
30
30
|
|
@@ -9,7 +9,7 @@ module PuppetLitmus::PuppetHelpers
|
|
9
9
|
# @return [Boolean] The result of the 2 apply manifests.
|
10
10
|
def idempotent_apply(manifest)
|
11
11
|
Honeycomb.start_span(name: 'litmus.idempotent_apply') do |span|
|
12
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
12
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
13
13
|
manifest_file_location = create_manifest_file(manifest)
|
14
14
|
apply_manifest(nil, expect_failures: false, manifest_file_location: manifest_file_location)
|
15
15
|
apply_manifest(nil, catch_changes: true, manifest_file_location: manifest_file_location)
|
@@ -39,7 +39,7 @@ module PuppetLitmus::PuppetHelpers
|
|
39
39
|
# @return [Object] A result object from the apply.
|
40
40
|
def apply_manifest(manifest, opts = {})
|
41
41
|
Honeycomb.start_span(name: 'litmus.apply_manifest') do |span|
|
42
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
42
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
43
43
|
span.add_field('litmus.manifest', manifest)
|
44
44
|
span.add_field('litmus.opts', opts)
|
45
45
|
|
@@ -117,7 +117,7 @@ module PuppetLitmus::PuppetHelpers
|
|
117
117
|
# @return [String] The path to the location of the manifest.
|
118
118
|
def create_manifest_file(manifest)
|
119
119
|
Honeycomb.start_span(name: 'litmus.create_manifest_file') do |span|
|
120
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
120
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
121
121
|
span.add_field('litmus.manifest', manifest)
|
122
122
|
|
123
123
|
require 'tmpdir'
|
@@ -155,7 +155,7 @@ module PuppetLitmus::PuppetHelpers
|
|
155
155
|
# @return [Object] A result object from the command.
|
156
156
|
def run_shell(command_to_run, opts = {})
|
157
157
|
Honeycomb.start_span(name: 'litmus.run_shell') do |span|
|
158
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
158
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
159
159
|
span.add_field('litmus.command_to_run', command_to_run)
|
160
160
|
span.add_field('litmus.opts', opts)
|
161
161
|
|
@@ -192,7 +192,7 @@ module PuppetLitmus::PuppetHelpers
|
|
192
192
|
# @return [Object] A result object from the command.
|
193
193
|
def bolt_upload_file(source, destination, opts = {}, options = {})
|
194
194
|
Honeycomb.start_span(name: 'litmus.bolt_upload_file') do |span|
|
195
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
195
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
196
196
|
span.add_field('litmus.source', source)
|
197
197
|
span.add_field('litmus.destination', destination)
|
198
198
|
span.add_field('litmus.opts', opts)
|
@@ -244,7 +244,7 @@ module PuppetLitmus::PuppetHelpers
|
|
244
244
|
# @return [Object] A result object from the task.The values available are stdout, stderr and result.
|
245
245
|
def run_bolt_task(task_name, params = {}, opts = {})
|
246
246
|
Honeycomb.start_span(name: 'litmus.run_task') do |span|
|
247
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
247
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
248
248
|
span.add_field('litmus.task_name', task_name)
|
249
249
|
span.add_field('litmus.params', params)
|
250
250
|
span.add_field('litmus.opts', opts)
|
@@ -312,7 +312,7 @@ module PuppetLitmus::PuppetHelpers
|
|
312
312
|
# @return [Object] A result object from the script run.
|
313
313
|
def bolt_run_script(script, opts = {}, arguments: [])
|
314
314
|
Honeycomb.start_span(name: 'litmus.bolt_run_script') do |span|
|
315
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
315
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
316
316
|
span.add_field('litmus.script', script)
|
317
317
|
span.add_field('litmus.opts', opts)
|
318
318
|
span.add_field('litmus.arguments', arguments)
|
@@ -2,15 +2,17 @@
|
|
2
2
|
|
3
3
|
require 'bolt_spec/run'
|
4
4
|
require 'honeycomb-beeline'
|
5
|
+
require 'puppet_litmus/version'
|
5
6
|
Honeycomb.configure do |config|
|
6
7
|
# override client if no configuration is provided, so that the pesky libhoney warning about lack of configuration is not shown
|
7
8
|
unless ENV['HONEYCOMB_WRITEKEY'] && ENV['HONEYCOMB_DATASET']
|
8
9
|
config.client = Libhoney::NullClient.new
|
9
10
|
end
|
10
11
|
end
|
11
|
-
process_span = Honeycomb.start_span(name: '
|
12
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = process_span.to_trace_header
|
12
|
+
process_span = Honeycomb.start_span(name: "litmus: #{([$PROGRAM_NAME] + ($ARGV || [])).join(' ')}", serialized_trace: ENV['HTTP_X_HONEYCOMB_TRACE'])
|
13
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = process_span.to_trace_header
|
13
14
|
Honeycomb.add_field_to_trace('litmus.pid', Process.pid)
|
15
|
+
Honeycomb.add_field_to_trace('litmus.version', PuppetLitmus::VERSION)
|
14
16
|
if ENV['CI'] == 'true' && ENV['TRAVIS'] == 'true'
|
15
17
|
Honeycomb.add_field_to_trace('module_name', ENV['TRAVIS_REPO_SLUG'])
|
16
18
|
Honeycomb.add_field_to_trace('ci.provider', 'travis')
|
@@ -90,7 +92,7 @@ module PuppetLitmus::RakeHelper
|
|
90
92
|
# @return [Object] the standard out stream.
|
91
93
|
def run_local_command(command)
|
92
94
|
Honeycomb.start_span(name: 'litmus.run_local_command') do |span|
|
93
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
95
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
94
96
|
span.add_field('litmus.command', command)
|
95
97
|
|
96
98
|
require 'open3'
|
@@ -113,7 +115,7 @@ module PuppetLitmus::RakeHelper
|
|
113
115
|
|
114
116
|
Honeycomb.add_field_to_trace('litmus.provisioner', provisioner)
|
115
117
|
Honeycomb.start_span(name: 'litmus.provision') do |span|
|
116
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
118
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
117
119
|
span.add_field('litmus.platform', platform)
|
118
120
|
span.add_field('litmus.inventory', params['inventory'])
|
119
121
|
span.add_field('litmus.config', DEFAULT_CONFIG_DATA)
|
@@ -142,7 +144,7 @@ module PuppetLitmus::RakeHelper
|
|
142
144
|
|
143
145
|
def tear_down_nodes(targets, inventory_hash)
|
144
146
|
Honeycomb.start_span(name: 'litmus.tear_down_nodes') do |span|
|
145
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
147
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
146
148
|
span.add_field('litmus.targets', targets)
|
147
149
|
|
148
150
|
include ::BoltSpec::Run
|
@@ -162,7 +164,7 @@ module PuppetLitmus::RakeHelper
|
|
162
164
|
|
163
165
|
def tear_down(node_name, inventory_hash)
|
164
166
|
Honeycomb.start_span(name: 'litmus.tear_down') do |span|
|
165
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
167
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
166
168
|
# how do we know what provisioner to use
|
167
169
|
|
168
170
|
span.add_field('litmus.node_name', node_name)
|
@@ -178,7 +180,7 @@ module PuppetLitmus::RakeHelper
|
|
178
180
|
|
179
181
|
def install_agent(collection, targets, inventory_hash)
|
180
182
|
Honeycomb.start_span(name: 'litmus.install_agent') do |span|
|
181
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
183
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
182
184
|
span.add_field('litmus.collection', collection)
|
183
185
|
span.add_field('litmus.targets', targets)
|
184
186
|
|
@@ -209,32 +211,71 @@ module PuppetLitmus::RakeHelper
|
|
209
211
|
results
|
210
212
|
end
|
211
213
|
|
214
|
+
# Build the module in `module_dir` and put the resulting compressed tarball into `target_dir`.
|
215
|
+
#
|
212
216
|
# @param opts Hash of options to build the module
|
213
217
|
# @param module_dir [String] The path of the module to build. If missing defaults to Dir.pwd
|
214
|
-
# @param target_dir [String] The path the module will be built into. The default is <
|
218
|
+
# @param target_dir [String] The path the module will be built into. The default is <module_dir>/pkg
|
215
219
|
# @return [String] The path to the built module
|
216
220
|
def build_module(module_dir = nil, target_dir = nil)
|
217
221
|
require 'puppet/modulebuilder'
|
218
222
|
|
219
|
-
|
220
|
-
|
223
|
+
module_dir ||= Dir.pwd
|
224
|
+
target_dir ||= File.join(source_dir, 'pkg')
|
225
|
+
|
226
|
+
puts "Building '#{module_dir}' into '#{target_dir}''"
|
227
|
+
builder = Puppet::Modulebuilder::Builder.new(module_dir, target_dir, nil)
|
221
228
|
|
222
|
-
builder = Puppet::Modulebuilder::Builder.new(source_dir, dest_dir, nil)
|
223
229
|
# Force the metadata to be read. Raises if metadata could not be found
|
224
230
|
_metadata = builder.metadata
|
225
231
|
|
226
232
|
builder.build
|
227
233
|
end
|
228
234
|
|
229
|
-
|
235
|
+
# Builds all the modules in a specified directory
|
236
|
+
#
|
237
|
+
# @param source_dir [String] the directory to get the modules from
|
238
|
+
# @param target_dir [String] temporary location to store tarballs before uploading. This directory will be cleaned before use. The default is <source_dir>/pkg
|
239
|
+
# @return [Array] an array of module tars' filenames
|
240
|
+
def build_modules_in_dir(source_dir, target_dir = nil)
|
241
|
+
target_dir ||= File.join(Dir.pwd, 'pkg')
|
242
|
+
# remove old build dir if exists, before we build afresh
|
243
|
+
FileUtils.rm_rf(target_dir) if File.directory?(target_dir)
|
244
|
+
|
245
|
+
module_tars = Dir.entries(source_dir).map do |entry|
|
246
|
+
next if ['.', '..'].include? entry
|
247
|
+
|
248
|
+
module_dir = File.join(source_dir, entry)
|
249
|
+
next unless File.directory? module_dir
|
250
|
+
|
251
|
+
build_module(module_dir, target_dir)
|
252
|
+
end
|
253
|
+
module_tars.compact
|
254
|
+
end
|
255
|
+
|
256
|
+
# @deprecated Use `build_modules_in_dir` instead
|
257
|
+
def build_modules_in_folder(source_folder)
|
258
|
+
build_modules_in_dir(source_folder)
|
259
|
+
end
|
260
|
+
|
261
|
+
# Install a specific module tarball to the specified target.
|
262
|
+
# This method installs dependencies using a forge repository.
|
263
|
+
#
|
264
|
+
# @param inventory_hash [Hash] the pre-loaded inventory
|
265
|
+
# @param target_node_name [String] the name of the target where the module should be installed
|
266
|
+
# @param module_tar [String] the filename of the module tarball to upload
|
267
|
+
# @param module_repository [String] the URL for the forge to use for downloading modules. Defaults to the public Forge API.
|
268
|
+
# @return a bolt result
|
269
|
+
def install_module(inventory_hash, target_node_name, module_tar, module_repository = nil)
|
230
270
|
Honeycomb.start_span(name: 'install_module') do |span|
|
231
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
271
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
232
272
|
span.add_field('litmus.target_node_name', target_node_name)
|
233
273
|
span.add_field('litmus.module_tar', module_tar)
|
234
274
|
|
235
|
-
# make sure the
|
275
|
+
# make sure the module to install is not installed
|
236
276
|
# otherwise `puppet module install` might silently skip it
|
237
|
-
|
277
|
+
module_name = File.basename(module_tar, '.tar.gz').split('-', 3)[0..1].join('-')
|
278
|
+
uninstall_module(inventory_hash.clone, target_node_name, module_name, force: true)
|
238
279
|
|
239
280
|
include ::BoltSpec::Run
|
240
281
|
|
@@ -243,7 +284,8 @@ module PuppetLitmus::RakeHelper
|
|
243
284
|
bolt_result = upload_file(module_tar, File.basename(module_tar), target_nodes, options: {}, config: nil, inventory: inventory_hash.clone)
|
244
285
|
raise_bolt_errors(bolt_result, 'Failed to upload module.')
|
245
286
|
|
246
|
-
|
287
|
+
module_repository_opts = "--module_repository '#{module_repository}'" unless module_repository.nil?
|
288
|
+
install_module_command = "puppet module install #{module_repository_opts} #{File.basename(module_tar)}"
|
247
289
|
span.add_field('litmus.install_module_command', install_module_command)
|
248
290
|
|
249
291
|
bolt_result = run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash.clone)
|
@@ -252,31 +294,6 @@ module PuppetLitmus::RakeHelper
|
|
252
294
|
end
|
253
295
|
end
|
254
296
|
|
255
|
-
# Builds all the modules in a specified module
|
256
|
-
#
|
257
|
-
# @param source_folder [String] the folder to get the modules from
|
258
|
-
# @return [Array] an array of module tar's
|
259
|
-
def build_modules_in_folder(source_folder)
|
260
|
-
folder_list = Dir.entries(source_folder).reject { |f| File.directory? f }
|
261
|
-
module_tars = []
|
262
|
-
|
263
|
-
target_dir = File.join(Dir.pwd, 'pkg')
|
264
|
-
# remove old build folder if exists, before we build afresh
|
265
|
-
FileUtils.rm_rf(target_dir) if File.directory?(target_dir)
|
266
|
-
|
267
|
-
folder_list.each do |folder|
|
268
|
-
folder_handle = Dir.open(File.join(source_folder, folder))
|
269
|
-
next if File.symlink?(folder_handle)
|
270
|
-
|
271
|
-
module_dir = folder_handle.path
|
272
|
-
|
273
|
-
# build_module
|
274
|
-
module_tar = build_module(module_dir, target_dir)
|
275
|
-
module_tars.push(File.new(module_tar))
|
276
|
-
end
|
277
|
-
module_tars
|
278
|
-
end
|
279
|
-
|
280
297
|
def metadata_module_name
|
281
298
|
require 'json'
|
282
299
|
raise 'Could not find metadata.json' unless File.exist?(File.join(Dir.pwd, 'metadata.json'))
|
@@ -287,6 +304,11 @@ module PuppetLitmus::RakeHelper
|
|
287
304
|
metadata['name']
|
288
305
|
end
|
289
306
|
|
307
|
+
# Uninstall a module from a specified target
|
308
|
+
# @param inventory_hash [Hash] the pre-loaded inventory
|
309
|
+
# @param target_node_name [String] the name of the target where the module should be uninstalled
|
310
|
+
# @param module_to_remove [String] the name of the module to remove. Defaults to the module under test.
|
311
|
+
# @param opts [Hash] additional options to pass on to `puppet module uninstall`
|
290
312
|
def uninstall_module(inventory_hash, target_node_name, module_to_remove = nil, **opts)
|
291
313
|
include ::BoltSpec::Run
|
292
314
|
module_name = module_to_remove || metadata_module_name
|
@@ -301,7 +323,7 @@ module PuppetLitmus::RakeHelper
|
|
301
323
|
|
302
324
|
def check_connectivity?(inventory_hash, target_node_name)
|
303
325
|
Honeycomb.start_span(name: 'litmus.check_connectivity') do |span|
|
304
|
-
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
326
|
+
ENV['HTTP_X_HONEYCOMB_TRACE'] = span.to_trace_header
|
305
327
|
# if we're only checking connectivity for a single node
|
306
328
|
if target_node_name
|
307
329
|
span.add_field('litmus.node_name', target_node_name)
|
@@ -346,7 +368,7 @@ module PuppetLitmus::RakeHelper
|
|
346
368
|
|
347
369
|
target = target_result['target']
|
348
370
|
# get some info from error
|
349
|
-
errors[target] = target_result['value']
|
371
|
+
errors[target] = target_result['value']
|
350
372
|
end
|
351
373
|
errors
|
352
374
|
end
|
@@ -359,7 +381,8 @@ module PuppetLitmus::RakeHelper
|
|
359
381
|
errors = check_bolt_errors(result_set)
|
360
382
|
|
361
383
|
unless errors.empty?
|
362
|
-
|
384
|
+
formatted_results = errors.map { |k, v| " #{k}: #{v.inspect}" }.join("\n")
|
385
|
+
raise "#{error_msg}\nResults:\n#{formatted_results}}"
|
363
386
|
end
|
364
387
|
|
365
388
|
nil
|
@@ -17,15 +17,15 @@ namespace :litmus do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Provisions a list of OSes from provision.yaml file e.g. 'bundle exec rake litmus:provision_list[default]'.
|
20
|
-
# @See https://github.
|
20
|
+
# @See https://puppetlabs.github.io/litmus/Litmus-core-commands.html#provisioning-via-yaml
|
21
21
|
#
|
22
22
|
# @param :key [String] key that maps to a value for a provisioner and an image to be used for each OS provisioned.
|
23
|
-
desc
|
23
|
+
desc 'provision list of machines from provision.yaml file'
|
24
24
|
task :provision_list, [:key] do |_task, args|
|
25
25
|
raise 'Cannot find provision.yaml file' unless File.file?('./provision.yaml')
|
26
26
|
|
27
27
|
provision_hash = YAML.load_file('./provision.yaml')
|
28
|
-
raise "No key #{args[:key]} in ./provision.yaml, see https://github.
|
28
|
+
raise "No key #{args[:key]} in ./provision.yaml, see https://puppetlabs.github.io/litmus/Litmus-core-commands.html#provisioning-via-yaml for examples" if provision_hash[args[:key]].nil?
|
29
29
|
|
30
30
|
Rake::Task['spec_prep'].invoke
|
31
31
|
|
@@ -71,7 +71,7 @@ namespace :litmus do
|
|
71
71
|
#
|
72
72
|
# @param :provisioner [String] provisioner to use in provisioning given platform.
|
73
73
|
# @param :platform [String] OS platform for container or VM to use.
|
74
|
-
desc
|
74
|
+
desc 'provision a test system using the given provisioner and platform name. See the puppetlabs-provision module tasks for more documentation'
|
75
75
|
task :provision, [:provisioner, :platform, :inventory_vars] do |_task, args|
|
76
76
|
Rake::Task['spec_prep'].invoke
|
77
77
|
if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
|
@@ -103,7 +103,7 @@ namespace :litmus do
|
|
103
103
|
#
|
104
104
|
# @param :collection [String] parameters to pass to the puppet agent install command.
|
105
105
|
# @param :target_node_name [Array] nodes on which to install puppet agent.
|
106
|
-
desc 'install puppet agent
|
106
|
+
desc 'install a puppet agent to all or a specified set of targets'
|
107
107
|
task :install_agent, [:collection, :target_node_name] do |_task, args|
|
108
108
|
inventory_hash = inventory_hash_from_inventory_file
|
109
109
|
targets = find_targets(inventory_hash, args[:target_node_name])
|
@@ -143,7 +143,7 @@ namespace :litmus do
|
|
143
143
|
#
|
144
144
|
# @param :target_node_name [Array] nodes on which to add the feature.
|
145
145
|
# @param :added_feature [String] the feature which you wish to add.
|
146
|
-
desc '
|
146
|
+
desc 'add a feature tag to a node'
|
147
147
|
task :add_feature, [:added_feature, :target_node_name] do |_task, args|
|
148
148
|
inventory_hash = inventory_hash_from_inventory_file
|
149
149
|
targets = find_targets(inventory_hash, args[:target_node_name])
|
@@ -166,83 +166,118 @@ namespace :litmus do
|
|
166
166
|
puts 'Feature added'
|
167
167
|
end
|
168
168
|
|
169
|
+
# Install the puppet module under test on a collection of nodes
|
170
|
+
#
|
171
|
+
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
172
|
+
desc 'build the module under test and install it onto targets'
|
173
|
+
task :install_module, [:target_node_name, :module_repository] do |_task, args|
|
174
|
+
args.with_defaults(target_node_name: nil, module_repository: nil)
|
175
|
+
inventory_hash = inventory_hash_from_inventory_file
|
176
|
+
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
177
|
+
if target_nodes.empty?
|
178
|
+
puts 'No targets found'
|
179
|
+
exit 0
|
180
|
+
end
|
181
|
+
|
182
|
+
module_tar = build_module
|
183
|
+
puts "Built '#{module_tar}'"
|
184
|
+
|
185
|
+
# module_tar = Dir.glob('pkg/*.tar.gz').max_by { |f| File.mtime(f) }
|
186
|
+
raise "Unable to find package in 'pkg/*.tar.gz'" if module_tar.nil?
|
187
|
+
|
188
|
+
install_module(inventory_hash, args[:target_node_name], module_tar, args[:module_repository])
|
189
|
+
|
190
|
+
puts "Installed '#{module_tar}' on #{args[:target_node_name]}"
|
191
|
+
end
|
192
|
+
|
169
193
|
# Install the puppet modules from a source directory to nodes. It does not install dependencies.
|
170
194
|
#
|
171
195
|
# @param :source [String] source directory to look in (ignores symlinks) defaults do './spec/fixtures/modules'.
|
172
196
|
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
173
|
-
desc '
|
197
|
+
desc 'build and install all modules from a directory'
|
174
198
|
task :install_modules_from_directory, [:source, :target_node_name, :module_repository] do |_task, args|
|
175
|
-
args.with_defaults(source: nil, target_node_name: nil, module_repository:
|
199
|
+
args.with_defaults(source: nil, target_node_name: nil, module_repository: nil)
|
176
200
|
inventory_hash = inventory_hash_from_inventory_file
|
177
201
|
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
178
202
|
if target_nodes.empty?
|
179
203
|
puts 'No targets found'
|
180
204
|
exit 0
|
181
205
|
end
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
raise "Source
|
188
|
-
|
189
|
-
puts
|
190
|
-
module_tars =
|
206
|
+
source_dir = if args[:source].nil?
|
207
|
+
'./spec/fixtures/modules'
|
208
|
+
else
|
209
|
+
File.expand_path(args[:source])
|
210
|
+
end
|
211
|
+
raise "Source directory doesn't exist #{source_dir}" unless File.directory?(source_dir)
|
212
|
+
|
213
|
+
puts "Building all modules in #{source_dir.inspect}"
|
214
|
+
module_tars = build_modules_in_dir(source_dir)
|
191
215
|
require 'bolt_spec/run'
|
192
216
|
include BoltSpec::Run
|
193
|
-
puts "\nInstalling"
|
194
217
|
module_tars.each do |module_tar|
|
218
|
+
puts "Installing '#{module_tar}'"
|
195
219
|
target_nodes.each do |target_node_name|
|
196
220
|
install_module(inventory_hash, target_node_name, module_tar, args[:module_repository])
|
221
|
+
puts "Installed '#{module_tar}' on #{target_node_name}"
|
197
222
|
end
|
198
223
|
end
|
199
224
|
end
|
200
225
|
|
201
|
-
#
|
226
|
+
# Uninstall the puppet module under test on a collection of nodes
|
202
227
|
#
|
203
|
-
# @param :target_node_name [Array] nodes on which to
|
204
|
-
|
205
|
-
|
228
|
+
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
229
|
+
# @param :module_name [String] module name to be uninstalled
|
230
|
+
desc 'uninstall a specific module'
|
231
|
+
task :uninstall_module, [:target_node_name, :module_name] do |_task, args|
|
206
232
|
inventory_hash = inventory_hash_from_inventory_file
|
207
233
|
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
208
234
|
if target_nodes.empty?
|
209
235
|
puts 'No targets found'
|
210
236
|
exit 0
|
211
237
|
end
|
212
|
-
|
238
|
+
|
239
|
+
result = uninstall_module(inventory_hash, args[:target_node_name], args[:module_name])
|
240
|
+
|
241
|
+
raise "Failed trying to run 'puppet module uninstall #{module_name}' against inventory." unless result.is_a?(Array)
|
242
|
+
|
243
|
+
result.each do |node|
|
244
|
+
puts "#{node['target']} failed #{node['value']}" if node['status'] != 'success'
|
245
|
+
end
|
246
|
+
|
247
|
+
puts 'Uninstalled'
|
213
248
|
end
|
214
249
|
|
215
|
-
#
|
250
|
+
# Reinstall the puppet module under test on a collection of nodes
|
216
251
|
#
|
217
252
|
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
218
|
-
desc '
|
219
|
-
task :
|
220
|
-
args.with_defaults(target_node_name: nil, module_repository:
|
253
|
+
desc 'reinstall the module under test'
|
254
|
+
task :reinstall_module, [:target_node_name, :module_repository] do |_task, args|
|
255
|
+
args.with_defaults(target_node_name: nil, module_repository: nil)
|
256
|
+
Rake::Task['litmus:uninstall_module'].invoke(args[:target_node_name])
|
257
|
+
Rake::Task['litmus:install_module'].invoke(args[:target_node_name], args[:module_repository])
|
258
|
+
end
|
259
|
+
|
260
|
+
# Check that the nodes in the inventory are still contactable
|
261
|
+
#
|
262
|
+
# @param :target_node_name [Array] nodes on which to check connnectivity
|
263
|
+
desc 'check the connectivity to all provisioned targets'
|
264
|
+
task :check_connectivity, [:target_node_name] do |_task, args|
|
221
265
|
inventory_hash = inventory_hash_from_inventory_file
|
222
266
|
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
223
267
|
if target_nodes.empty?
|
224
268
|
puts 'No targets found'
|
225
269
|
exit 0
|
226
270
|
end
|
227
|
-
|
228
|
-
module_tar = build_module
|
229
|
-
puts 'Built'
|
230
|
-
|
231
|
-
# module_tar = Dir.glob('pkg/*.tar.gz').max_by { |f| File.mtime(f) }
|
232
|
-
raise "Unable to find package in 'pkg/*.tar.gz'" if module_tar.nil?
|
233
|
-
|
234
|
-
install_module(inventory_hash, args[:target_node_name], module_tar, args[:module_repository])
|
235
|
-
|
236
|
-
puts 'Installed'
|
271
|
+
check_connectivity?(inventory_hash, args[:target_node_name])
|
237
272
|
end
|
238
273
|
|
239
274
|
# Provision a list of machines, install a puppet agent, and install the puppet module under test on a collection of nodes
|
240
275
|
#
|
241
276
|
# @param :key [String] key that maps to a value for a provisioner and an image to be used for each OS provisioned.
|
242
277
|
# @param :collection [String] parameters to pass to the puppet agent install command.
|
243
|
-
desc '
|
278
|
+
desc 'provision a list of machines, install an agent, and the module.'
|
244
279
|
task :provision_install, [:key, :collection, :module_repository] do |_task, args|
|
245
|
-
args.with_defaults(module_repository:
|
280
|
+
args.with_defaults(module_repository: nil)
|
246
281
|
Rake::Task['spec_prep'].invoke
|
247
282
|
Rake::Task['litmus:provision_list'].invoke(args[:key])
|
248
283
|
Rake::Task['litmus:install_agent'].invoke(args[:collection])
|
@@ -252,7 +287,7 @@ namespace :litmus do
|
|
252
287
|
# Decommissions test machines.
|
253
288
|
#
|
254
289
|
# @param :target [Array] nodes to remove from test environemnt and decommission.
|
255
|
-
desc '
|
290
|
+
desc 'destroy provisioned targets'
|
256
291
|
task :tear_down, [:target] do |_task, args|
|
257
292
|
inventory_hash = inventory_hash_from_inventory_file
|
258
293
|
targets = find_targets(inventory_hash, args[:target])
|
@@ -278,40 +313,6 @@ namespace :litmus do
|
|
278
313
|
end
|
279
314
|
end
|
280
315
|
|
281
|
-
# Uninstall the puppet module under test on a collection of nodes
|
282
|
-
#
|
283
|
-
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
284
|
-
# @param :module_name [String] module name to be uninstalled
|
285
|
-
desc 'uninstall_module - uninstall module'
|
286
|
-
task :uninstall_module, [:target_node_name, :module_name] do |_task, args|
|
287
|
-
inventory_hash = inventory_hash_from_inventory_file
|
288
|
-
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
289
|
-
if target_nodes.empty?
|
290
|
-
puts 'No targets found'
|
291
|
-
exit 0
|
292
|
-
end
|
293
|
-
|
294
|
-
result = uninstall_module(inventory_hash, args[:target_node_name], args[:module_name])
|
295
|
-
|
296
|
-
raise "Failed trying to run 'puppet module uninstall #{module_name}' against inventory." unless result.is_a?(Array)
|
297
|
-
|
298
|
-
result.each do |node|
|
299
|
-
puts "#{node['target']} failed #{node['value']}" if node['status'] != 'success'
|
300
|
-
end
|
301
|
-
|
302
|
-
puts 'Uninstalled'
|
303
|
-
end
|
304
|
-
|
305
|
-
# Reinstall the puppet module under test on a collection of nodes
|
306
|
-
#
|
307
|
-
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
308
|
-
desc 'reinstall_module - reinstall module'
|
309
|
-
task :reinstall_module, [:target_node_name, :module_repository] do |_task, args|
|
310
|
-
args.with_defaults(target_node_name: nil, module_repository: 'https://forgeapi.puppetlabs.com')
|
311
|
-
Rake::Task['litmus:uninstall_module'].invoke(args[:target_node_name])
|
312
|
-
Rake::Task['litmus:install_module'].invoke(args[:target_node_name], args[:module_repository])
|
313
|
-
end
|
314
|
-
|
315
316
|
namespace :acceptance do
|
316
317
|
require 'rspec/core/rake_task'
|
317
318
|
if File.file?('inventory.yaml')
|
@@ -100,20 +100,20 @@ RSpec.describe PuppetLitmus::RakeHelper do
|
|
100
100
|
[{ 'name' => 'ssh_nodes', 'targets' =>
|
101
101
|
[{ 'uri' => 'some.host', 'facts' => { 'provisioner' => 'docker', 'container_name' => 'foo', 'platform' => 'some.host' } }] }] }
|
102
102
|
end
|
103
|
-
let(:module_tar) { '
|
103
|
+
let(:module_tar) { 'foo.tar.gz' }
|
104
104
|
let(:targets) { ['some.host'] }
|
105
105
|
let(:uninstall_module_command) { 'puppet module uninstall foo --force' }
|
106
|
-
let(:install_module_command) { "puppet module install --module_repository 'https://forgeapi.
|
106
|
+
let(:install_module_command) { "puppet module install --module_repository 'https://forgeapi.example.com' #{module_tar}" }
|
107
107
|
|
108
108
|
it 'calls function' do
|
109
109
|
allow_any_instance_of(BoltSpec::Run).to receive(:upload_file).with(module_tar, module_tar, targets, options: {}, config: nil, inventory: inventory_hash).and_return([])
|
110
110
|
allow(File).to receive(:exist?).with(File.join(Dir.pwd, 'metadata.json')).and_return(true)
|
111
111
|
allow(File).to receive(:read).with(File.join(Dir.pwd, 'metadata.json')).and_return(JSON.dump({ name: 'foo' }))
|
112
|
-
allow(Open3).to receive(:capture3).with("bundle exec bolt file upload \"#{module_tar}\"
|
112
|
+
allow(Open3).to receive(:capture3).with("bundle exec bolt file upload \"#{module_tar}\" #{File.basename(module_tar)} --targets all --inventoryfile inventory.yaml")
|
113
113
|
.and_return(['success', '', 0])
|
114
114
|
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(uninstall_module_command, targets, config: nil, inventory: inventory_hash).and_return([])
|
115
115
|
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(install_module_command, targets, config: nil, inventory: inventory_hash).and_return([])
|
116
|
-
install_module(inventory_hash, nil, module_tar)
|
116
|
+
install_module(inventory_hash, nil, module_tar, 'https://forgeapi.example.com')
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -28,8 +28,8 @@ describe 'litmus rake tasks' do
|
|
28
28
|
|
29
29
|
context 'with litmus:install_modules_from_directory' do
|
30
30
|
let(:inventory_hash) { { 'groups' => [{ 'name' => 'ssh_nodes', 'nodes' => [{ 'uri' => 'some.host' }] }] } }
|
31
|
-
let(:
|
32
|
-
let(:dummy_tar) {
|
31
|
+
let(:target_dir) { File.join(Dir.pwd, 'spec/fixtures/modules') }
|
32
|
+
let(:dummy_tar) { 'spec/data/doot.tar.gz' }
|
33
33
|
|
34
34
|
it 'happy path' do
|
35
35
|
allow(File).to receive(:exist?).with(File.join(Dir.pwd, 'metadata.json')).and_return(true)
|
@@ -37,12 +37,13 @@ describe 'litmus rake tasks' do
|
|
37
37
|
|
38
38
|
stub_const('ENV', ENV.to_hash.merge('TARGET_HOST' => 'some.host'))
|
39
39
|
expect_any_instance_of(PuppetLitmus::InventoryManipulation).to receive(:inventory_hash_from_inventory_file).and_return(inventory_hash)
|
40
|
-
expect(File).to receive(:directory?).with(
|
41
|
-
expect_any_instance_of(Object).to receive(:
|
42
|
-
expect(STDOUT).to receive(:puts).with('Building')
|
40
|
+
expect(File).to receive(:directory?).with(target_dir).and_return(true)
|
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'))
|
43
43
|
expect_any_instance_of(Object).to receive(:upload_file).once.and_return([])
|
44
|
-
expect(STDOUT).to receive(:puts).with(
|
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
47
|
Rake::Task['litmus:install_modules_from_directory'].invoke('./spec/fixtures/modules')
|
47
48
|
end
|
48
49
|
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
|
+
version: 0.18.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bolt
|
@@ -34,16 +34,22 @@ dependencies:
|
|
34
34
|
name: puppet-modulebuilder
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.2.1
|
40
|
+
- - "<"
|
38
41
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
42
|
+
version: 1.0.0
|
40
43
|
type: :runtime
|
41
44
|
prerelease: false
|
42
45
|
version_requirements: !ruby/object:Gem::Requirement
|
43
46
|
requirements:
|
44
|
-
- - "
|
47
|
+
- - ">="
|
45
48
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
49
|
+
version: 0.2.1
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.0.0
|
47
53
|
- !ruby/object:Gem::Dependency
|
48
54
|
name: tty-spinner
|
49
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -233,13 +239,13 @@ specification_version: 4
|
|
233
239
|
summary: Providing a simple command line tool for puppet content creators, to enable
|
234
240
|
simple and complex test deployments.
|
235
241
|
test_files:
|
236
|
-
- spec/
|
237
|
-
- spec/
|
238
|
-
- spec/
|
242
|
+
- spec/data/doot.tar.gz
|
243
|
+
- spec/data/inventory.yaml
|
244
|
+
- spec/data/jim.yaml
|
239
245
|
- spec/lib/puppet_litmus/util_spec.rb
|
246
|
+
- spec/lib/puppet_litmus/version_spec.rb
|
240
247
|
- spec/lib/puppet_litmus/inventory_manipulation_spec.rb
|
241
|
-
- spec/lib/puppet_litmus/rake_helper_spec.rb
|
242
248
|
- spec/lib/puppet_litmus/puppet_helpers_spec.rb
|
243
|
-
- spec/
|
244
|
-
- spec/
|
245
|
-
- spec/
|
249
|
+
- spec/lib/puppet_litmus/rake_helper_spec.rb
|
250
|
+
- spec/lib/puppet_litmus/rake_tasks_spec.rb
|
251
|
+
- spec/spec_helper.rb
|