puppet_litmus 0.7.0 → 0.7.1
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/LICENSE +201 -201
- data/README.md +35 -35
- data/lib/puppet_litmus.rb +15 -15
- data/lib/puppet_litmus/inventory_manipulation.rb +159 -159
- data/lib/puppet_litmus/rake_tasks.rb +445 -445
- data/lib/puppet_litmus/serverspec.rb +203 -189
- data/lib/puppet_litmus/version.rb +6 -6
- data/spec/data/inventory.yaml +16 -16
- data/spec/lib/puppet_litmus/inventory_manipulation_spec.rb +102 -102
- data/spec/lib/puppet_litmus/rake_tasks_spec.rb +55 -55
- data/spec/lib/puppet_litmus/serverspec_spec.rb +196 -150
- data/spec/lib/puppet_litmus/version_spec.rb +10 -10
- data/spec/spec_helper.rb +29 -29
- metadata +3 -3
@@ -1,189 +1,203 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# helper functions for running puppet commands. They execute a target system specified by ENV['TARGET_HOST']
|
4
|
-
# heavily uses functions from here https://github.com/puppetlabs/bolt/blob/master/developer-docs/bolt_spec-run.md
|
5
|
-
module PuppetLitmus::Serverspec
|
6
|
-
# Applies a manifest twice. First checking for errors. Secondly to make sure no changes occur.
|
7
|
-
#
|
8
|
-
# @param manifest [String] puppet manifest code to be applied.
|
9
|
-
# @return [Boolean] The result of the 2 apply manifests.
|
10
|
-
def idempotent_apply(manifest)
|
11
|
-
manifest_file_location = create_manifest_file(manifest)
|
12
|
-
apply_manifest(nil, catch_failures: true, manifest_file_location: manifest_file_location)
|
13
|
-
apply_manifest(nil, catch_changes: true, manifest_file_location: manifest_file_location)
|
14
|
-
end
|
15
|
-
|
16
|
-
# rubocop:disable Layout/TrailingWhitespace
|
17
|
-
|
18
|
-
# Applies a manifest. returning the result of that apply. Mimics the apply_manifest from beaker
|
19
|
-
#
|
20
|
-
# @param manifest [String] puppet manifest code to be applied.
|
21
|
-
# @param opts [Hash] Alters the behaviour of the command. Valid options are:
|
22
|
-
# :catch_changes [Boolean] exit status of 1 if there were changes.
|
23
|
-
# :expect_failures [Boolean] doesnt return an exit code of non-zero if the apply failed.
|
24
|
-
# :manifest_file_location [Path] The place on the target system.
|
25
|
-
# :prefix_command [String] prefixes the puppet apply command; eg "export LANGUAGE='ja'".
|
26
|
-
# :debug [Boolean] run puppet apply with the debug flag.
|
27
|
-
# :noop [Boolean] run puppet apply with the noop flag.
|
28
|
-
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
29
|
-
# @return [Object] A result object from the apply.
|
30
|
-
def apply_manifest(manifest, opts = {})
|
31
|
-
# rubocop:enable Layout/TrailingWhitespace
|
32
|
-
target_node_name = ENV['TARGET_HOST']
|
33
|
-
raise 'manifest and manifest_file_location in the opts hash are mutually exclusive arguments, pick one' if !manifest.nil? && !opts[:manifest_file_location].nil?
|
34
|
-
raise 'please pass a manifest or the manifest_file_location in the opts hash' if (manifest.nil? || manifest == '') && opts[:manifest_file_location].nil?
|
35
|
-
|
36
|
-
manifest_file_location = opts[:manifest_file_location] || create_manifest_file(manifest)
|
37
|
-
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
38
|
-
nil
|
39
|
-
else
|
40
|
-
inventory_hash_from_inventory_file
|
41
|
-
end
|
42
|
-
command_to_run = "#{opts[:prefix_command]} puppet apply #{manifest_file_location}"
|
43
|
-
command_to_run += " --modulepath #{Dir.pwd}/spec/fixtures/modules" if target_node_name.nil? || target_node_name == 'localhost'
|
44
|
-
command_to_run += ' --detailed-exitcodes' if !opts[:catch_changes].nil? && (opts[:catch_changes] == true)
|
45
|
-
command_to_run += ' --debug' if !opts[:debug].nil? && (opts[:debug] == true)
|
46
|
-
command_to_run += ' --noop' if !opts[:noop].nil? && (opts[:noop] == true)
|
47
|
-
result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
48
|
-
|
49
|
-
raise "apply manifest failed\n`#{command_to_run}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
50
|
-
|
51
|
-
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
52
|
-
stdout: result.first['result']['stdout'],
|
53
|
-
stderr: result.first['result']['stderr'])
|
54
|
-
yield result if block_given?
|
55
|
-
result
|
56
|
-
end
|
57
|
-
|
58
|
-
# Creates a manifest file locally in a temp location, if its a remote target copy it to there.
|
59
|
-
#
|
60
|
-
# @param manifest [String] puppet manifest code.
|
61
|
-
# @return [String] The path to the location of the manifest.
|
62
|
-
def create_manifest_file(manifest)
|
63
|
-
require 'tmpdir'
|
64
|
-
target_node_name = ENV['TARGET_HOST']
|
65
|
-
tmp_filename = File.join(Dir.tmpdir, "manifest_#{Time.now.strftime('%Y%m%d')}_#{Process.pid}_#{rand(0x100000000).to_s(36)}.pp")
|
66
|
-
manifest_file = File.open(tmp_filename, 'w')
|
67
|
-
manifest_file.write(manifest)
|
68
|
-
manifest_file.close
|
69
|
-
if target_node_name.nil? || target_node_name == 'localhost'
|
70
|
-
# no need to transfer
|
71
|
-
manifest_file_location = manifest_file.path
|
72
|
-
else
|
73
|
-
# transfer to TARGET_HOST
|
74
|
-
inventory_hash = inventory_hash_from_inventory_file
|
75
|
-
manifest_file_location = "/tmp/#{File.basename(manifest_file)}"
|
76
|
-
result = upload_file(manifest_file.path, manifest_file_location, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
77
|
-
raise result.first['result'].to_s unless result.first['status'] == 'success'
|
78
|
-
end
|
79
|
-
manifest_file_location
|
80
|
-
end
|
81
|
-
|
82
|
-
# Runs a command against the target system
|
83
|
-
#
|
84
|
-
# @param command_to_run [String] The command to execute.
|
85
|
-
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
86
|
-
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
87
|
-
# @return [Object] A result object from the command.
|
88
|
-
def run_shell(command_to_run, opts = {})
|
89
|
-
target_node_name = ENV['TARGET_HOST']
|
90
|
-
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
91
|
-
nil
|
92
|
-
else
|
93
|
-
inventory_hash_from_inventory_file
|
94
|
-
end
|
95
|
-
result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
96
|
-
raise "shell failed\n`#{command_to_run}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
97
|
-
|
98
|
-
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
99
|
-
stdout: result.first['result']['stdout'],
|
100
|
-
stderr: result.first['result']['stderr'])
|
101
|
-
yield result if block_given?
|
102
|
-
result
|
103
|
-
end
|
104
|
-
|
105
|
-
# Copies file to the target, using its respective transport
|
106
|
-
#
|
107
|
-
# @param source [String] place locally, to copy from.
|
108
|
-
# @param destination [String] place on the target, to copy to.
|
109
|
-
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
110
|
-
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
111
|
-
# @return [Object] A result object from the command.
|
112
|
-
def bolt_upload_file(source, destination, options = {})
|
113
|
-
target_node_name = ENV['TARGET_HOST'] if target_node_name.nil?
|
114
|
-
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
115
|
-
nil
|
116
|
-
else
|
117
|
-
inventory_hash_from_inventory_file
|
118
|
-
end
|
119
|
-
|
120
|
-
result = upload_file(source, destination, target_node_name, options: options, config: nil, inventory: inventory_hash)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
result
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
result
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# helper functions for running puppet commands. They execute a target system specified by ENV['TARGET_HOST']
|
4
|
+
# heavily uses functions from here https://github.com/puppetlabs/bolt/blob/master/developer-docs/bolt_spec-run.md
|
5
|
+
module PuppetLitmus::Serverspec
|
6
|
+
# Applies a manifest twice. First checking for errors. Secondly to make sure no changes occur.
|
7
|
+
#
|
8
|
+
# @param manifest [String] puppet manifest code to be applied.
|
9
|
+
# @return [Boolean] The result of the 2 apply manifests.
|
10
|
+
def idempotent_apply(manifest)
|
11
|
+
manifest_file_location = create_manifest_file(manifest)
|
12
|
+
apply_manifest(nil, catch_failures: true, manifest_file_location: manifest_file_location)
|
13
|
+
apply_manifest(nil, catch_changes: true, manifest_file_location: manifest_file_location)
|
14
|
+
end
|
15
|
+
|
16
|
+
# rubocop:disable Layout/TrailingWhitespace
|
17
|
+
|
18
|
+
# Applies a manifest. returning the result of that apply. Mimics the apply_manifest from beaker
|
19
|
+
#
|
20
|
+
# @param manifest [String] puppet manifest code to be applied.
|
21
|
+
# @param opts [Hash] Alters the behaviour of the command. Valid options are:
|
22
|
+
# :catch_changes [Boolean] exit status of 1 if there were changes.
|
23
|
+
# :expect_failures [Boolean] doesnt return an exit code of non-zero if the apply failed.
|
24
|
+
# :manifest_file_location [Path] The place on the target system.
|
25
|
+
# :prefix_command [String] prefixes the puppet apply command; eg "export LANGUAGE='ja'".
|
26
|
+
# :debug [Boolean] run puppet apply with the debug flag.
|
27
|
+
# :noop [Boolean] run puppet apply with the noop flag.
|
28
|
+
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
29
|
+
# @return [Object] A result object from the apply.
|
30
|
+
def apply_manifest(manifest, opts = {})
|
31
|
+
# rubocop:enable Layout/TrailingWhitespace
|
32
|
+
target_node_name = ENV['TARGET_HOST']
|
33
|
+
raise 'manifest and manifest_file_location in the opts hash are mutually exclusive arguments, pick one' if !manifest.nil? && !opts[:manifest_file_location].nil?
|
34
|
+
raise 'please pass a manifest or the manifest_file_location in the opts hash' if (manifest.nil? || manifest == '') && opts[:manifest_file_location].nil?
|
35
|
+
|
36
|
+
manifest_file_location = opts[:manifest_file_location] || create_manifest_file(manifest)
|
37
|
+
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
38
|
+
nil
|
39
|
+
else
|
40
|
+
inventory_hash_from_inventory_file
|
41
|
+
end
|
42
|
+
command_to_run = "#{opts[:prefix_command]} puppet apply #{manifest_file_location}"
|
43
|
+
command_to_run += " --modulepath #{Dir.pwd}/spec/fixtures/modules" if target_node_name.nil? || target_node_name == 'localhost'
|
44
|
+
command_to_run += ' --detailed-exitcodes' if !opts[:catch_changes].nil? && (opts[:catch_changes] == true)
|
45
|
+
command_to_run += ' --debug' if !opts[:debug].nil? && (opts[:debug] == true)
|
46
|
+
command_to_run += ' --noop' if !opts[:noop].nil? && (opts[:noop] == true)
|
47
|
+
result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
48
|
+
|
49
|
+
raise "apply manifest failed\n`#{command_to_run}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
50
|
+
|
51
|
+
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
52
|
+
stdout: result.first['result']['stdout'],
|
53
|
+
stderr: result.first['result']['stderr'])
|
54
|
+
yield result if block_given?
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
# Creates a manifest file locally in a temp location, if its a remote target copy it to there.
|
59
|
+
#
|
60
|
+
# @param manifest [String] puppet manifest code.
|
61
|
+
# @return [String] The path to the location of the manifest.
|
62
|
+
def create_manifest_file(manifest)
|
63
|
+
require 'tmpdir'
|
64
|
+
target_node_name = ENV['TARGET_HOST']
|
65
|
+
tmp_filename = File.join(Dir.tmpdir, "manifest_#{Time.now.strftime('%Y%m%d')}_#{Process.pid}_#{rand(0x100000000).to_s(36)}.pp")
|
66
|
+
manifest_file = File.open(tmp_filename, 'w')
|
67
|
+
manifest_file.write(manifest)
|
68
|
+
manifest_file.close
|
69
|
+
if target_node_name.nil? || target_node_name == 'localhost'
|
70
|
+
# no need to transfer
|
71
|
+
manifest_file_location = manifest_file.path
|
72
|
+
else
|
73
|
+
# transfer to TARGET_HOST
|
74
|
+
inventory_hash = inventory_hash_from_inventory_file
|
75
|
+
manifest_file_location = "/tmp/#{File.basename(manifest_file)}"
|
76
|
+
result = upload_file(manifest_file.path, manifest_file_location, target_node_name, options: {}, config: nil, inventory: inventory_hash)
|
77
|
+
raise result.first['result'].to_s unless result.first['status'] == 'success'
|
78
|
+
end
|
79
|
+
manifest_file_location
|
80
|
+
end
|
81
|
+
|
82
|
+
# Runs a command against the target system
|
83
|
+
#
|
84
|
+
# @param command_to_run [String] The command to execute.
|
85
|
+
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
86
|
+
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
87
|
+
# @return [Object] A result object from the command.
|
88
|
+
def run_shell(command_to_run, opts = {})
|
89
|
+
target_node_name = ENV['TARGET_HOST']
|
90
|
+
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
91
|
+
nil
|
92
|
+
else
|
93
|
+
inventory_hash_from_inventory_file
|
94
|
+
end
|
95
|
+
result = run_command(command_to_run, target_node_name, config: nil, inventory: inventory_hash)
|
96
|
+
raise "shell failed\n`#{command_to_run}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
97
|
+
|
98
|
+
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
99
|
+
stdout: result.first['result']['stdout'],
|
100
|
+
stderr: result.first['result']['stderr'])
|
101
|
+
yield result if block_given?
|
102
|
+
result
|
103
|
+
end
|
104
|
+
|
105
|
+
# Copies file to the target, using its respective transport
|
106
|
+
#
|
107
|
+
# @param source [String] place locally, to copy from.
|
108
|
+
# @param destination [String] place on the target, to copy to.
|
109
|
+
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
110
|
+
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
111
|
+
# @return [Object] A result object from the command.
|
112
|
+
def bolt_upload_file(source, destination, opts = {}, options = {})
|
113
|
+
target_node_name = ENV['TARGET_HOST'] if target_node_name.nil?
|
114
|
+
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
115
|
+
nil
|
116
|
+
else
|
117
|
+
inventory_hash_from_inventory_file
|
118
|
+
end
|
119
|
+
|
120
|
+
result = upload_file(source, destination, target_node_name, options: options, config: nil, inventory: inventory_hash)
|
121
|
+
|
122
|
+
result_obj = {
|
123
|
+
exit_code: 0,
|
124
|
+
stdout: result.first['result']['_output'],
|
125
|
+
stderr: nil,
|
126
|
+
result: result.first['result'],
|
127
|
+
}
|
128
|
+
|
129
|
+
if result.first['status'] != 'success'
|
130
|
+
raise "upload file failed\n======\n#{result}" if opts[:expect_failures] != true
|
131
|
+
|
132
|
+
result_obj[:exit_code] = 255
|
133
|
+
result_obj[:stderr] = result.first['result']['_error']['msg']
|
134
|
+
end
|
135
|
+
|
136
|
+
result = OpenStruct.new(exit_code: result_obj[:exit_code],
|
137
|
+
stdout: result_obj[:stdout],
|
138
|
+
stderr: result_obj[:stderr])
|
139
|
+
yield result if block_given?
|
140
|
+
result
|
141
|
+
end
|
142
|
+
|
143
|
+
# Runs a task against the target system.
|
144
|
+
#
|
145
|
+
# @param task_name [String] The name of the task to run.
|
146
|
+
# @param params [Hash] key : value pairs to be passed to the task.
|
147
|
+
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
148
|
+
# @return [Object] A result object from the task.The values available are stdout, stderr and result.
|
149
|
+
def run_bolt_task(task_name, params = {}, opts = {})
|
150
|
+
config_data = { 'modulepath' => File.join(Dir.pwd, 'spec', 'fixtures', 'modules') }
|
151
|
+
inventory_hash = inventory_hash_from_inventory_file
|
152
|
+
target_node_name = ENV['TARGET_HOST'] if target_node_name.nil?
|
153
|
+
|
154
|
+
result = run_task(task_name, target_node_name, params, config: config_data, inventory: inventory_hash)
|
155
|
+
|
156
|
+
result_obj = {
|
157
|
+
exit_code: 0,
|
158
|
+
stdout: result.first['result']['_output'],
|
159
|
+
stderr: nil,
|
160
|
+
result: result.first['result'],
|
161
|
+
}
|
162
|
+
|
163
|
+
if result.first['status'] != 'success'
|
164
|
+
raise "task failed\n`#{task_name}`\n======\n#{result}" if opts[:expect_failures] != true
|
165
|
+
|
166
|
+
result_obj[:exit_code] = result.first['result']['_error']['details'].fetch('exitcode', 255)
|
167
|
+
result_obj[:stderr] = result.first['result']['_error']['msg']
|
168
|
+
end
|
169
|
+
|
170
|
+
result = OpenStruct.new(exit_code: result_obj[:exit_code],
|
171
|
+
stdout: result_obj[:stdout],
|
172
|
+
stderr: result_obj[:stderr],
|
173
|
+
result: result_obj[:result])
|
174
|
+
yield result if block_given?
|
175
|
+
result
|
176
|
+
end
|
177
|
+
|
178
|
+
# Runs a script against the target system.
|
179
|
+
#
|
180
|
+
# @param script [String] The path to the script on the source machine
|
181
|
+
# @param opts [Hash] Alters the behaviour of the command. Valid options are :expect_failures [Boolean] doesnt return an exit code of non-zero if the command failed.
|
182
|
+
# @param arguments [Array] Array of arguments to pass to script on runtime
|
183
|
+
# @yieldreturn [Block] this method will yield to a block of code passed by the caller; this can be used for additional validation, etc.
|
184
|
+
# @return [Object] A result object from the script run.
|
185
|
+
def bolt_run_script(script, opts = {}, arguments: [])
|
186
|
+
target_node_name = ENV['TARGET_HOST'] if target_node_name.nil?
|
187
|
+
inventory_hash = if target_node_name.nil? || target_node_name == 'localhost'
|
188
|
+
nil
|
189
|
+
else
|
190
|
+
inventory_hash_from_inventory_file
|
191
|
+
end
|
192
|
+
|
193
|
+
result = run_script(script, target_node_name, arguments, options: opts, config: nil, inventory: inventory_hash)
|
194
|
+
|
195
|
+
raise "script run failed\n`#{script}`\n======\n#{result}" if result.first['result']['exit_code'] != 0 && opts[:expect_failures] != true
|
196
|
+
|
197
|
+
result = OpenStruct.new(exit_code: result.first['result']['exit_code'],
|
198
|
+
stdout: result.first['result']['stdout'],
|
199
|
+
stderr: result.first['result']['stderr'])
|
200
|
+
yield result if block_given?
|
201
|
+
result
|
202
|
+
end
|
203
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# version of this gem
|
4
|
-
module PuppetLitmus
|
5
|
-
VERSION ||= '0.7.
|
6
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# version of this gem
|
4
|
+
module PuppetLitmus
|
5
|
+
VERSION ||= '0.7.1'
|
6
|
+
end
|
data/spec/data/inventory.yaml
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
---
|
2
|
-
groups:
|
3
|
-
- name: ssh_nodes
|
4
|
-
nodes:
|
5
|
-
- name: test.delivery.puppetlabs.net
|
6
|
-
config:
|
7
|
-
transport: ssh
|
8
|
-
ssh:
|
9
|
-
user: root
|
10
|
-
password: Qu@lity!
|
11
|
-
host-key-check: false
|
12
|
-
facts:
|
13
|
-
provisioner: vmpooler
|
14
|
-
platform: centos-5-x86_64
|
15
|
-
- name: winrm_nodes
|
16
|
-
nodes: []
|
1
|
+
---
|
2
|
+
groups:
|
3
|
+
- name: ssh_nodes
|
4
|
+
nodes:
|
5
|
+
- name: test.delivery.puppetlabs.net
|
6
|
+
config:
|
7
|
+
transport: ssh
|
8
|
+
ssh:
|
9
|
+
user: root
|
10
|
+
password: Qu@lity!
|
11
|
+
host-key-check: false
|
12
|
+
facts:
|
13
|
+
provisioner: vmpooler
|
14
|
+
platform: centos-5-x86_64
|
15
|
+
- name: winrm_nodes
|
16
|
+
nodes: []
|
@@ -1,102 +1,102 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe PuppetLitmus::InventoryManipulation do
|
6
|
-
class DummyClass
|
7
|
-
end
|
8
|
-
let(:dummy_class) do
|
9
|
-
dummy_class = DummyClass.new
|
10
|
-
dummy_class.extend(described_class)
|
11
|
-
dummy_class
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'with config_from_node' do
|
15
|
-
let(:no_config_hash) do
|
16
|
-
{ 'groups' =>
|
17
|
-
[{ 'name' => 'ssh_nodes',
|
18
|
-
'nodes' =>
|
19
|
-
[{ 'name' => 'test.delivery.puppetlabs.net',
|
20
|
-
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
21
|
-
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
22
|
-
end
|
23
|
-
|
24
|
-
let(:config_hash) do
|
25
|
-
{ 'groups' =>
|
26
|
-
[{ 'name' => 'ssh_nodes',
|
27
|
-
'nodes' =>
|
28
|
-
[{ 'name' => 'test.delivery.puppetlabs.net',
|
29
|
-
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
30
|
-
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
31
|
-
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
32
|
-
end
|
33
|
-
|
34
|
-
let(:inventory_full_path) { 'spec/data/inventory.yaml' }
|
35
|
-
|
36
|
-
let(:no_feature_hash) do
|
37
|
-
{ 'groups' =>
|
38
|
-
[{ 'name' => 'ssh_nodes',
|
39
|
-
'nodes' =>
|
40
|
-
[{ 'name' => 'test.delivery.puppetlabs.net',
|
41
|
-
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
42
|
-
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
43
|
-
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
44
|
-
end
|
45
|
-
|
46
|
-
let(:feature_hash) do
|
47
|
-
{ 'groups' =>
|
48
|
-
[{ 'name' => 'ssh_nodes',
|
49
|
-
'nodes' =>
|
50
|
-
[{ 'name' => 'test.delivery.puppetlabs.net',
|
51
|
-
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
52
|
-
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
|
53
|
-
'features' => ['puppet-agent'] },
|
54
|
-
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
55
|
-
end
|
56
|
-
|
57
|
-
let(:empty_feature_hash) do
|
58
|
-
{ 'groups' =>
|
59
|
-
[{ 'name' => 'ssh_nodes',
|
60
|
-
'nodes' =>
|
61
|
-
[{ 'name' => 'test.delivery.puppetlabs.net',
|
62
|
-
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
63
|
-
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
|
64
|
-
'features' => [] },
|
65
|
-
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'no matching node, raises' do
|
69
|
-
expect { dummy_class.config_from_node(config_hash, 'not.here') }.to raise_error('No config was found for not.here')
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'no config section, returns nil' do
|
73
|
-
expect(dummy_class.config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to eq(nil)
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'config exists, and returns' do
|
77
|
-
expect(dummy_class.config_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('transport' => 'ssh', 'ssh' =>
|
78
|
-
{ 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false })
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'no feature exists, and returns hash with feature added' do
|
82
|
-
expect(dummy_class.add_feature_to_group(no_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'feature exists, and returns hash with feature removed' do
|
86
|
-
expect(dummy_class.remove_feature_from_group(feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => [], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'write from inventory_hash to inventory_yaml file feature_hash' do
|
90
|
-
expect { dummy_class.write_to_inventory_file(feature_hash, inventory_full_path) }.not_to raise_error
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'empty feature exists, and returns hash with feature added' do
|
94
|
-
expect(dummy_class.add_feature_to_group(empty_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'write from inventory_hash to inventory_yaml file no feature_hash' do
|
98
|
-
expect(File).to exist(inventory_full_path)
|
99
|
-
expect { dummy_class.write_to_inventory_file(no_feature_hash, inventory_full_path) }.not_to raise_error
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe PuppetLitmus::InventoryManipulation do
|
6
|
+
class DummyClass
|
7
|
+
end
|
8
|
+
let(:dummy_class) do
|
9
|
+
dummy_class = DummyClass.new
|
10
|
+
dummy_class.extend(described_class)
|
11
|
+
dummy_class
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'with config_from_node' do
|
15
|
+
let(:no_config_hash) do
|
16
|
+
{ 'groups' =>
|
17
|
+
[{ 'name' => 'ssh_nodes',
|
18
|
+
'nodes' =>
|
19
|
+
[{ 'name' => 'test.delivery.puppetlabs.net',
|
20
|
+
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
21
|
+
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:config_hash) do
|
25
|
+
{ 'groups' =>
|
26
|
+
[{ 'name' => 'ssh_nodes',
|
27
|
+
'nodes' =>
|
28
|
+
[{ 'name' => 'test.delivery.puppetlabs.net',
|
29
|
+
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
30
|
+
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
31
|
+
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:inventory_full_path) { 'spec/data/inventory.yaml' }
|
35
|
+
|
36
|
+
let(:no_feature_hash) do
|
37
|
+
{ 'groups' =>
|
38
|
+
[{ 'name' => 'ssh_nodes',
|
39
|
+
'nodes' =>
|
40
|
+
[{ 'name' => 'test.delivery.puppetlabs.net',
|
41
|
+
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
42
|
+
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }] },
|
43
|
+
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:feature_hash) do
|
47
|
+
{ 'groups' =>
|
48
|
+
[{ 'name' => 'ssh_nodes',
|
49
|
+
'nodes' =>
|
50
|
+
[{ 'name' => 'test.delivery.puppetlabs.net',
|
51
|
+
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
52
|
+
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
|
53
|
+
'features' => ['puppet-agent'] },
|
54
|
+
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
55
|
+
end
|
56
|
+
|
57
|
+
let(:empty_feature_hash) do
|
58
|
+
{ 'groups' =>
|
59
|
+
[{ 'name' => 'ssh_nodes',
|
60
|
+
'nodes' =>
|
61
|
+
[{ 'name' => 'test.delivery.puppetlabs.net',
|
62
|
+
'config' => { 'transport' => 'ssh', 'ssh' => { 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false } },
|
63
|
+
'facts' => { 'provisioner' => 'vmpooler', 'platform' => 'centos-5-x86_64' } }],
|
64
|
+
'features' => [] },
|
65
|
+
{ 'name' => 'winrm_nodes', 'nodes' => [] }] }
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'no matching node, raises' do
|
69
|
+
expect { dummy_class.config_from_node(config_hash, 'not.here') }.to raise_error('No config was found for not.here')
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'no config section, returns nil' do
|
73
|
+
expect(dummy_class.config_from_node(no_config_hash, 'test.delivery.puppetlabs.net')).to eq(nil)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'config exists, and returns' do
|
77
|
+
expect(dummy_class.config_from_node(config_hash, 'test.delivery.puppetlabs.net')).to eq('transport' => 'ssh', 'ssh' =>
|
78
|
+
{ 'user' => 'root', 'password' => 'Qu@lity!', 'host-key-check' => false })
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'no feature exists, and returns hash with feature added' do
|
82
|
+
expect(dummy_class.add_feature_to_group(no_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'feature exists, and returns hash with feature removed' do
|
86
|
+
expect(dummy_class.remove_feature_from_group(feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => [], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'write from inventory_hash to inventory_yaml file feature_hash' do
|
90
|
+
expect { dummy_class.write_to_inventory_file(feature_hash, inventory_full_path) }.not_to raise_error
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'empty feature exists, and returns hash with feature added' do
|
94
|
+
expect(dummy_class.add_feature_to_group(empty_feature_hash, 'puppet-agent', 'ssh_nodes')).to eq('groups' => [{ 'features' => ['puppet-agent'], 'name' => 'ssh_nodes', 'nodes' => [{ 'config' => { 'ssh' => { 'host-key-check' => false, 'password' => 'Qu@lity!', 'user' => 'root' }, 'transport' => 'ssh' }, 'facts' => { 'platform' => 'centos-5-x86_64', 'provisioner' => 'vmpooler' }, 'name' => 'test.delivery.puppetlabs.net' }] }, { 'name' => 'winrm_nodes', 'nodes' => [] }]) # rubocop:disable Metrics/LineLength: Line is too long
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'write from inventory_hash to inventory_yaml file no feature_hash' do
|
98
|
+
expect(File).to exist(inventory_full_path)
|
99
|
+
expect { dummy_class.write_to_inventory_file(no_feature_hash, inventory_full_path) }.not_to raise_error
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|