puppet_litmus 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/puppet_litmus.rb +3 -0
- data/lib/puppet_litmus/inventory_manipulation.rb +3 -1
- data/lib/puppet_litmus/puppet_helpers.rb +14 -13
- data/lib/puppet_litmus/rake_helper.rb +210 -0
- data/lib/puppet_litmus/rake_tasks.rb +83 -165
- data/lib/puppet_litmus/spec_helper_acceptance.rb +90 -0
- data/lib/puppet_litmus/version.rb +1 -1
- data/spec/lib/puppet_litmus/puppet_helpers_spec.rb +1 -1
- data/spec/lib/puppet_litmus/rake_helper_spec.rb +112 -0
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fc34d2ba2485c4d4e6cedecc99642a4f1acf98c0861598af4f63b732b1de088
|
4
|
+
data.tar.gz: 12cc1dec19bf0ef86b9941870939d0bf2b9cc6251495543be40a33481e747be7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c1532fb9b58f22974322d139e0775b4821993b5bb03748d7dbff4b1704ea4b400e80e755225a9a410ae7f96c0d1489c59f58bf988923a612c26e8f190c78718
|
7
|
+
data.tar.gz: d88135655e933a2ce8da0b4edf552fca12a85ed552a3d02338e61538d80686b6333eee5ba3411071a41e0459a2437337a9687d471ed99972ab4234203f15c6c0
|
data/lib/puppet_litmus.rb
CHANGED
@@ -6,10 +6,13 @@ module PuppetLitmus; end
|
|
6
6
|
require 'bolt_spec/run'
|
7
7
|
require 'puppet_litmus/inventory_manipulation'
|
8
8
|
require 'puppet_litmus/puppet_helpers'
|
9
|
+
require 'puppet_litmus/rake_helper'
|
10
|
+
require 'puppet_litmus/spec_helper_acceptance'
|
9
11
|
|
10
12
|
# Helper methods for testing puppet content
|
11
13
|
module PuppetLitmus
|
12
14
|
include BoltSpec::Run
|
13
15
|
include PuppetLitmus::InventoryManipulation
|
14
16
|
include PuppetLitmus::PuppetHelpers
|
17
|
+
include PuppetLitmus::RakeHelper
|
15
18
|
end
|
@@ -7,6 +7,7 @@ module PuppetLitmus::InventoryManipulation
|
|
7
7
|
# @param inventory_full_path [String] path to the inventory.yaml file
|
8
8
|
# @return [Hash] hash of the inventory.yaml file.
|
9
9
|
def inventory_hash_from_inventory_file(inventory_full_path = nil)
|
10
|
+
require 'yaml'
|
10
11
|
inventory_full_path = if inventory_full_path.nil?
|
11
12
|
'inventory.yaml'
|
12
13
|
else
|
@@ -44,6 +45,7 @@ module PuppetLitmus::InventoryManipulation
|
|
44
45
|
# @param targets [Array]
|
45
46
|
# @return [Array] array of targets.
|
46
47
|
def find_targets(inventory_hash, targets)
|
48
|
+
require 'bolt/inventory'
|
47
49
|
if targets.nil?
|
48
50
|
inventory = Bolt::Inventory.new(inventory_hash, nil)
|
49
51
|
targets = inventory.node_names.to_a
|
@@ -250,6 +252,6 @@ module PuppetLitmus::InventoryManipulation
|
|
250
252
|
# @param inventory_hash [Hash] hash of the inventory.yaml file
|
251
253
|
# @return inventory.yaml file with feature added to group.
|
252
254
|
def write_to_inventory_file(inventory_hash, inventory_full_path)
|
253
|
-
File.open(inventory_full_path, '
|
255
|
+
File.open(inventory_full_path, 'wb+') { |f| f.write(inventory_hash.to_yaml) }
|
254
256
|
end
|
255
257
|
end
|
@@ -130,6 +130,7 @@ module PuppetLitmus::PuppetHelpers
|
|
130
130
|
raise "shell failed\n`#{command_to_run}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
131
131
|
|
132
132
|
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
133
|
+
exit_status: result.first['result']['exit_code'],
|
133
134
|
stdout: result.first['result']['stdout'],
|
134
135
|
stderr: result.first['result']['stderr'])
|
135
136
|
yield result if block_given?
|
@@ -266,13 +267,13 @@ module PuppetLitmus::PuppetHelpers
|
|
266
267
|
# @param command [String] The puppet command causing the error.
|
267
268
|
# @param result [Array] The result struct containing the result
|
268
269
|
def report_puppet_apply_error(command, result, acceptable_exit_codes)
|
269
|
-
puppet_apply_error =
|
270
|
-
apply manifest failed
|
271
|
-
`#{command}`
|
272
|
-
with exit code #{result.first['result']['exit_code']} (expected: #{acceptable_exit_codes})
|
273
|
-
====== Start output of failed Puppet apply ======
|
274
|
-
#{puppet_output(result)}
|
275
|
-
====== End output of failed Puppet apply ======
|
270
|
+
puppet_apply_error = <<~ERROR
|
271
|
+
apply manifest failed
|
272
|
+
`#{command}`
|
273
|
+
with exit code #{result.first['result']['exit_code']} (expected: #{acceptable_exit_codes})
|
274
|
+
====== Start output of failed Puppet apply ======
|
275
|
+
#{puppet_output(result)}
|
276
|
+
====== End output of failed Puppet apply ======
|
276
277
|
ERROR
|
277
278
|
raise puppet_apply_error
|
278
279
|
end
|
@@ -282,12 +283,12 @@ with exit code #{result.first['result']['exit_code']} (expected: #{acceptable_ex
|
|
282
283
|
# @param command [String] The puppet command causing the error.
|
283
284
|
# @param result [Array] The result struct containing the result
|
284
285
|
def report_puppet_apply_change(command, result)
|
285
|
-
puppet_apply_changes =
|
286
|
-
apply manifest expected no changes
|
287
|
-
`#{command}`
|
288
|
-
====== Start output of Puppet apply with unexpected changes ======
|
289
|
-
#{puppet_output(result)}
|
290
|
-
====== End output of Puppet apply with unexpected changes ======
|
286
|
+
puppet_apply_changes = <<~ERROR
|
287
|
+
apply manifest expected no changes
|
288
|
+
`#{command}`
|
289
|
+
====== Start output of Puppet apply with unexpected changes ======
|
290
|
+
#{puppet_output(result)}
|
291
|
+
====== End output of Puppet apply with unexpected changes ======
|
291
292
|
ERROR
|
292
293
|
raise puppet_apply_changes
|
293
294
|
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PuppetLitmus; end # rubocop:disable Style/Documentation
|
4
|
+
|
5
|
+
# helper methods for the litmus rake tasks
|
6
|
+
module PuppetLitmus::RakeHelper
|
7
|
+
DEFAULT_CONFIG_DATA ||= { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }.freeze
|
8
|
+
VALID_PROVISIONERS ||= %w[abs docker docker_exp vagrant vmpooler].freeze
|
9
|
+
|
10
|
+
# Gets a string representing the operating system and version.
|
11
|
+
#
|
12
|
+
# @param metadata [Hash] metadata to parse for operating system info
|
13
|
+
# @return [String] the operating system string with version info for use in provisioning.
|
14
|
+
def get_metadata_operating_systems(metadata)
|
15
|
+
return unless metadata.is_a?(Hash)
|
16
|
+
return unless metadata['operatingsystem_support'].is_a?(Array)
|
17
|
+
|
18
|
+
metadata['operatingsystem_support'].each do |os_info|
|
19
|
+
next unless os_info['operatingsystem'] && os_info['operatingsystemrelease']
|
20
|
+
|
21
|
+
os_name = case os_info['operatingsystem']
|
22
|
+
when 'Amazon', 'Archlinux', 'AIX', 'OSX'
|
23
|
+
next
|
24
|
+
when 'OracleLinux'
|
25
|
+
'oracle'
|
26
|
+
when 'Windows'
|
27
|
+
'win'
|
28
|
+
else
|
29
|
+
os_info['operatingsystem'].downcase
|
30
|
+
end
|
31
|
+
|
32
|
+
os_info['operatingsystemrelease'].each do |release|
|
33
|
+
version = case os_name
|
34
|
+
when 'ubuntu', 'osx'
|
35
|
+
release.sub('.', '')
|
36
|
+
when 'sles'
|
37
|
+
release.gsub(%r{ SP[14]}, '')
|
38
|
+
when 'win'
|
39
|
+
release = release.delete('.') if release.include? '8.1'
|
40
|
+
release.sub('Server', '').sub('10', '10-pro')
|
41
|
+
else
|
42
|
+
release
|
43
|
+
end
|
44
|
+
|
45
|
+
yield "#{os_name}-#{version.downcase}-x86_64".delete(' ')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Executes a command on the test runner.
|
51
|
+
#
|
52
|
+
# @param command [String] command to execute.
|
53
|
+
# @return [Object] the standard out stream.
|
54
|
+
def run_local_command(command)
|
55
|
+
require 'open3'
|
56
|
+
stdout, stderr, status = Open3.capture3(command)
|
57
|
+
error_message = "Attempted to run\ncommand:'#{command}'\nstdout:#{stdout}\nstderr:#{stderr}"
|
58
|
+
raise error_message unless status.to_i.zero?
|
59
|
+
|
60
|
+
stdout
|
61
|
+
end
|
62
|
+
|
63
|
+
# Builds all the modules in a specified module
|
64
|
+
#
|
65
|
+
# @param source_folder [String] the folder to get the modules from
|
66
|
+
# @return [Array] an array of module tar's
|
67
|
+
def build_modules_in_folder(source_folder)
|
68
|
+
folder_list = Dir.entries(source_folder).reject { |f| File.directory? f }
|
69
|
+
module_tars = []
|
70
|
+
folder_list.each do |folder|
|
71
|
+
file = File.new(File.join(source_folder, folder))
|
72
|
+
next if File.symlink?(file)
|
73
|
+
|
74
|
+
opts = {}
|
75
|
+
opts[:module_dir] = file.path
|
76
|
+
opts[:'target-dir'] = File.join(Dir.pwd, 'pkg')
|
77
|
+
opts[:force] = true
|
78
|
+
# remove old build folder if exists, before we build afresh
|
79
|
+
FileUtils.rm_rf(builder.build_dir) if File.directory?(builder.build_dir)
|
80
|
+
|
81
|
+
# build_module
|
82
|
+
module_tar = build_module(opts)
|
83
|
+
module_tars.push(File.new(module_tar))
|
84
|
+
end
|
85
|
+
module_tars
|
86
|
+
end
|
87
|
+
|
88
|
+
def provision(provisioner, platform, inventory_vars)
|
89
|
+
require 'bolt_spec/run'
|
90
|
+
include BoltSpec::Run
|
91
|
+
raise "the provision module was not found in #{DEFAULT_CONFIG_DATA['modulepath']}, please amend the .fixtures.yml file" unless
|
92
|
+
File.directory?(File.join(DEFAULT_CONFIG_DATA['modulepath'], 'provision'))
|
93
|
+
|
94
|
+
unless VALID_PROVISIONERS.include?(provisioner)
|
95
|
+
raise "Unknown provisioner '#{provisioner}', try #{VALID_PROVISIONERS.join('/')}"
|
96
|
+
end
|
97
|
+
|
98
|
+
params = if inventory_vars.nil?
|
99
|
+
{ 'action' => 'provision', 'platform' => platform, 'inventory' => Dir.pwd }
|
100
|
+
else
|
101
|
+
{ 'action' => 'provision', 'platform' => platform, 'inventory' => Dir.pwd, 'vars' => inventory_vars }
|
102
|
+
end
|
103
|
+
run_task("provision::#{provisioner}", 'localhost', params, config: DEFAULT_CONFIG_DATA, inventory: nil)
|
104
|
+
end
|
105
|
+
|
106
|
+
def provision_list(provision_hash, key)
|
107
|
+
provisioner = provision_hash[key]['provisioner']
|
108
|
+
inventory_vars = provision_hash[key]['vars']
|
109
|
+
# Splat the params into environment variables to pass to the provision task but only in this runspace
|
110
|
+
provision_hash[key]['params']&.each { |k, value| ENV[k.upcase] = value.to_s }
|
111
|
+
results = []
|
112
|
+
provision_hash[key]['images'].each do |image|
|
113
|
+
results << provision(provisioner, image, inventory_vars)
|
114
|
+
end
|
115
|
+
results
|
116
|
+
end
|
117
|
+
|
118
|
+
def tear_down_nodes(targets, inventory_hash)
|
119
|
+
require 'bolt_spec/run'
|
120
|
+
include BoltSpec::Run
|
121
|
+
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
122
|
+
raise "the provision module was not found in #{config_data['modulepath']}, please amend the .fixtures.yml file" unless File.directory?(File.join(config_data['modulepath'], 'provision'))
|
123
|
+
|
124
|
+
results = {}
|
125
|
+
targets.each do |node_name|
|
126
|
+
next if node_name == 'litmus_localhost'
|
127
|
+
|
128
|
+
result = tear_down(node_name, inventory_hash)
|
129
|
+
results[node_name] = result unless result == []
|
130
|
+
end
|
131
|
+
results
|
132
|
+
end
|
133
|
+
|
134
|
+
def tear_down(node_name, inventory_hash)
|
135
|
+
# how do we know what provisioner to use
|
136
|
+
node_facts = facts_from_node(inventory_hash, node_name)
|
137
|
+
return [] unless VALID_PROVISIONERS.include?(node_facts['provisioner'])
|
138
|
+
|
139
|
+
params = { 'action' => 'tear_down', 'node_name' => node_name, 'inventory' => Dir.pwd }
|
140
|
+
run_task("provision::#{node_facts['provisioner']}", 'localhost', params, config: DEFAULT_CONFIG_DATA, inventory: nil)
|
141
|
+
end
|
142
|
+
|
143
|
+
def install_agent(collection, targets, inventory_hash)
|
144
|
+
require 'bolt_spec/run'
|
145
|
+
include BoltSpec::Run
|
146
|
+
params = if collection.nil?
|
147
|
+
{}
|
148
|
+
else
|
149
|
+
{ 'collection' => collection }
|
150
|
+
end
|
151
|
+
raise "puppet_agent was not found in #{DEFAULT_CONFIG_DATA['modulepath']}, please amend the .fixtures.yml file" unless File.directory?(File.join(DEFAULT_CONFIG_DATA['modulepath'], 'puppet_agent'))
|
152
|
+
|
153
|
+
run_task('puppet_agent::install', targets, params, config: DEFAULT_CONFIG_DATA, inventory: inventory_hash)
|
154
|
+
end
|
155
|
+
|
156
|
+
def configure_path(inventory_hash)
|
157
|
+
results = []
|
158
|
+
# fix the path on ssh_nodes
|
159
|
+
unless inventory_hash['groups'].select { |group| group['name'] == 'ssh_nodes' }.size.zero?
|
160
|
+
results = run_command('echo PATH="$PATH:/opt/puppetlabs/puppet/bin" > /etc/environment',
|
161
|
+
'ssh_nodes', config: nil, inventory: inventory_hash)
|
162
|
+
end
|
163
|
+
results
|
164
|
+
end
|
165
|
+
|
166
|
+
def build_module(opts)
|
167
|
+
# old cli_way
|
168
|
+
# pdk_build_command = 'bundle exec pdk build --force'
|
169
|
+
# stdout, stderr, _status = Open3.capture3(pdk_build_command)
|
170
|
+
# raise "Failed to run 'pdk_build_command',#{stdout} and #{stderr}" if (stderr =~ %r{completed successfully}).nil?
|
171
|
+
require 'pdk/module/build'
|
172
|
+
require 'pdk/util'
|
173
|
+
|
174
|
+
builder = PDK::Module::Build.new(opts)
|
175
|
+
builder.build
|
176
|
+
end
|
177
|
+
|
178
|
+
def install_module(inventory_hash, target_node_name, module_tar)
|
179
|
+
require 'bolt_spec/run'
|
180
|
+
include BoltSpec::Run
|
181
|
+
target_nodes = find_targets(inventory_hash, target_node_name)
|
182
|
+
target_string = if target_node_name.nil?
|
183
|
+
'all'
|
184
|
+
else
|
185
|
+
target_node_name
|
186
|
+
end
|
187
|
+
run_local_command("bundle exec bolt file upload \"#{module_tar}\" /tmp/#{File.basename(module_tar)} --nodes #{target_string} --inventoryfile inventory.yaml")
|
188
|
+
install_module_command = "puppet module install /tmp/#{File.basename(module_tar)}"
|
189
|
+
run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash)
|
190
|
+
end
|
191
|
+
|
192
|
+
def metadata_module_name
|
193
|
+
require 'json'
|
194
|
+
raise 'Could not find metadata.json' unless File.exist?(File.join(Dir.pwd, 'metadata.json'))
|
195
|
+
|
196
|
+
metadata = JSON.parse(File.read(File.join(Dir.pwd, 'metadata.json')))
|
197
|
+
raise 'Could not read module name from metadata.json' if metadata['name'].nil?
|
198
|
+
|
199
|
+
metadata['name']
|
200
|
+
end
|
201
|
+
|
202
|
+
def uninstall_module(inventory_hash, target_node_name, module_to_remove = nil)
|
203
|
+
require 'bolt_spec/run'
|
204
|
+
include BoltSpec::Run
|
205
|
+
module_name = module_to_remove || metadata_module_name
|
206
|
+
target_nodes = find_targets(inventory_hash, target_node_name)
|
207
|
+
install_module_command = "puppet module uninstall #{module_name}"
|
208
|
+
run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash)
|
209
|
+
end
|
210
|
+
end
|
@@ -1,100 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'rspec/core/rake_task'
|
4
|
-
require 'puppet_litmus'
|
5
|
-
require 'bolt_spec/run'
|
6
|
-
require 'open3'
|
7
|
-
require 'pdk'
|
8
|
-
require 'json'
|
9
|
-
require 'parallel'
|
10
|
-
require 'tty-spinner'
|
11
|
-
|
12
|
-
# helper methods for the litmus rake tasks
|
13
|
-
module LitmusRakeHelper
|
14
|
-
# Gets a string representing the operating system and version.
|
15
|
-
#
|
16
|
-
# @param metadata [Hash] metadata to parse for operating system info
|
17
|
-
# @return [String] the operating system string with version info for use in provisioning.
|
18
|
-
def get_metadata_operating_systems(metadata)
|
19
|
-
return unless metadata.is_a?(Hash)
|
20
|
-
return unless metadata['operatingsystem_support'].is_a?(Array)
|
21
|
-
|
22
|
-
metadata['operatingsystem_support'].each do |os_info|
|
23
|
-
next unless os_info['operatingsystem'] && os_info['operatingsystemrelease']
|
24
|
-
|
25
|
-
os_name = case os_info['operatingsystem']
|
26
|
-
when 'Amazon', 'Archlinux', 'AIX', 'OSX'
|
27
|
-
next
|
28
|
-
when 'OracleLinux'
|
29
|
-
'oracle'
|
30
|
-
when 'Windows'
|
31
|
-
'win'
|
32
|
-
else
|
33
|
-
os_info['operatingsystem'].downcase
|
34
|
-
end
|
35
|
-
|
36
|
-
os_info['operatingsystemrelease'].each do |release|
|
37
|
-
version = case os_name
|
38
|
-
when 'ubuntu', 'osx'
|
39
|
-
release.sub('.', '')
|
40
|
-
when 'sles'
|
41
|
-
release.gsub(%r{ SP[14]}, '')
|
42
|
-
when 'win'
|
43
|
-
release = release.delete('.') if release.include? '8.1'
|
44
|
-
release.sub('Server', '').sub('10', '10-pro')
|
45
|
-
else
|
46
|
-
release
|
47
|
-
end
|
48
|
-
|
49
|
-
yield "#{os_name}-#{version.downcase}-x86_64".delete(' ')
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Executes a command on the test runner.
|
55
|
-
#
|
56
|
-
# @param command [String] command to execute.
|
57
|
-
# @return [Object] the standard out stream.
|
58
|
-
def run_local_command(command)
|
59
|
-
stdout, stderr, status = Open3.capture3(command)
|
60
|
-
error_message = "Attempted to run\ncommand:'#{command}'\nstdout:#{stdout}\nstderr:#{stderr}"
|
61
|
-
raise error_message unless status.to_i.zero?
|
62
|
-
|
63
|
-
stdout
|
64
|
-
end
|
65
|
-
|
66
|
-
# Builds all the modules in a specified module
|
67
|
-
#
|
68
|
-
# @param source_folder [String] the folder to get the modules from
|
69
|
-
# @return [Array] an array of module tar's
|
70
|
-
def build_modules_in_folder(source_folder)
|
71
|
-
require 'pdk/module/build'
|
72
|
-
require 'pdk/util'
|
73
|
-
folder_list = Dir.entries(source_folder).reject { |f| File.directory? f }
|
74
|
-
module_tars = []
|
75
|
-
folder_list.each do |folder|
|
76
|
-
file = File.new(File.join(source_folder, folder))
|
77
|
-
next if File.symlink?(file)
|
78
|
-
|
79
|
-
opts = {}
|
80
|
-
opts[:module_dir] = file.path
|
81
|
-
opts[:'target-dir'] = File.join(Dir.pwd, 'pkg')
|
82
|
-
opts[:force] = true
|
83
|
-
builder = PDK::Module::Build.new(opts)
|
84
|
-
|
85
|
-
# remove old build folder if exists, before we build afresh
|
86
|
-
FileUtils.rm_rf(builder.build_dir) if File.directory?(builder.build_dir)
|
87
|
-
|
88
|
-
# build_module
|
89
|
-
module_tar = builder.build
|
90
|
-
module_tars.push(File.new(module_tar))
|
91
|
-
end
|
92
|
-
module_tars
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
3
|
namespace :litmus do
|
97
|
-
|
4
|
+
require 'puppet_litmus/rake_helper'
|
5
|
+
include PuppetLitmus::RakeHelper
|
98
6
|
# Prints all supported OSes from metadata.json file.
|
99
7
|
desc 'print all supported OSes from metadata'
|
100
8
|
task :metadata do
|
@@ -115,23 +23,43 @@ namespace :litmus do
|
|
115
23
|
provision_hash = YAML.load_file('./provision.yaml')
|
116
24
|
raise "No key #{args[:key]} in ./provision.yaml, see https://github.com/puppetlabs/puppet_litmus/wiki/Overview-of-Litmus#provisioning-via-yaml for examples" if provision_hash[args[:key]].nil?
|
117
25
|
|
26
|
+
Rake::Task['spec_prep'].invoke
|
27
|
+
|
118
28
|
provisioner = provision_hash[args[:key]]['provisioner']
|
119
29
|
inventory_vars = provision_hash[args[:key]]['vars']
|
120
30
|
# Splat the params into environment variables to pass to the provision task but only in this runspace
|
121
|
-
provision_hash[args[:key]]['params']&.each { |
|
31
|
+
provision_hash[args[:key]]['params']&.each { |k, value| ENV[k.upcase] = value.to_s }
|
32
|
+
results = []
|
122
33
|
failed_image_message = ''
|
123
34
|
provision_hash[args[:key]]['images'].each do |image|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
35
|
+
if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
|
36
|
+
progress = Thread.new do
|
37
|
+
loop do
|
38
|
+
printf '.'
|
39
|
+
sleep(10)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
else
|
43
|
+
require 'tty-spinner'
|
44
|
+
spinner = TTY::Spinner.new("Provisioning #{image} using #{provisioner} provisioner.[:spinner]")
|
45
|
+
spinner.auto_spin
|
46
|
+
end
|
47
|
+
result = provision(provisioner, image, inventory_vars)
|
48
|
+
|
49
|
+
if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
|
50
|
+
Thread.kill(progress)
|
130
51
|
else
|
131
|
-
|
52
|
+
spinner.success
|
132
53
|
end
|
133
|
-
|
54
|
+
|
55
|
+
if result.first['status'] != 'success'
|
56
|
+
failed_image_message += "=====\n#{result.first['node']}\n#{result.first['result']['_output']}\n"
|
57
|
+
else
|
58
|
+
STDOUT.puts "#{result.first['result']['node_name']}, #{image}"
|
59
|
+
end
|
60
|
+
results << result
|
134
61
|
end
|
62
|
+
|
135
63
|
raise "Failed to provision with '#{provisioner}'\n #{failed_image_message}" unless failed_image_message.empty?
|
136
64
|
end
|
137
65
|
|
@@ -141,21 +69,7 @@ namespace :litmus do
|
|
141
69
|
# @param :platform [String] OS platform for container or VM to use.
|
142
70
|
desc "provision container/VM - abs/docker/vagrant/vmpooler eg 'bundle exec rake 'litmus:provision[vmpooler, ubuntu-1604-x86_64]'"
|
143
71
|
task :provision, [:provisioner, :platform, :inventory_vars] do |_task, args|
|
144
|
-
include BoltSpec::Run
|
145
72
|
Rake::Task['spec_prep'].invoke
|
146
|
-
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
147
|
-
raise "the provision module was not found in #{config_data['modulepath']}, please amend the .fixtures.yml file" unless File.directory?(File.join(config_data['modulepath'], 'provision'))
|
148
|
-
|
149
|
-
unless %w[abs docker docker_exp vagrant vmpooler].include?(args[:provisioner])
|
150
|
-
raise "Unknown provisioner '#{args[:provisioner]}', try abs/docker/docker_exp/vagrant/vmpooler"
|
151
|
-
end
|
152
|
-
|
153
|
-
params = if args[:inventory_vars].nil?
|
154
|
-
{ 'action' => 'provision', 'platform' => args[:platform], 'inventory' => Dir.pwd }
|
155
|
-
else
|
156
|
-
{ 'action' => 'provision', 'platform' => args[:platform], 'inventory' => Dir.pwd, 'vars' => args[:inventory_vars] }
|
157
|
-
end
|
158
|
-
|
159
73
|
if (ENV['CI'] == 'true') || !ENV['DISTELLI_BUILDNUM'].nil?
|
160
74
|
progress = Thread.new do
|
161
75
|
loop do
|
@@ -164,10 +78,11 @@ namespace :litmus do
|
|
164
78
|
end
|
165
79
|
end
|
166
80
|
else
|
81
|
+
require 'tty-spinner'
|
167
82
|
spinner = TTY::Spinner.new("Provisioning #{args[:platform]} using #{args[:provisioner]} provisioner.[:spinner]")
|
168
83
|
spinner.auto_spin
|
169
84
|
end
|
170
|
-
results =
|
85
|
+
results = provision(args[:provisioner], args[:platform], args[:inventory_vars])
|
171
86
|
if results.first['status'] != 'success'
|
172
87
|
raise "Failed provisioning #{args[:platform]} using #{args[:provisioner]}\n#{results.first}"
|
173
88
|
end
|
@@ -193,17 +108,11 @@ namespace :litmus do
|
|
193
108
|
exit 0
|
194
109
|
end
|
195
110
|
puts 'install_agent'
|
111
|
+
require 'bolt_spec/run'
|
196
112
|
include BoltSpec::Run
|
197
113
|
Rake::Task['spec_prep'].invoke
|
198
|
-
|
199
|
-
|
200
|
-
{}
|
201
|
-
else
|
202
|
-
{ 'collection' => args[:collection] }
|
203
|
-
end
|
204
|
-
raise "puppet_agent was not found in #{config_data['modulepath']}, please amend the .fixtures.yml file" unless File.directory?(File.join(config_data['modulepath'], 'puppet_agent'))
|
205
|
-
|
206
|
-
results = run_task('puppet_agent::install', targets, params, config: config_data, inventory: inventory_hash)
|
114
|
+
|
115
|
+
results = install_agent(args[:collection], targets, inventory_hash)
|
207
116
|
results.each do |result|
|
208
117
|
if result['status'] != 'success'
|
209
118
|
command_to_run = "bolt task run puppet_agent::install --targets #{result['node']} --inventoryfile inventory.yaml --modulepath #{config_data['modulepath']}"
|
@@ -217,10 +126,7 @@ namespace :litmus do
|
|
217
126
|
write_to_inventory_file(inventory_hash, 'inventory.yaml')
|
218
127
|
|
219
128
|
# fix the path on ssh_nodes
|
220
|
-
|
221
|
-
results = run_command('echo PATH="$PATH:/opt/puppetlabs/puppet/bin" > /etc/environment',
|
222
|
-
'ssh_nodes', config: nil, inventory: inventory_hash)
|
223
|
-
end
|
129
|
+
results = configure_path(inventory_hash)
|
224
130
|
|
225
131
|
results.each do |result|
|
226
132
|
if result['status'] != 'success'
|
@@ -253,6 +159,7 @@ namespace :litmus do
|
|
253
159
|
module_tars.each do |module_tar|
|
254
160
|
print "#{File.basename(module_tar)} "
|
255
161
|
end
|
162
|
+
require 'bolt_spec/run'
|
256
163
|
include BoltSpec::Run
|
257
164
|
puts "\nSending"
|
258
165
|
module_tars.each do |module_tar|
|
@@ -279,33 +186,18 @@ namespace :litmus do
|
|
279
186
|
puts 'No targets found'
|
280
187
|
exit 0
|
281
188
|
end
|
282
|
-
include BoltSpec::Run
|
283
|
-
# old cli_way
|
284
|
-
# pdk_build_command = 'bundle exec pdk build --force'
|
285
|
-
# stdout, stderr, _status = Open3.capture3(pdk_build_command)
|
286
|
-
# raise "Failed to run 'pdk_build_command',#{stdout} and #{stderr}" if (stderr =~ %r{completed successfully}).nil?
|
287
|
-
require 'pdk/module/build'
|
288
|
-
require 'pdk/util'
|
289
189
|
|
290
190
|
opts = {}
|
291
191
|
opts[:force] = true
|
292
|
-
|
293
|
-
module_tar = builder.build
|
192
|
+
module_tar = build_module(opts)
|
294
193
|
puts 'Built'
|
295
194
|
|
296
195
|
# module_tar = Dir.glob('pkg/*.tar.gz').max_by { |f| File.mtime(f) }
|
297
196
|
raise "Unable to find package in 'pkg/*.tar.gz'" if module_tar.nil?
|
298
197
|
|
299
|
-
|
300
|
-
'all'
|
301
|
-
else
|
302
|
-
args[:target_node_name]
|
303
|
-
end
|
304
|
-
run_local_command("bundle exec bolt file upload \"#{module_tar}\" /tmp/#{File.basename(module_tar)} --nodes #{target_string} --inventoryfile inventory.yaml")
|
305
|
-
install_module_command = "puppet module install /tmp/#{File.basename(module_tar)}"
|
306
|
-
result = run_command(install_module_command, target_nodes, config: nil, inventory: inventory_hash)
|
198
|
+
result = install_module(inventory_hash, args[:target_node_name], module_tar)
|
307
199
|
|
308
|
-
raise "Failed trying to run '
|
200
|
+
raise "Failed trying to run 'puppet module install /tmp/#{File.basename(module_tar)}' against inventory." unless result.is_a?(Array)
|
309
201
|
|
310
202
|
result.each do |node|
|
311
203
|
puts "#{node['node']} failed #{node['result']}" if node['status'] != 'success'
|
@@ -337,25 +229,14 @@ namespace :litmus do
|
|
337
229
|
puts 'No targets found'
|
338
230
|
exit 0
|
339
231
|
end
|
340
|
-
include BoltSpec::Run
|
341
232
|
Rake::Task['spec_prep'].invoke
|
342
|
-
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
343
|
-
raise "the provision module was not found in #{config_data['modulepath']}, please amend the .fixtures.yml file" unless File.directory?(File.join(config_data['modulepath'], 'provision'))
|
344
|
-
|
345
233
|
bad_results = []
|
346
|
-
targets
|
347
|
-
|
348
|
-
|
349
|
-
# how do we know what provisioner to use
|
350
|
-
node_facts = facts_from_node(inventory_hash, node_name)
|
351
|
-
next unless %w[abs docker docker_exp vagrant vmpooler].include?(node_facts['provisioner'])
|
352
|
-
|
353
|
-
params = { 'action' => 'tear_down', 'node_name' => node_name, 'inventory' => Dir.pwd }
|
354
|
-
result = run_task("provision::#{node_facts['provisioner']}", 'localhost', params, config: config_data, inventory: nil)
|
234
|
+
results = tear_down_nodes(targets, inventory_hash)
|
235
|
+
results.each do |node, result|
|
355
236
|
if result.first['status'] != 'success'
|
356
|
-
bad_results << "#{
|
237
|
+
bad_results << "#{node}, #{result.first['result']['_error']['msg']}"
|
357
238
|
else
|
358
|
-
|
239
|
+
puts "#{node}: #{result.first['status']}"
|
359
240
|
end
|
360
241
|
end
|
361
242
|
puts ''
|
@@ -366,9 +247,44 @@ namespace :litmus do
|
|
366
247
|
end
|
367
248
|
end
|
368
249
|
|
250
|
+
# Uninstall the puppet module under test on a collection of nodes
|
251
|
+
#
|
252
|
+
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
253
|
+
# @param :module_name [String] module name to be uninstalled
|
254
|
+
desc 'uninstall_module - uninstall module'
|
255
|
+
task :uninstall_module, [:target_node_name, :module_name] do |_task, args|
|
256
|
+
inventory_hash = inventory_hash_from_inventory_file
|
257
|
+
target_nodes = find_targets(inventory_hash, args[:target_node_name])
|
258
|
+
if target_nodes.empty?
|
259
|
+
puts 'No targets found'
|
260
|
+
exit 0
|
261
|
+
end
|
262
|
+
|
263
|
+
result = uninstall_module(inventory_hash, args[:target_node_name], args[:module_name])
|
264
|
+
|
265
|
+
raise "Failed trying to run 'puppet module uninstall #{module_name}' against inventory." unless result.is_a?(Array)
|
266
|
+
|
267
|
+
result.each do |node|
|
268
|
+
puts "#{node['node']} failed #{node['result']}" if node['status'] != 'success'
|
269
|
+
end
|
270
|
+
|
271
|
+
puts 'Uninstalled'
|
272
|
+
end
|
273
|
+
|
274
|
+
# Reinstall the puppet module under test on a collection of nodes
|
275
|
+
#
|
276
|
+
# @param :target_node_name [Array] nodes on which to install a puppet module for testing.
|
277
|
+
desc 'reinstall_module - reinstall module'
|
278
|
+
task :reinstall_module, [:target_node_name] do |_task, args|
|
279
|
+
Rake::Task['litmus:uninstall_module'].invoke(args[:target_node_name])
|
280
|
+
Rake::Task['litmus:install_module'].invoke(args[:target_node_name])
|
281
|
+
end
|
282
|
+
|
369
283
|
namespace :acceptance do
|
370
|
-
|
284
|
+
require 'rspec/core/rake_task'
|
371
285
|
if File.file?('inventory.yaml')
|
286
|
+
require 'puppet_litmus/inventory_manipulation'
|
287
|
+
include PuppetLitmus::InventoryManipulation
|
372
288
|
inventory_hash = inventory_hash_from_inventory_file
|
373
289
|
targets = find_targets(inventory_hash, nil)
|
374
290
|
|
@@ -406,6 +322,7 @@ namespace :litmus do
|
|
406
322
|
end
|
407
323
|
end
|
408
324
|
|
325
|
+
require 'parallel'
|
409
326
|
results = Parallel.map(payloads) do |title, test, options|
|
410
327
|
env = options[:env].nil? ? {} : options[:env]
|
411
328
|
stdout, stderr, status = Open3.capture3(env, test)
|
@@ -421,6 +338,7 @@ namespace :litmus do
|
|
421
338
|
end
|
422
339
|
Thread.kill(progress)
|
423
340
|
else
|
341
|
+
require 'tty-spinner'
|
424
342
|
spinners = TTY::Spinner::Multi.new("[:spinner] Running against #{targets.size} targets.")
|
425
343
|
payloads.each do |title, test, options|
|
426
344
|
env = options[:env].nil? ? {} : options[:env]
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Helper methods for testing puppet content
|
4
|
+
module PuppetLitmus
|
5
|
+
extend PuppetLitmus::InventoryManipulation
|
6
|
+
|
7
|
+
def self.configure!
|
8
|
+
require 'serverspec'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.include PuppetLitmus
|
12
|
+
end
|
13
|
+
|
14
|
+
if ENV['TARGET_HOST'].nil? || ENV['TARGET_HOST'] == 'localhost'
|
15
|
+
puts 'Running tests against this machine !'
|
16
|
+
if Gem.win_platform?
|
17
|
+
set :backend, :cmd
|
18
|
+
else
|
19
|
+
set :backend, :exec
|
20
|
+
end
|
21
|
+
else
|
22
|
+
# load inventory
|
23
|
+
inventory_hash = inventory_hash_from_inventory_file
|
24
|
+
node_config = config_from_node(inventory_hash, ENV['TARGET_HOST'])
|
25
|
+
|
26
|
+
if target_in_group(inventory_hash, ENV['TARGET_HOST'], 'docker_nodes')
|
27
|
+
host = ENV['TARGET_HOST']
|
28
|
+
set :backend, :docker
|
29
|
+
set :docker_container, host
|
30
|
+
elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'ssh_nodes')
|
31
|
+
set :backend, :ssh
|
32
|
+
options = Net::SSH::Config.for(host)
|
33
|
+
options[:user] = node_config.dig('ssh', 'user') unless node_config.dig('ssh', 'user').nil?
|
34
|
+
options[:port] = node_config.dig('ssh', 'port') unless node_config.dig('ssh', 'port').nil?
|
35
|
+
options[:keys] = node_config.dig('ssh', 'private-key') unless node_config.dig('ssh', 'private-key').nil?
|
36
|
+
options[:password] = node_config.dig('ssh', 'password') unless node_config.dig('ssh', 'password').nil?
|
37
|
+
# Support both net-ssh 4 and 5.
|
38
|
+
# rubocop:disable Metrics/BlockNesting
|
39
|
+
options[:verify_host_key] = if node_config.dig('ssh', 'host-key-check').nil?
|
40
|
+
# Fall back to SSH behavior. This variable will only be set in net-ssh 5.3+.
|
41
|
+
if @strict_host_key_checking.nil? || @strict_host_key_checking
|
42
|
+
Net::SSH::Verifiers::Always.new
|
43
|
+
else
|
44
|
+
# SSH's behavior with StrictHostKeyChecking=no: adds new keys to known_hosts.
|
45
|
+
# If known_hosts points to /dev/null, then equivalent to :never where it
|
46
|
+
# accepts any key beacuse they're all new.
|
47
|
+
Net::SSH::Verifiers::AcceptNewOrLocalTunnel.new
|
48
|
+
end
|
49
|
+
elsif node_config.dig('ssh', 'host-key-check')
|
50
|
+
if defined?(Net::SSH::Verifiers::Always)
|
51
|
+
Net::SSH::Verifiers::Always.new
|
52
|
+
else
|
53
|
+
Net::SSH::Verifiers::Secure.new
|
54
|
+
end
|
55
|
+
elsif defined?(Net::SSH::Verifiers::Never)
|
56
|
+
Net::SSH::Verifiers::Never.new
|
57
|
+
else
|
58
|
+
Net::SSH::Verifiers::Null.new
|
59
|
+
end
|
60
|
+
# rubocop:enable Metrics/BlockNesting
|
61
|
+
host = if ENV['TARGET_HOST'].include?(':')
|
62
|
+
ENV['TARGET_HOST'].split(':').first
|
63
|
+
else
|
64
|
+
ENV['TARGET_HOST']
|
65
|
+
end
|
66
|
+
set :host, options[:host_name] || host
|
67
|
+
set :ssh_options, options
|
68
|
+
set :request_pty, true
|
69
|
+
elsif target_in_group(inventory_hash, ENV['TARGET_HOST'], 'winrm_nodes')
|
70
|
+
require 'winrm'
|
71
|
+
|
72
|
+
set :backend, :winrm
|
73
|
+
set :os, family: 'windows'
|
74
|
+
user = node_config.dig('winrm', 'user') unless node_config.dig('winrm', 'user').nil?
|
75
|
+
pass = node_config.dig('winrm', 'password') unless node_config.dig('winrm', 'password').nil?
|
76
|
+
endpoint = "http://#{ENV['TARGET_HOST']}:5985/wsman"
|
77
|
+
|
78
|
+
opts = {
|
79
|
+
user: user,
|
80
|
+
password: pass,
|
81
|
+
endpoint: endpoint,
|
82
|
+
operation_timeout: 300,
|
83
|
+
}
|
84
|
+
|
85
|
+
winrm = WinRM::Connection.new opts
|
86
|
+
Specinfra.configuration.winrm = winrm
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -87,7 +87,7 @@ RSpec.describe PuppetLitmus::PuppetHelpers do
|
|
87
87
|
|
88
88
|
describe '.run_shell' do
|
89
89
|
let(:command_to_run) { "puts 'doot'" }
|
90
|
-
let(:result) { ['result' => { 'exit_code' => 0, 'stdout' => nil, 'stderr' => nil }] }
|
90
|
+
let(:result) { ['result' => { 'exit_code' => 0, 'exit_status' => 0, 'stdout' => nil, 'stderr' => nil }] }
|
91
91
|
let(:inventory_hash) { { 'groups' => [{ 'name' => 'ssh_nodes', 'nodes' => [{ 'name' => 'some.host' }] }] } }
|
92
92
|
let(:localhost_inventory_hash) { { 'groups' => [{ 'name' => 'local', 'nodes' => [{ 'name' => 'litmus_localhost', 'config' => { 'transport' => 'local' } }] }] } }
|
93
93
|
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
load File.expand_path('../../../lib/puppet_litmus/rake_helper.rb', __dir__)
|
6
|
+
|
7
|
+
RSpec.describe PuppetLitmus::RakeHelper do
|
8
|
+
context 'with provision_list' do
|
9
|
+
let(:provision_hash) { { 'default' => { 'provisioner' => 'docker', 'images' => ['waffleimage/centos7'] } } }
|
10
|
+
let(:results) { [] }
|
11
|
+
|
12
|
+
it 'calls function' do
|
13
|
+
expect(described_class).to receive(:provision).with('docker', 'waffleimage/centos7', nil).and_return(results)
|
14
|
+
described_class.provision_list(provision_hash, 'default')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with provision' do
|
19
|
+
let(:provision_hash) { { 'default' => { 'provisioner' => 'docker', 'images' => ['waffleimage/centos7'] } } }
|
20
|
+
let(:results) { [] }
|
21
|
+
let(:params) { { 'action' => 'provision', 'platform' => 'waffleimage/centos7', 'inventory' => Dir.pwd } }
|
22
|
+
|
23
|
+
it 'calls function' do
|
24
|
+
allow(File).to receive(:directory?).and_call_original
|
25
|
+
allow(File).to receive(:directory?).with(File.join(DEFAULT_CONFIG_DATA['modulepath'], 'provision')).and_return(true)
|
26
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with('provision::docker', 'localhost', params, config: DEFAULT_CONFIG_DATA, inventory: nil).and_return(results)
|
27
|
+
described_class.provision('docker', 'waffleimage/centos7', nil)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with tear_down' do
|
32
|
+
let(:inventory_hash) do
|
33
|
+
{ 'groups' =>
|
34
|
+
[{ 'name' => 'ssh_nodes', 'nodes' =>
|
35
|
+
[{ 'name' => 'some.host', 'facts' => { 'provisioner' => 'docker', 'container_name' => 'foo', 'platform' => 'some.host' } }] }] }
|
36
|
+
end
|
37
|
+
let(:targets) { ['some.host'] }
|
38
|
+
let(:params) { { 'action' => 'tear_down', 'node_name' => 'some.host', 'inventory' => Dir.pwd } }
|
39
|
+
|
40
|
+
it 'calls function' do
|
41
|
+
allow(File).to receive(:directory?).with(File.join(DEFAULT_CONFIG_DATA['modulepath'], 'provision')).and_return(true)
|
42
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with('provision::docker', 'localhost', params, config: DEFAULT_CONFIG_DATA, inventory: nil).and_return([])
|
43
|
+
described_class.tear_down_nodes(targets, inventory_hash)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'with install_agent' do
|
48
|
+
let(:inventory_hash) do
|
49
|
+
{ 'groups' =>
|
50
|
+
[{ 'name' => 'ssh_nodes', 'nodes' =>
|
51
|
+
[{ 'name' => 'some.host', 'facts' => { 'provisioner' => 'docker', 'container_name' => 'foo', 'platform' => 'some.host' } }] }] }
|
52
|
+
end
|
53
|
+
let(:targets) { ['some.host'] }
|
54
|
+
let(:params) { { 'collection' => 'puppet6' } }
|
55
|
+
|
56
|
+
it 'calls function' do
|
57
|
+
allow(File).to receive(:directory?).with(File.join(DEFAULT_CONFIG_DATA['modulepath'], 'puppet_agent')).and_return(true)
|
58
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_task).with('puppet_agent::install', targets, params, config: DEFAULT_CONFIG_DATA, inventory: inventory_hash).and_return([])
|
59
|
+
described_class.install_agent('puppet6', targets, inventory_hash)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'with install_module' do
|
64
|
+
let(:inventory_hash) do
|
65
|
+
{ 'groups' =>
|
66
|
+
[{ 'name' => 'ssh_nodes', 'nodes' =>
|
67
|
+
[{ 'name' => 'some.host', 'facts' => { 'provisioner' => 'docker', 'container_name' => 'foo', 'platform' => 'some.host' } }] }] }
|
68
|
+
end
|
69
|
+
let(:module_tar) { '/tmp/foo.tar.gz' }
|
70
|
+
let(:targets) { ['some.host'] }
|
71
|
+
let(:install_module_command) { "puppet module install /tmp/#{File.basename(module_tar)}" }
|
72
|
+
|
73
|
+
it 'calls function' do
|
74
|
+
allow(Open3).to receive(:capture3).with("bundle exec bolt file upload \"#{module_tar}\" /tmp/#{File.basename(module_tar)} --nodes all --inventoryfile inventory.yaml")
|
75
|
+
.and_return(['success', '', 0])
|
76
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(install_module_command, targets, config: nil, inventory: inventory_hash).and_return([])
|
77
|
+
described_class.install_module(inventory_hash, nil, module_tar)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with uninstall module' do
|
82
|
+
let(:inventory_hash) do
|
83
|
+
{ 'groups' =>
|
84
|
+
[{ 'name' => 'ssh_nodes', 'nodes' =>
|
85
|
+
[{ 'name' => 'some.host', 'facts' => { 'provisioner' => 'docker', 'container_name' => 'foo', 'platform' => 'some.host' } }] }] }
|
86
|
+
end
|
87
|
+
let(:targets) { ['some.host'] }
|
88
|
+
let(:uninstall_module_command) { 'puppet module uninstall foo-bar' }
|
89
|
+
|
90
|
+
it 'uninstalls module' do
|
91
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(uninstall_module_command, targets, config: nil, inventory: inventory_hash).and_return([])
|
92
|
+
expect(described_class).to receive(:metadata_module_name).and_return('foo-bar')
|
93
|
+
described_class.uninstall_module(inventory_hash, nil)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'and custom name' do
|
97
|
+
allow_any_instance_of(BoltSpec::Run).to receive(:run_command).with(uninstall_module_command, targets, config: nil, inventory: inventory_hash).and_return([])
|
98
|
+
described_class.uninstall_module(inventory_hash, nil, 'foo-bar')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'with module name' do
|
103
|
+
let(:metadata) { '{ "name" : "foo-bar" }' }
|
104
|
+
|
105
|
+
it 'reads module name' do
|
106
|
+
allow(File).to receive(:exist?).with(File.join(Dir.pwd, 'metadata.json')).and_return(true)
|
107
|
+
allow(File).to receive(:read).with(File.join(Dir.pwd, 'metadata.json')).and_return(metadata)
|
108
|
+
name = described_class.metadata_module_name
|
109
|
+
expect(name).to eq('foo-bar')
|
110
|
+
end
|
111
|
+
end
|
112
|
+
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: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bolt
|
@@ -90,6 +90,34 @@ dependencies:
|
|
90
90
|
- - "<"
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: 2.0.0
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: parallel
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
type: :runtime
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: rspec
|
109
|
+
requirement: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
type: :runtime
|
115
|
+
prerelease: false
|
116
|
+
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
93
121
|
description: " Providing a simple command line tool for puppet content creators,
|
94
122
|
to enable simple and complex test deployments.\n"
|
95
123
|
email:
|
@@ -103,13 +131,16 @@ files:
|
|
103
131
|
- lib/puppet_litmus.rb
|
104
132
|
- lib/puppet_litmus/inventory_manipulation.rb
|
105
133
|
- lib/puppet_litmus/puppet_helpers.rb
|
134
|
+
- lib/puppet_litmus/rake_helper.rb
|
106
135
|
- lib/puppet_litmus/rake_tasks.rb
|
136
|
+
- lib/puppet_litmus/spec_helper_acceptance.rb
|
107
137
|
- lib/puppet_litmus/version.rb
|
108
138
|
- spec/data/doot.tar.gz
|
109
139
|
- spec/data/inventory.yaml
|
110
140
|
- spec/data/jim.yaml
|
111
141
|
- spec/lib/puppet_litmus/inventory_manipulation_spec.rb
|
112
142
|
- spec/lib/puppet_litmus/puppet_helpers_spec.rb
|
143
|
+
- spec/lib/puppet_litmus/rake_helper_spec.rb
|
113
144
|
- spec/lib/puppet_litmus/rake_tasks_spec.rb
|
114
145
|
- spec/lib/puppet_litmus/version_spec.rb
|
115
146
|
- spec/spec_helper.rb
|
@@ -143,6 +174,7 @@ test_files:
|
|
143
174
|
- spec/data/jim.yaml
|
144
175
|
- spec/lib/puppet_litmus/inventory_manipulation_spec.rb
|
145
176
|
- spec/lib/puppet_litmus/puppet_helpers_spec.rb
|
177
|
+
- spec/lib/puppet_litmus/rake_helper_spec.rb
|
146
178
|
- spec/lib/puppet_litmus/rake_tasks_spec.rb
|
147
179
|
- spec/lib/puppet_litmus/version_spec.rb
|
148
180
|
- spec/spec_helper.rb
|