test-kitchen 1.14.1 → 1.14.2
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/Berksfile +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -1
- data/Guardfile +5 -5
- data/Rakefile +5 -5
- data/bin/kitchen +1 -1
- data/features/step_definitions/gem_steps.rb +6 -6
- data/features/support/env.rb +6 -7
- data/lib/kitchen.rb +5 -7
- data/lib/kitchen/base64_stream.rb +2 -8
- data/lib/kitchen/cli.rb +76 -80
- data/lib/kitchen/collection.rb +0 -2
- data/lib/kitchen/color.rb +7 -9
- data/lib/kitchen/command.rb +0 -4
- data/lib/kitchen/command/action.rb +0 -3
- data/lib/kitchen/command/console.rb +4 -7
- data/lib/kitchen/command/diagnose.rb +7 -14
- data/lib/kitchen/command/driver_discover.rb +1 -4
- data/lib/kitchen/command/exec.rb +0 -3
- data/lib/kitchen/command/list.rb +9 -12
- data/lib/kitchen/command/login.rb +0 -3
- data/lib/kitchen/command/package.rb +0 -3
- data/lib/kitchen/command/sink.rb +6 -9
- data/lib/kitchen/command/test.rb +1 -4
- data/lib/kitchen/config.rb +25 -27
- data/lib/kitchen/configurable.rb +26 -31
- data/lib/kitchen/data_munger.rb +34 -36
- data/lib/kitchen/diagnostic.rb +5 -7
- data/lib/kitchen/driver.rb +3 -5
- data/lib/kitchen/driver/base.rb +0 -3
- data/lib/kitchen/driver/dummy.rb +0 -3
- data/lib/kitchen/driver/proxy.rb +0 -3
- data/lib/kitchen/driver/ssh_base.rb +13 -16
- data/lib/kitchen/errors.rb +11 -16
- data/lib/kitchen/generator/driver_create.rb +18 -21
- data/lib/kitchen/generator/init.rb +21 -26
- data/lib/kitchen/instance.rb +19 -23
- data/lib/kitchen/lazy_hash.rb +1 -2
- data/lib/kitchen/loader/yaml.rb +22 -25
- data/lib/kitchen/logger.rb +9 -14
- data/lib/kitchen/logging.rb +0 -3
- data/lib/kitchen/login_command.rb +0 -2
- data/lib/kitchen/metadata_chopper.rb +0 -2
- data/lib/kitchen/platform.rb +1 -3
- data/lib/kitchen/provisioner.rb +3 -5
- data/lib/kitchen/provisioner/base.rb +2 -5
- data/lib/kitchen/provisioner/chef/berkshelf.rb +1 -5
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +24 -29
- data/lib/kitchen/provisioner/chef/librarian.rb +2 -6
- data/lib/kitchen/provisioner/chef/policyfile.rb +4 -8
- data/lib/kitchen/provisioner/chef_apply.rb +14 -17
- data/lib/kitchen/provisioner/chef_base.rb +43 -46
- data/lib/kitchen/provisioner/chef_solo.rb +10 -13
- data/lib/kitchen/provisioner/chef_zero.rb +22 -29
- data/lib/kitchen/provisioner/dummy.rb +0 -3
- data/lib/kitchen/provisioner/shell.rb +6 -9
- data/lib/kitchen/rake_tasks.rb +4 -6
- data/lib/kitchen/shell_out.rb +3 -5
- data/lib/kitchen/ssh.rb +16 -22
- data/lib/kitchen/state_file.rb +3 -5
- data/lib/kitchen/suite.rb +0 -2
- data/lib/kitchen/thor_tasks.rb +2 -4
- data/lib/kitchen/transport.rb +3 -5
- data/lib/kitchen/transport/base.rb +1 -7
- data/lib/kitchen/transport/dummy.rb +0 -4
- data/lib/kitchen/transport/ssh.rb +41 -47
- data/lib/kitchen/transport/winrm.rb +41 -40
- data/lib/kitchen/util.rb +1 -3
- data/lib/kitchen/verifier.rb +3 -5
- data/lib/kitchen/verifier/base.rb +2 -5
- data/lib/kitchen/verifier/busser.rb +24 -24
- data/lib/kitchen/verifier/dummy.rb +0 -3
- data/lib/kitchen/verifier/shell.rb +1 -3
- data/lib/kitchen/version.rb +1 -1
- data/lib/vendor/hash_recursive_merge.rb +0 -2
- data/spec/kitchen/base64_stream_spec.rb +3 -6
- data/spec/kitchen/cli_spec.rb +0 -2
- data/spec/kitchen/collection_spec.rb +4 -8
- data/spec/kitchen/color_spec.rb +0 -3
- data/spec/kitchen/config_spec.rb +91 -106
- data/spec/kitchen/configurable_spec.rb +44 -76
- data/spec/kitchen/data_munger_spec.rb +1178 -1247
- data/spec/kitchen/diagnostic_spec.rb +37 -38
- data/spec/kitchen/driver/base_spec.rb +7 -14
- data/spec/kitchen/driver/dummy_spec.rb +1 -7
- data/spec/kitchen/driver/proxy_spec.rb +2 -7
- data/spec/kitchen/driver/ssh_base_spec.rb +128 -149
- data/spec/kitchen/driver_spec.rb +7 -13
- data/spec/kitchen/errors_spec.rb +50 -60
- data/spec/kitchen/instance_spec.rb +217 -294
- data/spec/kitchen/lazy_hash_spec.rb +14 -18
- data/spec/kitchen/loader/yaml_spec.rb +201 -227
- data/spec/kitchen/logger_spec.rb +7 -15
- data/spec/kitchen/logging_spec.rb +1 -4
- data/spec/kitchen/login_command_spec.rb +3 -4
- data/spec/kitchen/metadata_chopper_spec.rb +0 -3
- data/spec/kitchen/platform_spec.rb +31 -32
- data/spec/kitchen/provisioner/base_spec.rb +22 -41
- data/spec/kitchen/provisioner/chef/policyfile_spec.rb +15 -15
- data/spec/kitchen/provisioner/chef_apply_spec.rb +8 -13
- data/spec/kitchen/provisioner/chef_base_spec.rb +150 -182
- data/spec/kitchen/provisioner/chef_solo_spec.rb +58 -72
- data/spec/kitchen/provisioner/chef_zero_spec.rb +99 -125
- data/spec/kitchen/provisioner/dummy_spec.rb +8 -11
- data/spec/kitchen/provisioner/shell_spec.rb +86 -103
- data/spec/kitchen/provisioner_spec.rb +5 -11
- data/spec/kitchen/shell_out_spec.rb +15 -19
- data/spec/kitchen/ssh_spec.rb +16 -35
- data/spec/kitchen/state_file_spec.rb +6 -11
- data/spec/kitchen/suite_spec.rb +5 -6
- data/spec/kitchen/transport/base_spec.rb +6 -14
- data/spec/kitchen/transport/ssh_spec.rb +39 -64
- data/spec/kitchen/transport/winrm_spec.rb +99 -127
- data/spec/kitchen/transport_spec.rb +7 -13
- data/spec/kitchen/util_spec.rb +17 -26
- data/spec/kitchen/verifier/base_spec.rb +24 -40
- data/spec/kitchen/verifier/busser_spec.rb +38 -68
- data/spec/kitchen/verifier/dummy_spec.rb +8 -11
- data/spec/kitchen/verifier/shell_spec.rb +14 -17
- data/spec/kitchen/verifier_spec.rb +7 -13
- data/spec/kitchen_spec.rb +4 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/powershell_max_size_spec.rb +1 -2
- data/support/chef-client-zero.rb +3 -4
- data/test-kitchen.gemspec +4 -6
- metadata +9 -9
data/lib/kitchen/lazy_hash.rb
CHANGED
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
require "delegate"
|
|
20
20
|
|
|
21
21
|
module Kitchen
|
|
22
|
-
|
|
23
22
|
# A modifed Hash object that may contain callables as a value which must be
|
|
24
23
|
# executed in the context of another object. This allows for delayed
|
|
25
24
|
# evaluation of a hash value while still looking and largely feeling like a
|
|
@@ -101,7 +100,7 @@ module Kitchen
|
|
|
101
100
|
#
|
|
102
101
|
# @return [Hash] a new hash
|
|
103
102
|
def to_hash
|
|
104
|
-
hash =
|
|
103
|
+
hash = {}
|
|
105
104
|
__getobj__.keys.each { |key| hash[key] = self[key] }
|
|
106
105
|
hash
|
|
107
106
|
end
|
data/lib/kitchen/loader/yaml.rb
CHANGED
|
@@ -27,9 +27,7 @@ end
|
|
|
27
27
|
require "safe_yaml/load"
|
|
28
28
|
|
|
29
29
|
module Kitchen
|
|
30
|
-
|
|
31
30
|
module Loader
|
|
32
|
-
|
|
33
31
|
# YAML file loader for Test Kitchen configuration. This class is
|
|
34
32
|
# responisble for parsing the main YAML file and the local YAML if it
|
|
35
33
|
# exists. Local file configuration will win over the default configuration.
|
|
@@ -38,7 +36,6 @@ module Kitchen
|
|
|
38
36
|
#
|
|
39
37
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
40
38
|
class YAML
|
|
41
|
-
|
|
42
39
|
# Creates a new loader that can parse and load YAML files.
|
|
43
40
|
#
|
|
44
41
|
# @param options [Hash] configuration for a new loader
|
|
@@ -70,7 +67,7 @@ module Kitchen
|
|
|
70
67
|
#
|
|
71
68
|
# @return [Hash] merged configuration data
|
|
72
69
|
def read
|
|
73
|
-
|
|
70
|
+
unless File.exist?(config_file)
|
|
74
71
|
raise UserError, "Kitchen YAML file #{config_file} does not exist."
|
|
75
72
|
end
|
|
76
73
|
|
|
@@ -81,7 +78,7 @@ module Kitchen
|
|
|
81
78
|
#
|
|
82
79
|
# @return [Hash] a diagnostic hash
|
|
83
80
|
def diagnose
|
|
84
|
-
result =
|
|
81
|
+
result = {}
|
|
85
82
|
result[:process_erb] = @process_erb
|
|
86
83
|
result[:process_local] = @process_local
|
|
87
84
|
result[:process_global] = @process_global
|
|
@@ -123,10 +120,10 @@ module Kitchen
|
|
|
123
120
|
# @api private
|
|
124
121
|
def combined_hash
|
|
125
122
|
y = if @process_global
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
normalize(global_yaml).rmerge(normalize(yaml))
|
|
124
|
+
else
|
|
125
|
+
normalize(yaml)
|
|
126
|
+
end
|
|
130
127
|
@process_local ? y.rmerge(normalize(local_yaml)) : y
|
|
131
128
|
end
|
|
132
129
|
|
|
@@ -239,7 +236,7 @@ module Kitchen
|
|
|
239
236
|
failure_hash(e, file)
|
|
240
237
|
end
|
|
241
238
|
|
|
242
|
-
{ :
|
|
239
|
+
{ filename: file, raw_data: hash }
|
|
243
240
|
end
|
|
244
241
|
|
|
245
242
|
# Generates a Hash respresenting a failure, given an Exception object.
|
|
@@ -250,11 +247,11 @@ module Kitchen
|
|
|
250
247
|
# @api private
|
|
251
248
|
def failure_hash(e, file = nil)
|
|
252
249
|
result = {
|
|
253
|
-
:
|
|
254
|
-
:
|
|
255
|
-
:
|
|
256
|
-
:
|
|
257
|
-
}
|
|
250
|
+
error: {
|
|
251
|
+
exception: e.inspect,
|
|
252
|
+
message: e.message,
|
|
253
|
+
backtrace: e.backtrace,
|
|
254
|
+
},
|
|
258
255
|
}
|
|
259
256
|
result[:error][:raw_file] = IO.read(file) unless file.nil?
|
|
260
257
|
result
|
|
@@ -268,7 +265,7 @@ module Kitchen
|
|
|
268
265
|
# @api private
|
|
269
266
|
def normalize(obj)
|
|
270
267
|
if obj.is_a?(Hash)
|
|
271
|
-
obj.inject(
|
|
268
|
+
obj.inject({}) { |h, (k, v)| normalize_hash(h, k, v); h }
|
|
272
269
|
else
|
|
273
270
|
obj
|
|
274
271
|
end
|
|
@@ -308,13 +305,13 @@ module Kitchen
|
|
|
308
305
|
case key
|
|
309
306
|
when "driver", "provisioner", "busser"
|
|
310
307
|
hash[key] = if value.nil?
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
308
|
+
{}
|
|
309
|
+
elsif value.is_a?(String)
|
|
310
|
+
default_key = key == "busser" ? "version" : "name"
|
|
311
|
+
{ default_key => value }
|
|
312
|
+
else
|
|
313
|
+
normalize(value)
|
|
314
|
+
end
|
|
318
315
|
else
|
|
319
316
|
hash[key] = normalize(value)
|
|
320
317
|
end
|
|
@@ -329,9 +326,9 @@ module Kitchen
|
|
|
329
326
|
# @raise [UserError] if the string document cannot be parsed
|
|
330
327
|
# @api private
|
|
331
328
|
def parse_yaml_string(string, file_name)
|
|
332
|
-
return
|
|
329
|
+
return {} if string.nil? || string.empty?
|
|
333
330
|
|
|
334
|
-
result = SafeYAML.load(string) ||
|
|
331
|
+
result = SafeYAML.load(string) || {}
|
|
335
332
|
unless result.is_a?(Hash)
|
|
336
333
|
raise UserError, "Error parsing #{file_name} as YAML " \
|
|
337
334
|
"(Result of parse was not a Hash, but was a #{result.class}).\n" \
|
data/lib/kitchen/logger.rb
CHANGED
|
@@ -20,7 +20,6 @@ require "fileutils"
|
|
|
20
20
|
require "logger"
|
|
21
21
|
|
|
22
22
|
module Kitchen
|
|
23
|
-
|
|
24
23
|
# Logging implementation for Kitchen. By default the console/stdout output
|
|
25
24
|
# will be displayed differently than the file log output. Therefor, this
|
|
26
25
|
# class wraps multiple loggers that conform to the stdlib `Logger` class
|
|
@@ -28,7 +27,6 @@ module Kitchen
|
|
|
28
27
|
#
|
|
29
28
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
30
29
|
class Logger
|
|
31
|
-
|
|
32
30
|
include ::Logger::Severity
|
|
33
31
|
|
|
34
32
|
# @return [IO] the log device
|
|
@@ -59,10 +57,10 @@ module Kitchen
|
|
|
59
57
|
# (default: `$stdout.tty?`)
|
|
60
58
|
def initialize(options = {})
|
|
61
59
|
@log_overwrite = if options[:log_overwrite].nil?
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
default_log_overwrite
|
|
61
|
+
else
|
|
62
|
+
options[:log_overwrite]
|
|
63
|
+
end
|
|
66
64
|
|
|
67
65
|
@logdev = logdev_logger(options[:logdev], log_overwrite) if options[:logdev]
|
|
68
66
|
|
|
@@ -88,7 +86,6 @@ module Kitchen
|
|
|
88
86
|
private :populate_loggers
|
|
89
87
|
|
|
90
88
|
class << self
|
|
91
|
-
|
|
92
89
|
private
|
|
93
90
|
|
|
94
91
|
# @api private
|
|
@@ -297,7 +294,7 @@ module Kitchen
|
|
|
297
294
|
logger = StdoutLogger.new(stdout)
|
|
298
295
|
if colorize
|
|
299
296
|
logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
|
300
|
-
Color.colorize(
|
|
297
|
+
Color.colorize(msg.to_s, color).concat("\n")
|
|
301
298
|
end
|
|
302
299
|
else
|
|
303
300
|
logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
|
@@ -340,8 +337,7 @@ module Kitchen
|
|
|
340
337
|
# Internal class which adds a #banner method call that displays the
|
|
341
338
|
# message with a callout arrow.
|
|
342
339
|
class LogdevLogger < ::Logger
|
|
343
|
-
|
|
344
|
-
alias_method :super_info, :info
|
|
340
|
+
alias super_info info
|
|
345
341
|
|
|
346
342
|
# Dump one or more messages to info.
|
|
347
343
|
#
|
|
@@ -370,9 +366,9 @@ module Kitchen
|
|
|
370
366
|
# @api private
|
|
371
367
|
def format_line(line)
|
|
372
368
|
case line
|
|
373
|
-
when
|
|
374
|
-
when
|
|
375
|
-
when
|
|
369
|
+
when /^-----> / then banner(line.gsub(/^[ >-]{6} /, ""))
|
|
370
|
+
when /^>>>>>> / then error(line.gsub(/^[ >-]{6} /, ""))
|
|
371
|
+
when /^ / then info(line.gsub(/^[ >-]{6} /, ""))
|
|
376
372
|
else info(line)
|
|
377
373
|
end
|
|
378
374
|
end
|
|
@@ -381,7 +377,6 @@ module Kitchen
|
|
|
381
377
|
# Internal class which reformats logging methods for display as console
|
|
382
378
|
# output.
|
|
383
379
|
class StdoutLogger < LogdevLogger
|
|
384
|
-
|
|
385
380
|
# Log a debug message
|
|
386
381
|
#
|
|
387
382
|
# @param msg [String] a message
|
data/lib/kitchen/logging.rb
CHANGED
|
@@ -17,14 +17,11 @@
|
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
|
|
19
19
|
module Kitchen
|
|
20
|
-
|
|
21
20
|
# Mixin module that delegates logging methods to a local `#logger`.
|
|
22
21
|
#
|
|
23
22
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
24
23
|
module Logging
|
|
25
|
-
|
|
26
24
|
class << self
|
|
27
|
-
|
|
28
25
|
private
|
|
29
26
|
|
|
30
27
|
# @api private
|
|
@@ -17,13 +17,11 @@
|
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
|
|
19
19
|
module Kitchen
|
|
20
|
-
|
|
21
20
|
# Value object to track a shell command that will be passed to Kernel.exec
|
|
22
21
|
# for execution.
|
|
23
22
|
#
|
|
24
23
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
25
24
|
class LoginCommand
|
|
26
|
-
|
|
27
25
|
# @return [String] login command
|
|
28
26
|
attr_reader :command
|
|
29
27
|
|
|
@@ -17,14 +17,12 @@
|
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
|
|
19
19
|
module Kitchen
|
|
20
|
-
|
|
21
20
|
# A rather insane and questionable class to quickly consume a metadata.rb
|
|
22
21
|
# file and return the cookbook name and version attributes.
|
|
23
22
|
#
|
|
24
23
|
# @see https://twitter.com/fnichol/status/281650077901144064
|
|
25
24
|
# @see https://gist.github.com/4343327
|
|
26
25
|
class MetadataChopper < Hash
|
|
27
|
-
|
|
28
26
|
# Return an Array containing the cookbook name and version attributes,
|
|
29
27
|
# or nil values if they could not be parsed.
|
|
30
28
|
#
|
data/lib/kitchen/platform.rb
CHANGED
|
@@ -17,14 +17,12 @@
|
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
|
|
19
19
|
module Kitchen
|
|
20
|
-
|
|
21
20
|
# A target operating system environment in which convergence integration
|
|
22
21
|
# will take place. This may represent a specific operating system, version,
|
|
23
22
|
# and machine architecture.
|
|
24
23
|
#
|
|
25
24
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
26
25
|
class Platform
|
|
27
|
-
|
|
28
26
|
# @return [String] logical name of this platform
|
|
29
27
|
attr_reader :name
|
|
30
28
|
|
|
@@ -61,7 +59,7 @@ module Kitchen
|
|
|
61
59
|
#
|
|
62
60
|
# @return [Hash] a diagnostic hash
|
|
63
61
|
def diagnose
|
|
64
|
-
{ :
|
|
62
|
+
{ os_type: os_type, shell_type: shell_type }
|
|
65
63
|
end
|
|
66
64
|
end
|
|
67
65
|
end
|
data/lib/kitchen/provisioner.rb
CHANGED
|
@@ -19,14 +19,12 @@
|
|
|
19
19
|
require "thor/util"
|
|
20
20
|
|
|
21
21
|
module Kitchen
|
|
22
|
-
|
|
23
22
|
# A provisioner is responsible for generating the commands necessary to
|
|
24
23
|
# install set up and use a configuration management tool such as Chef and
|
|
25
24
|
# Puppet.
|
|
26
25
|
#
|
|
27
26
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
27
|
module Provisioner
|
|
29
|
-
|
|
30
28
|
# Default provisioner to use
|
|
31
29
|
DEFAULT_PLUGIN = "chef_solo".freeze
|
|
32
30
|
|
|
@@ -46,9 +44,9 @@ module Kitchen
|
|
|
46
44
|
object
|
|
47
45
|
rescue LoadError, NameError
|
|
48
46
|
raise ClientError,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
"Could not load the '#{plugin}' provisioner from the load path." \
|
|
48
|
+
" Please ensure that your provisioner is installed as a gem or" \
|
|
49
|
+
" included in your Gemfile if using Bundler."
|
|
52
50
|
end
|
|
53
51
|
end
|
|
54
52
|
end
|
|
@@ -17,14 +17,11 @@
|
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
|
|
19
19
|
module Kitchen
|
|
20
|
-
|
|
21
20
|
module Provisioner
|
|
22
|
-
|
|
23
21
|
# Base class for a provisioner.
|
|
24
22
|
#
|
|
25
23
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
26
24
|
class Base
|
|
27
|
-
|
|
28
25
|
include Configurable
|
|
29
26
|
include Logging
|
|
30
27
|
|
|
@@ -37,7 +34,7 @@ module Kitchen
|
|
|
37
34
|
default_config :wait_for_retry, 30
|
|
38
35
|
|
|
39
36
|
default_config :root_path do |provisioner|
|
|
40
|
-
provisioner.windows_os? ?
|
|
37
|
+
provisioner.windows_os? ? '$env:TEMP\\kitchen' : "/tmp/kitchen"
|
|
41
38
|
end
|
|
42
39
|
|
|
43
40
|
default_config :sudo do |provisioner|
|
|
@@ -205,7 +202,7 @@ module Kitchen
|
|
|
205
202
|
def shell_code_from_file(vars, file)
|
|
206
203
|
src_file = File.join(
|
|
207
204
|
File.dirname(__FILE__),
|
|
208
|
-
%w
|
|
205
|
+
%w{.. .. .. support},
|
|
209
206
|
file + (powershell_shell? ? ".ps1" : ".sh")
|
|
210
207
|
)
|
|
211
208
|
|
|
@@ -20,17 +20,13 @@ require "kitchen/errors"
|
|
|
20
20
|
require "kitchen/logging"
|
|
21
21
|
|
|
22
22
|
module Kitchen
|
|
23
|
-
|
|
24
23
|
module Provisioner
|
|
25
|
-
|
|
26
24
|
module Chef
|
|
27
|
-
|
|
28
25
|
# Chef cookbook resolver that uses Berkshelf and a Berksfile to calculate
|
|
29
26
|
# dependencies.
|
|
30
27
|
#
|
|
31
28
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
32
29
|
class Berkshelf
|
|
33
|
-
|
|
34
30
|
include Logging
|
|
35
31
|
|
|
36
32
|
# Creates a new cookbook resolver.
|
|
@@ -109,7 +105,7 @@ module Kitchen
|
|
|
109
105
|
" `gem install berkshelf` or add the following to your" \
|
|
110
106
|
" Gemfile if you are using Bundler: `gem 'berkshelf'`.")
|
|
111
107
|
raise UserError,
|
|
112
|
-
|
|
108
|
+
"Could not load or activate Berkshelf (#{e.message})"
|
|
113
109
|
end
|
|
114
110
|
end
|
|
115
111
|
end
|
|
@@ -19,18 +19,14 @@
|
|
|
19
19
|
require "json"
|
|
20
20
|
|
|
21
21
|
module Kitchen
|
|
22
|
-
|
|
23
22
|
module Provisioner
|
|
24
|
-
|
|
25
23
|
module Chef
|
|
26
|
-
|
|
27
24
|
# Internal object to manage common sandbox preparation for
|
|
28
25
|
# Chef-related provisioners.
|
|
29
26
|
#
|
|
30
27
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
31
28
|
# @api private
|
|
32
29
|
class CommonSandbox
|
|
33
|
-
|
|
34
30
|
include Logging
|
|
35
31
|
|
|
36
32
|
# Constructs a new object, taking config, a sandbox path, and an
|
|
@@ -58,9 +54,9 @@ module Kitchen
|
|
|
58
54
|
prepare(:clients)
|
|
59
55
|
prepare(
|
|
60
56
|
:secret,
|
|
61
|
-
:
|
|
62
|
-
:
|
|
63
|
-
:
|
|
57
|
+
type: :file,
|
|
58
|
+
dest_name: "encrypted_data_bag_secret",
|
|
59
|
+
key_name: :encrypted_data_bag_secret_key_path
|
|
64
60
|
)
|
|
65
61
|
end
|
|
66
62
|
|
|
@@ -84,8 +80,8 @@ module Kitchen
|
|
|
84
80
|
# @return [Array<String>] an array of absolute paths to files
|
|
85
81
|
# @api private
|
|
86
82
|
def all_files_in_cookbooks
|
|
87
|
-
Dir.glob(File.join(tmpbooks_dir, "**/*"), File::FNM_DOTMATCH)
|
|
88
|
-
|
|
83
|
+
Dir.glob(File.join(tmpbooks_dir, "**/*"), File::FNM_DOTMATCH)
|
|
84
|
+
.select { |fn| File.file?(fn) && ! %w{. ..}.include?(fn) }
|
|
89
85
|
end
|
|
90
86
|
|
|
91
87
|
# @return [String] an absolute path to a Policyfile, relative to the
|
|
@@ -151,8 +147,8 @@ module Kitchen
|
|
|
151
147
|
debug("Using metadata.rb from #{metadata_rb}")
|
|
152
148
|
|
|
153
149
|
cb_name = MetadataChopper.extract(metadata_rb).first || raise(UserError,
|
|
154
|
-
|
|
155
|
-
|
|
150
|
+
"The metadata.rb does not define the 'name' key." \
|
|
151
|
+
" Please add: `name '<cookbook_name>'` to metadata.rb and retry")
|
|
156
152
|
|
|
157
153
|
cb_path = File.join(tmpbooks_dir, cb_name)
|
|
158
154
|
|
|
@@ -168,8 +164,8 @@ module Kitchen
|
|
|
168
164
|
def filter_only_cookbook_files
|
|
169
165
|
info("Removing non-cookbook files before transfer")
|
|
170
166
|
FileUtils.rm(all_files_in_cookbooks - only_cookbook_files)
|
|
171
|
-
Dir.glob(File.join(tmpbooks_dir, "**/"), File::FNM_PATHNAME)
|
|
172
|
-
|
|
167
|
+
Dir.glob(File.join(tmpbooks_dir, "**/"), File::FNM_PATHNAME)
|
|
168
|
+
.reverse_each { |fn| FileUtils.rmdir(fn) if Dir.entries(fn).size == 2 }
|
|
173
169
|
end
|
|
174
170
|
|
|
175
171
|
# @return [Logger] the instance's logger or Test Kitchen's common
|
|
@@ -208,8 +204,8 @@ module Kitchen
|
|
|
208
204
|
def only_cookbook_files
|
|
209
205
|
glob = File.join(tmpbooks_dir, "*", "{#{config[:cookbook_files_glob]}}")
|
|
210
206
|
|
|
211
|
-
Dir.glob(glob, File::FNM_DOTMATCH)
|
|
212
|
-
|
|
207
|
+
Dir.glob(glob, File::FNM_DOTMATCH)
|
|
208
|
+
.select { |fn| File.file?(fn) && ! %w{. ..}.include?(fn) }
|
|
213
209
|
end
|
|
214
210
|
|
|
215
211
|
# Prepares a generic Chef component source directory or file for
|
|
@@ -226,7 +222,7 @@ module Kitchen
|
|
|
226
222
|
# basename in the sandbox path (default: `component.to_s`)
|
|
227
223
|
# @api private
|
|
228
224
|
def prepare(component, opts = {})
|
|
229
|
-
opts = { :
|
|
225
|
+
opts = { type: :directory }.merge(opts)
|
|
230
226
|
key_name = opts.fetch(:key_name, "#{component}_path")
|
|
231
227
|
src = config[key_name.to_sym]
|
|
232
228
|
return if src.nil?
|
|
@@ -282,10 +278,10 @@ module Kitchen
|
|
|
282
278
|
# @api private
|
|
283
279
|
def prepare_json
|
|
284
280
|
dna = if File.exist?(policyfile)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
281
|
+
update_dna_for_policyfile
|
|
282
|
+
else
|
|
283
|
+
config[:attributes].merge(run_list: config[:run_list])
|
|
284
|
+
end
|
|
289
285
|
|
|
290
286
|
info("Preparing dna.json")
|
|
291
287
|
debug("Creating dna.json from #{dna.inspect}")
|
|
@@ -302,14 +298,14 @@ module Kitchen
|
|
|
302
298
|
warn("Ignored run_list: #{config[:run_list].inspect}")
|
|
303
299
|
end
|
|
304
300
|
policy = Chef::Policyfile.new(policyfile, sandbox_path,
|
|
305
|
-
|
|
306
|
-
|
|
301
|
+
logger: logger,
|
|
302
|
+
always_update: config[:always_update_cookbooks])
|
|
307
303
|
Kitchen.mutex.synchronize do
|
|
308
304
|
policy.compile
|
|
309
305
|
end
|
|
310
306
|
policy_name = JSON.parse(IO.read(policy.lockfile))["name"]
|
|
311
307
|
policy_group = "local"
|
|
312
|
-
config[:attributes].merge(:
|
|
308
|
+
config[:attributes].merge(policy_name: policy_name, policy_group: policy_group)
|
|
313
309
|
end
|
|
314
310
|
|
|
315
311
|
# Performs a Policyfile cookbook resolution inside a common mutex.
|
|
@@ -318,8 +314,8 @@ module Kitchen
|
|
|
318
314
|
def resolve_with_policyfile
|
|
319
315
|
Kitchen.mutex.synchronize do
|
|
320
316
|
Chef::Policyfile.new(policyfile, sandbox_path,
|
|
321
|
-
|
|
322
|
-
|
|
317
|
+
logger: logger,
|
|
318
|
+
always_update: config[:always_update_cookbooks]).resolve
|
|
323
319
|
end
|
|
324
320
|
end
|
|
325
321
|
|
|
@@ -329,8 +325,8 @@ module Kitchen
|
|
|
329
325
|
def resolve_with_berkshelf
|
|
330
326
|
Kitchen.mutex.synchronize do
|
|
331
327
|
Chef::Berkshelf.new(berksfile, tmpbooks_dir,
|
|
332
|
-
|
|
333
|
-
|
|
328
|
+
logger: logger,
|
|
329
|
+
always_update: config[:always_update_cookbooks]).resolve
|
|
334
330
|
end
|
|
335
331
|
end
|
|
336
332
|
|
|
@@ -339,7 +335,7 @@ module Kitchen
|
|
|
339
335
|
# @api private
|
|
340
336
|
def resolve_with_librarian
|
|
341
337
|
Kitchen.mutex.synchronize do
|
|
342
|
-
Chef::Librarian.new(cheffile, tmpbooks_dir, :
|
|
338
|
+
Chef::Librarian.new(cheffile, tmpbooks_dir, logger: logger).resolve
|
|
343
339
|
end
|
|
344
340
|
end
|
|
345
341
|
|
|
@@ -363,7 +359,6 @@ module Kitchen
|
|
|
363
359
|
def tmpsitebooks_dir
|
|
364
360
|
File.join(sandbox_path, "cookbooks")
|
|
365
361
|
end
|
|
366
|
-
|
|
367
362
|
end
|
|
368
363
|
end
|
|
369
364
|
end
|