test-kitchen 2.10.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +5 -11
- data/Rakefile +1 -23
- data/lib/kitchen/chef_utils_wiring.rb +40 -0
- data/lib/kitchen/cli.rb +2 -2
- data/lib/kitchen/command/console.rb +1 -1
- data/lib/kitchen/configurable.rb +1 -1
- data/lib/kitchen/data_munger.rb +2 -0
- data/lib/kitchen/lifecycle_hook/remote.rb +8 -2
- data/lib/kitchen/logger.rb +2 -2
- data/lib/kitchen/provisioner.rb +3 -1
- data/lib/kitchen/provisioner/base.rb +2 -4
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +15 -10
- data/lib/kitchen/provisioner/chef/policyfile.rb +43 -41
- data/lib/kitchen/provisioner/chef_base.rb +3 -2
- data/lib/kitchen/provisioner/chef_infra.rb +167 -0
- data/lib/kitchen/provisioner/chef_zero.rb +3 -147
- data/lib/kitchen/transport/ssh.rb +8 -10
- data/lib/kitchen/transport/winrm.rb +3 -5
- data/lib/kitchen/verifier/base.rb +1 -3
- data/lib/kitchen/verifier/shell.rb +1 -0
- data/lib/kitchen/version.rb +1 -1
- data/lib/kitchen/which.rb +26 -0
- data/test-kitchen.gemspec +3 -2
- metadata +23 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7cff7935683511121e07b20e636078776ae80c20fc007b5b08a922ce76e0ce94
|
4
|
+
data.tar.gz: 8207e168e7faf42b8239438753c58f2a9a37fc4f4f2dcd9728948f67b4a5afb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46356119baf46a5ec115cc036c81778e8f17ac2dca6a21733d7bb4ef8779d7d23724ef295cd1f0557083abe577578ff28eec2bb5d9a4596359d8c5c34ea0379b
|
7
|
+
data.tar.gz: 7770f0e415279795ecf2106a6005f7b1514bd692be9a5839d24e992ad4e03dcbbe33dd86892904b1dd87a73473a3484d3f44518f7b87211d1c340c3f94abd6a3
|
data/Gemfile
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem"s dependencies in test-kitchen.gemspec
|
2
4
|
gemspec
|
3
5
|
|
4
6
|
group :integration do
|
@@ -8,20 +10,12 @@ group :integration do
|
|
8
10
|
gem "kitchen-vagrant"
|
9
11
|
end
|
10
12
|
|
11
|
-
group :changelog do
|
12
|
-
gem "github_changelog_generator", "1.15.2"
|
13
|
-
end
|
14
|
-
|
15
13
|
group :debug do
|
16
|
-
gem "pry"
|
14
|
+
gem "pry", "~>0.12"
|
17
15
|
gem "pry-byebug"
|
18
16
|
gem "pry-stack_explorer"
|
19
17
|
end
|
20
18
|
|
21
19
|
group :chefstyle do
|
22
|
-
gem "chefstyle"
|
23
|
-
end
|
24
|
-
|
25
|
-
group :docs do
|
26
|
-
gem "yard"
|
27
|
-
end
|
20
|
+
gem "chefstyle", "2.0.5"
|
21
|
+
end
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
require "cucumber"
|
12
12
|
require "cucumber/rake/task"
|
13
13
|
Cucumber::Rake::Task.new(:features) do |t|
|
14
|
-
t.cucumber_opts = ["features", "-x", "--format progress", "--no-color", "--tags
|
14
|
+
t.cucumber_opts = ["features", "-x", "--format progress", "--no-color", "--tags 'not @ignore'"]
|
15
15
|
end
|
16
16
|
rescue LoadError
|
17
17
|
puts "cucumber is not available. (sudo) gem install cucumber to run tests."
|
@@ -41,30 +41,8 @@ end
|
|
41
41
|
desc "Run all quality tasks"
|
42
42
|
task quality: %i{style stats}
|
43
43
|
|
44
|
-
begin
|
45
|
-
require "yard" unless defined?(YARD)
|
46
|
-
YARD::Rake::YardocTask.new
|
47
|
-
rescue LoadError
|
48
|
-
puts "yard is not available. (sudo) gem install yard to generate yard documentation."
|
49
|
-
end
|
50
|
-
|
51
44
|
task default: %i{test quality}
|
52
45
|
|
53
|
-
begin
|
54
|
-
require "github_changelog_generator/task"
|
55
|
-
require "kitchen/version"
|
56
|
-
|
57
|
-
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
58
|
-
config.future_release = "v#{Kitchen::VERSION}"
|
59
|
-
config.enhancement_labels = "enhancement,Enhancement,New Feature,Feature,Improvement".split(",")
|
60
|
-
config.bug_labels = "bug,Bug".split(",")
|
61
|
-
config.exclude_labels = %w{Duplicate Question Discussion No_Changelog}
|
62
|
-
end
|
63
|
-
rescue LoadError
|
64
|
-
puts "github_changelog_generator is not available." \
|
65
|
-
" (sudo) gem install github_changelog_generator to generate changelogs"
|
66
|
-
end
|
67
|
-
|
68
46
|
namespace :docs do
|
69
47
|
desc "Deploy docs"
|
70
48
|
task :deploy do
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module Kitchen
|
20
|
+
# Common Dependency Injection wiring for ChefUtils-related modules
|
21
|
+
module ChefUtilsWiring
|
22
|
+
private
|
23
|
+
|
24
|
+
def __config
|
25
|
+
# this would need to be some kind of Chef::Config looking thing, which probably requires
|
26
|
+
# a translation object from t-k config to Chef::Config layout if that ever becomes necessary.
|
27
|
+
# this ISNT the t-k config.
|
28
|
+
{}
|
29
|
+
end
|
30
|
+
|
31
|
+
def __log
|
32
|
+
@logger
|
33
|
+
end
|
34
|
+
|
35
|
+
def __transport_connection
|
36
|
+
# this could be wired up to train at some point, but need to be careful because about local vs. remote
|
37
|
+
# uses of helpers with test-kitchen, right now we're using it for local.
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/kitchen/cli.rb
CHANGED
@@ -285,7 +285,7 @@ module Kitchen
|
|
285
285
|
perform("exec", "exec", args)
|
286
286
|
end
|
287
287
|
|
288
|
-
desc "version", "Print Kitchen's version information"
|
288
|
+
desc "version", "Print Test Kitchen's version information"
|
289
289
|
def version
|
290
290
|
puts "Test Kitchen version #{Kitchen::VERSION}"
|
291
291
|
end
|
@@ -296,7 +296,7 @@ module Kitchen
|
|
296
296
|
perform("sink", "sink")
|
297
297
|
end
|
298
298
|
|
299
|
-
desc "console", "Kitchen Console!"
|
299
|
+
desc "console", "Test Kitchen Console!"
|
300
300
|
def console
|
301
301
|
perform("console", "console")
|
302
302
|
end
|
data/lib/kitchen/configurable.rb
CHANGED
@@ -149,7 +149,7 @@ module Kitchen
|
|
149
149
|
# @return [String] joined path for instance's os_type
|
150
150
|
def remote_path_join(*parts)
|
151
151
|
path = File.join(*parts)
|
152
|
-
windows_os? ? path.tr("/",
|
152
|
+
windows_os? ? path.tr("/", "\\") : path.tr("\\", "/")
|
153
153
|
end
|
154
154
|
|
155
155
|
# @return [TrueClass,FalseClass] true if `:os_type` is `"unix"` (or
|
data/lib/kitchen/data_munger.rb
CHANGED
@@ -720,12 +720,14 @@ module Kitchen
|
|
720
720
|
move_data_to!(:provisioner, suite, :attributes)
|
721
721
|
move_data_to!(:provisioner, suite, :run_list)
|
722
722
|
move_data_to!(:provisioner, suite, :named_run_list)
|
723
|
+
move_data_to!(:provisioner, suite, :policy_group)
|
723
724
|
end
|
724
725
|
|
725
726
|
data.fetch(:platforms, []).each do |platform|
|
726
727
|
move_data_to!(:provisioner, platform, :attributes)
|
727
728
|
move_data_to!(:provisioner, platform, :run_list)
|
728
729
|
move_data_to!(:provisioner, platform, :named_run_list)
|
730
|
+
move_data_to!(:provisioner, platform, :policy_group)
|
729
731
|
end
|
730
732
|
end
|
731
733
|
|
@@ -18,8 +18,14 @@ module Kitchen
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
begin
|
22
|
+
conn = instance.transport.connection(state_file.read)
|
23
|
+
conn.execute(command)
|
24
|
+
rescue Kitchen::Transport::SshFailed => e
|
25
|
+
return if hook[:skippable] && e.message.match(/^SSH exited \(\d{1,3}\) for command: \[.+\]$/)
|
26
|
+
|
27
|
+
raise
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
private
|
data/lib/kitchen/logger.rb
CHANGED
@@ -293,11 +293,11 @@ module Kitchen
|
|
293
293
|
logger = StdoutLogger.new(stdout)
|
294
294
|
if colorize
|
295
295
|
logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
296
|
-
Color.colorize(msg.to_s, color).concat("\n")
|
296
|
+
Color.colorize(msg.dup.to_s, color).concat("\n")
|
297
297
|
end
|
298
298
|
else
|
299
299
|
logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
300
|
-
msg.concat("\n")
|
300
|
+
msg.dup.concat("\n")
|
301
301
|
end
|
302
302
|
end
|
303
303
|
logger
|
data/lib/kitchen/provisioner.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
3
|
#
|
4
4
|
# Copyright (C) 2013, Fletcher Nichol
|
5
|
+
# Copyright (C) Chef Software Inc.
|
5
6
|
#
|
6
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
8
|
# you may not use this file except in compliance with the License.
|
@@ -25,7 +26,7 @@ module Kitchen
|
|
25
26
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
26
27
|
module Provisioner
|
27
28
|
# Default provisioner to use
|
28
|
-
DEFAULT_PLUGIN = "
|
29
|
+
DEFAULT_PLUGIN = "chef_infra".freeze
|
29
30
|
|
30
31
|
# Returns an instance of a provisioner given a plugin type string.
|
31
32
|
#
|
@@ -34,6 +35,7 @@ module Kitchen
|
|
34
35
|
# @return [Provisioner::Base] a provisioner instance
|
35
36
|
# @raise [ClientError] if a provisioner instance could not be created
|
36
37
|
def self.for_plugin(plugin, config)
|
38
|
+
plugin, config[:name] = "chef_infra", "chef_infra" if plugin == "chef_zero"
|
37
39
|
Kitchen::Plugin.load(self, plugin, config)
|
38
40
|
end
|
39
41
|
end
|
@@ -74,7 +74,7 @@ module Kitchen
|
|
74
74
|
|
75
75
|
instance.transport.connection(state) do |conn|
|
76
76
|
config[:uploads].to_h.each do |locals, remote|
|
77
|
-
debug("Uploading #{Array(locals).join(
|
77
|
+
debug("Uploading #{Array(locals).join(", ")} to #{remote}")
|
78
78
|
conn.upload(locals.to_s, remote)
|
79
79
|
end
|
80
80
|
conn.execute(install_command)
|
@@ -177,11 +177,9 @@ module Kitchen
|
|
177
177
|
# @raise [ClientError] if the sandbox directory has no yet been created
|
178
178
|
# by calling `#create_sandbox`
|
179
179
|
def sandbox_path
|
180
|
-
@sandbox_path ||=
|
181
|
-
raise ClientError, "Sandbox directory has not yet " \
|
180
|
+
@sandbox_path ||= raise ClientError, "Sandbox directory has not yet " \
|
182
181
|
"been created. Please run #{self.class}#create_sandox before " \
|
183
182
|
"trying to access the path."
|
184
|
-
end
|
185
183
|
end
|
186
184
|
|
187
185
|
# Deletes the sandbox path. Without calling this method, the sandbox path
|
@@ -73,6 +73,10 @@ module Kitchen
|
|
73
73
|
# @api private
|
74
74
|
attr_reader :sandbox_path
|
75
75
|
|
76
|
+
# @return [String] name of the policy_group, nil results in "local"
|
77
|
+
# @api private
|
78
|
+
attr_reader :policy_group
|
79
|
+
|
76
80
|
# Generates a list of all files in the cookbooks directory in the
|
77
81
|
# sandbox path.
|
78
82
|
#
|
@@ -281,19 +285,17 @@ module Kitchen
|
|
281
285
|
end
|
282
286
|
|
283
287
|
def update_dna_for_policyfile
|
284
|
-
|
285
|
-
|
286
|
-
"kitchen config. The run_list in your config will be ignored.")
|
287
|
-
warn("Ignored run_list: #{config[:run_list].inspect}")
|
288
|
-
end
|
289
|
-
policy = Chef::Policyfile.new(policyfile, sandbox_path,
|
288
|
+
policy = Chef::Policyfile.new(
|
289
|
+
policyfile, sandbox_path,
|
290
290
|
logger: logger,
|
291
|
-
always_update: config[:always_update_cookbooks]
|
291
|
+
always_update: config[:always_update_cookbooks],
|
292
|
+
policy_group: policy_group
|
293
|
+
)
|
292
294
|
Kitchen.mutex.synchronize do
|
293
295
|
policy.compile
|
294
296
|
end
|
295
297
|
policy_name = JSON.parse(IO.read(policy.lockfile))["name"]
|
296
|
-
policy_group = "local"
|
298
|
+
policy_group = config[:policy_group] || "local"
|
297
299
|
config[:attributes].merge(policy_name: policy_name, policy_group: policy_group)
|
298
300
|
end
|
299
301
|
|
@@ -302,9 +304,12 @@ module Kitchen
|
|
302
304
|
# @api private
|
303
305
|
def resolve_with_policyfile
|
304
306
|
Kitchen.mutex.synchronize do
|
305
|
-
Chef::Policyfile.new(
|
307
|
+
Chef::Policyfile.new(
|
308
|
+
policyfile, sandbox_path,
|
306
309
|
logger: logger,
|
307
|
-
always_update: config[:always_update_cookbooks]
|
310
|
+
always_update: config[:always_update_cookbooks],
|
311
|
+
policy_group: config[:policy_group]
|
312
|
+
).resolve
|
308
313
|
end
|
309
314
|
end
|
310
315
|
|
@@ -21,6 +21,7 @@ require "rbconfig" unless defined?(RbConfig)
|
|
21
21
|
require_relative "../../errors"
|
22
22
|
require_relative "../../logging"
|
23
23
|
require_relative "../../shell_out"
|
24
|
+
require_relative "../../which"
|
24
25
|
|
25
26
|
module Kitchen
|
26
27
|
module Provisioner
|
@@ -31,6 +32,7 @@ module Kitchen
|
|
31
32
|
class Policyfile
|
32
33
|
include Logging
|
33
34
|
include ShellOut
|
35
|
+
include Which
|
34
36
|
|
35
37
|
# Creates a new cookbook resolver.
|
36
38
|
#
|
@@ -39,11 +41,12 @@ module Kitchen
|
|
39
41
|
# cookbooks
|
40
42
|
# @param logger [Kitchen::Logger] a logger to use for output, defaults
|
41
43
|
# to `Kitchen.logger`
|
42
|
-
def initialize(policyfile, path, logger: Kitchen.logger, always_update: false)
|
43
|
-
@policyfile
|
44
|
-
@path
|
45
|
-
@logger
|
44
|
+
def initialize(policyfile, path, logger: Kitchen.logger, always_update: false, policy_group: nil)
|
45
|
+
@policyfile = policyfile
|
46
|
+
@path = path
|
47
|
+
@logger = logger
|
46
48
|
@always_update = always_update
|
49
|
+
@policy_group = policy_group
|
47
50
|
end
|
48
51
|
|
49
52
|
# Loads the library code required to use the resolver.
|
@@ -51,30 +54,34 @@ module Kitchen
|
|
51
54
|
# @param logger [Kitchen::Logger] a logger to use for output, defaults
|
52
55
|
# to `Kitchen.logger`
|
53
56
|
def self.load!(logger: Kitchen.logger)
|
54
|
-
|
57
|
+
# intentionally left blank
|
55
58
|
end
|
56
59
|
|
57
60
|
# Performs the cookbook resolution and vendors the resulting cookbooks
|
58
61
|
# in the desired path.
|
59
62
|
def resolve
|
60
|
-
|
61
|
-
|
63
|
+
if policy_group
|
64
|
+
info("Exporting cookbook dependencies from Policyfile #{path} with policy_group #{policy_group} using `#{cli_path} export`...")
|
65
|
+
run_command("#{cli_path} export #{escape_path(policyfile)} #{escape_path(path)} --policy_group #{policy_group} --force")
|
66
|
+
else
|
67
|
+
info("Exporting cookbook dependencies from Policyfile #{path} using `#{cli_path} export`...")
|
68
|
+
run_command("#{cli_path} export #{escape_path(policyfile)} #{escape_path(path)} --force")
|
69
|
+
end
|
62
70
|
end
|
63
71
|
|
64
72
|
# Runs `chef install` to determine the correct cookbook set and
|
65
73
|
# generate the policyfile lock.
|
66
74
|
def compile
|
67
75
|
if File.exist?(lockfile)
|
68
|
-
info("Installing cookbooks for Policyfile #{policyfile} using
|
76
|
+
info("Installing cookbooks for Policyfile #{policyfile} using `#{cli_path} install`")
|
69
77
|
else
|
70
|
-
info("Policy lock file doesn't exist, running
|
71
|
-
"Policyfile #{policyfile}...")
|
78
|
+
info("Policy lock file doesn't exist, running `#{cli_path} install` for Policyfile #{policyfile}...")
|
72
79
|
end
|
73
|
-
run_command("
|
80
|
+
run_command("#{cli_path} install #{escape_path(policyfile)}")
|
74
81
|
|
75
82
|
if always_update
|
76
|
-
info("Updating policy lock using
|
77
|
-
run_command("
|
83
|
+
info("Updating policy lock using `#{cli_path} update`")
|
84
|
+
run_command("#{cli_path} update #{escape_path(policyfile)}")
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
@@ -103,6 +110,10 @@ module Kitchen
|
|
103
110
|
# @api private
|
104
111
|
attr_reader :always_update
|
105
112
|
|
113
|
+
# @return [String] name of the policy_group, nil results in "local"
|
114
|
+
# @api private
|
115
|
+
attr_reader :policy_group
|
116
|
+
|
106
117
|
# Escape spaces in a path in way that works with both Sh (Unix) and
|
107
118
|
# Windows.
|
108
119
|
#
|
@@ -117,7 +128,7 @@ module Kitchen
|
|
117
128
|
# Windows command line parsing libraries. This covers the 99% case of
|
118
129
|
# spaces in the path without breaking other stuff.
|
119
130
|
if /[ \t\n\v"]/.match?(path)
|
120
|
-
"\"#{path.gsub(/[ \t\n\v\"\\]/) { |m|
|
131
|
+
"\"#{path.gsub(/[ \t\n\v\"\\]/) { |m| "\\" + m[0] }}\""
|
121
132
|
else
|
122
133
|
path
|
123
134
|
end
|
@@ -126,33 +137,24 @@ module Kitchen
|
|
126
137
|
end
|
127
138
|
end
|
128
139
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
end
|
148
|
-
logger.fatal("The `chef` executable cannot be found in your " \
|
149
|
-
"PATH. Ensure you have installed Chef Workstation " \
|
150
|
-
"from https://downloads.chef.io and that your PATH " \
|
151
|
-
"setting includes the path to the `chef` command.")
|
152
|
-
raise UserError,
|
153
|
-
"Could not find the chef executable in your PATH."
|
154
|
-
end
|
155
|
-
end
|
140
|
+
# Find the `chef` or `chef-cli` commands in the path or raise `chef` is present in
|
141
|
+
# ChefDK / Workstation releases, but is no longer shipped in any gems now that we
|
142
|
+
# use a Go based wrapper for the `chef` command in Workstation. The Ruby CLI has been
|
143
|
+
# renamed `chef-cli` under the hood and is shipped in the `chef-cli` gem.
|
144
|
+
#
|
145
|
+
# @api private
|
146
|
+
# @returns [String]
|
147
|
+
def cli_path
|
148
|
+
@cli_path ||= which("chef-cli") || which("chef") || no_cli_found_error
|
149
|
+
end
|
150
|
+
|
151
|
+
# @api private
|
152
|
+
def no_cli_found_error
|
153
|
+
@logger.fatal("The `chef` or `chef-cli` executables cannot be found in your " \
|
154
|
+
"PATH. Ensure you have installed Chef Workstation " \
|
155
|
+
"from https://downloads.chef.io and that your PATH " \
|
156
|
+
"setting includes the path to the `chef` or `chef-cli` commands.")
|
157
|
+
raise UserError, "Could not find the chef or chef-cli executables in your PATH."
|
156
158
|
end
|
157
159
|
|
158
160
|
end
|
@@ -46,6 +46,7 @@ module Kitchen
|
|
46
46
|
default_config :chef_omnibus_install_options, nil
|
47
47
|
default_config :chef_license, nil
|
48
48
|
default_config :run_list, []
|
49
|
+
default_config :policy_group, nil
|
49
50
|
default_config :attributes, {}
|
50
51
|
default_config :config_path, nil
|
51
52
|
default_config :log_file, nil
|
@@ -63,7 +64,7 @@ module Kitchen
|
|
63
64
|
default_config :berksfile_path, nil
|
64
65
|
# If set to true (which is the default from `chef generate`), try to update
|
65
66
|
# backend cookbook downloader on every kitchen run.
|
66
|
-
default_config :always_update_cookbooks,
|
67
|
+
default_config :always_update_cookbooks, true
|
67
68
|
default_config :cookbook_files_glob, %w(
|
68
69
|
README.* VERSION metadata.{json,rb} attributes.rb recipe.rb
|
69
70
|
attributes/**/* definitions/**/* files/**/* libraries/**/*
|
@@ -441,7 +442,7 @@ module Kitchen
|
|
441
442
|
if obj.is_a?(String) && obj =~ /^:/
|
442
443
|
obj
|
443
444
|
elsif obj.is_a?(String)
|
444
|
-
%{"#{obj.gsub(/\\/,
|
445
|
+
%{"#{obj.gsub(/\\/, "\\\\\\\\")}"}
|
445
446
|
elsif obj.is_a?(Array)
|
446
447
|
%{[#{obj.map { |i| format_value(i) }.join(", ")}]}
|
447
448
|
else
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
3
|
+
#
|
4
|
+
# Copyright (C) 2013, Fletcher Nichol
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require_relative "chef_base"
|
19
|
+
|
20
|
+
module Kitchen
|
21
|
+
module Provisioner
|
22
|
+
# Chef Zero provisioner.
|
23
|
+
#
|
24
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
25
|
+
class ChefInfra < ChefBase
|
26
|
+
kitchen_provisioner_api_version 2
|
27
|
+
|
28
|
+
plugin_version Kitchen::VERSION
|
29
|
+
|
30
|
+
default_config :client_rb, {}
|
31
|
+
default_config :named_run_list, {}
|
32
|
+
default_config :json_attributes, true
|
33
|
+
default_config :chef_zero_host, nil
|
34
|
+
default_config :chef_zero_port, 8889
|
35
|
+
|
36
|
+
default_config :chef_client_path do |provisioner|
|
37
|
+
provisioner
|
38
|
+
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} bin chef-client})
|
39
|
+
.tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
40
|
+
end
|
41
|
+
|
42
|
+
default_config :ruby_bindir do |provisioner|
|
43
|
+
provisioner
|
44
|
+
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} embedded bin})
|
45
|
+
end
|
46
|
+
|
47
|
+
# (see Base#create_sandbox)
|
48
|
+
def create_sandbox
|
49
|
+
super
|
50
|
+
prepare_validation_pem
|
51
|
+
prepare_config_rb
|
52
|
+
end
|
53
|
+
|
54
|
+
def run_command
|
55
|
+
cmd = "#{sudo(config[:chef_client_path])} --local-mode".tap { |str| str.insert(0, "& ") if powershell_shell? }
|
56
|
+
|
57
|
+
chef_cmd(cmd)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# Adds optional flags to a chef-client command, depending on
|
63
|
+
# configuration data. Note that this method mutates the incoming Array.
|
64
|
+
#
|
65
|
+
# @param args [Array<String>] array of flags
|
66
|
+
# @api private
|
67
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
68
|
+
def add_optional_chef_client_args!(args)
|
69
|
+
if config[:json_attributes]
|
70
|
+
json = remote_path_join(config[:root_path], "dna.json")
|
71
|
+
args << "--json-attributes #{json}"
|
72
|
+
end
|
73
|
+
|
74
|
+
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
75
|
+
|
76
|
+
# these flags are chef-client local mode only and will not work
|
77
|
+
# on older versions of chef-client
|
78
|
+
if config[:chef_zero_host]
|
79
|
+
args << "--chef-zero-host #{config[:chef_zero_host]}"
|
80
|
+
end
|
81
|
+
|
82
|
+
if config[:chef_zero_port]
|
83
|
+
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
84
|
+
end
|
85
|
+
|
86
|
+
args << "--profile-ruby" if config[:profile_ruby]
|
87
|
+
|
88
|
+
if config[:slow_resource_report]
|
89
|
+
if config[:slow_resource_report].is_a?(Integer)
|
90
|
+
args << "--slow-report #{config[:slow_resource_report]}"
|
91
|
+
else
|
92
|
+
args << "--slow-report"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
97
|
+
|
98
|
+
# Returns an Array of command line arguments for the chef client.
|
99
|
+
#
|
100
|
+
# @return [Array<String>] an array of command line arguments
|
101
|
+
# @api private
|
102
|
+
def chef_args(client_rb_filename)
|
103
|
+
level = config[:log_level]
|
104
|
+
args = [
|
105
|
+
"--config #{remote_path_join(config[:root_path], client_rb_filename)}",
|
106
|
+
"--log_level #{level}",
|
107
|
+
"--force-formatter",
|
108
|
+
"--no-color",
|
109
|
+
]
|
110
|
+
add_optional_chef_client_args!(args)
|
111
|
+
|
112
|
+
args
|
113
|
+
end
|
114
|
+
|
115
|
+
# Generates a string of shell environment variables needed for the
|
116
|
+
# chef-client-zero.rb shim script to properly function.
|
117
|
+
#
|
118
|
+
# @return [String] a shell script string
|
119
|
+
# @api private
|
120
|
+
def chef_client_zero_env
|
121
|
+
root = config[:root_path]
|
122
|
+
gem_home = gem_path = remote_path_join(root, "chef-client-zero-gems")
|
123
|
+
gem_cache = remote_path_join(gem_home, "cache")
|
124
|
+
|
125
|
+
[
|
126
|
+
shell_env_var("CHEF_REPO_PATH", root),
|
127
|
+
shell_env_var("GEM_HOME", gem_home),
|
128
|
+
shell_env_var("GEM_PATH", gem_path),
|
129
|
+
shell_env_var("GEM_CACHE", gem_cache),
|
130
|
+
].join("\n").concat("\n")
|
131
|
+
end
|
132
|
+
|
133
|
+
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
134
|
+
#
|
135
|
+
# @api private
|
136
|
+
def prepare_validation_pem
|
137
|
+
info("Preparing validation.pem")
|
138
|
+
debug("Using a dummy validation.pem")
|
139
|
+
|
140
|
+
source = File.join(File.dirname(__FILE__),
|
141
|
+
%w{.. .. .. support dummy-validation.pem})
|
142
|
+
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
143
|
+
end
|
144
|
+
|
145
|
+
# Returns the command that will run a backwards compatible shim script
|
146
|
+
# that approximates local mode in a modern chef-client run.
|
147
|
+
#
|
148
|
+
# @return [String] the command string
|
149
|
+
# @api private
|
150
|
+
def shim_command
|
151
|
+
ruby = remote_path_join(config[:ruby_bindir], "ruby")
|
152
|
+
.tap { |path| path.concat(".exe") if windows_os? }
|
153
|
+
shim = remote_path_join(config[:root_path], "chef-client-zero.rb")
|
154
|
+
|
155
|
+
"#{chef_client_zero_env}\n#{sudo(ruby)} #{shim}"
|
156
|
+
end
|
157
|
+
|
158
|
+
# This provisioner supports policyfiles, so override the default (which
|
159
|
+
# is false)
|
160
|
+
# @return [true] always returns true
|
161
|
+
# @api private
|
162
|
+
def supports_policyfile?
|
163
|
+
true
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
@@ -1,156 +1,12 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (C) 2013, Fletcher Nichol
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
|
18
|
-
require_relative "chef_base"
|
1
|
+
# Deprecated AS PER THE PR - https://github.com/test-kitchen/test-kitchen/pull/1730
|
2
|
+
require_relative "chef_infra"
|
19
3
|
|
20
4
|
module Kitchen
|
21
5
|
module Provisioner
|
22
6
|
# Chef Zero provisioner.
|
23
7
|
#
|
24
8
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
25
|
-
class ChefZero <
|
26
|
-
kitchen_provisioner_api_version 2
|
27
|
-
|
28
|
-
plugin_version Kitchen::VERSION
|
29
|
-
|
30
|
-
default_config :client_rb, {}
|
31
|
-
default_config :named_run_list, {}
|
32
|
-
default_config :json_attributes, true
|
33
|
-
default_config :chef_zero_host, nil
|
34
|
-
default_config :chef_zero_port, 8889
|
35
|
-
|
36
|
-
default_config :chef_client_path do |provisioner|
|
37
|
-
provisioner
|
38
|
-
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} bin chef-client})
|
39
|
-
.tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
40
|
-
end
|
41
|
-
|
42
|
-
default_config :ruby_bindir do |provisioner|
|
43
|
-
provisioner
|
44
|
-
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} embedded bin})
|
45
|
-
end
|
46
|
-
|
47
|
-
# (see Base#create_sandbox)
|
48
|
-
def create_sandbox
|
49
|
-
super
|
50
|
-
prepare_validation_pem
|
51
|
-
prepare_config_rb
|
52
|
-
end
|
53
|
-
|
54
|
-
def run_command
|
55
|
-
cmd = "#{sudo(config[:chef_client_path])} --local-mode".tap { |str| str.insert(0, "& ") if powershell_shell? }
|
56
|
-
|
57
|
-
chef_cmd(cmd)
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
# Adds optional flags to a chef-client command, depending on
|
63
|
-
# configuration data. Note that this method mutates the incoming Array.
|
64
|
-
#
|
65
|
-
# @param args [Array<String>] array of flags
|
66
|
-
# @api private
|
67
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
68
|
-
def add_optional_chef_client_args!(args)
|
69
|
-
if config[:json_attributes]
|
70
|
-
json = remote_path_join(config[:root_path], "dna.json")
|
71
|
-
args << "--json-attributes #{json}"
|
72
|
-
end
|
73
|
-
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
74
|
-
|
75
|
-
# these flags are chef-client local mode only and will not work
|
76
|
-
# on older versions of chef-client
|
77
|
-
if config[:chef_zero_host]
|
78
|
-
args << "--chef-zero-host #{config[:chef_zero_host]}"
|
79
|
-
end
|
80
|
-
if config[:chef_zero_port]
|
81
|
-
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
82
|
-
end
|
83
|
-
args << "--profile-ruby" if config[:profile_ruby]
|
84
|
-
end
|
85
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
86
|
-
|
87
|
-
# Returns an Array of command line arguments for the chef client.
|
88
|
-
#
|
89
|
-
# @return [Array<String>] an array of command line arguments
|
90
|
-
# @api private
|
91
|
-
def chef_args(client_rb_filename)
|
92
|
-
level = config[:log_level]
|
93
|
-
args = [
|
94
|
-
"--config #{remote_path_join(config[:root_path], client_rb_filename)}",
|
95
|
-
"--log_level #{level}",
|
96
|
-
"--force-formatter",
|
97
|
-
"--no-color",
|
98
|
-
]
|
99
|
-
add_optional_chef_client_args!(args)
|
100
|
-
|
101
|
-
args
|
102
|
-
end
|
103
|
-
|
104
|
-
# Generates a string of shell environment variables needed for the
|
105
|
-
# chef-client-zero.rb shim script to properly function.
|
106
|
-
#
|
107
|
-
# @return [String] a shell script string
|
108
|
-
# @api private
|
109
|
-
def chef_client_zero_env
|
110
|
-
root = config[:root_path]
|
111
|
-
gem_home = gem_path = remote_path_join(root, "chef-client-zero-gems")
|
112
|
-
gem_cache = remote_path_join(gem_home, "cache")
|
113
|
-
|
114
|
-
[
|
115
|
-
shell_env_var("CHEF_REPO_PATH", root),
|
116
|
-
shell_env_var("GEM_HOME", gem_home),
|
117
|
-
shell_env_var("GEM_PATH", gem_path),
|
118
|
-
shell_env_var("GEM_CACHE", gem_cache),
|
119
|
-
].join("\n").concat("\n")
|
120
|
-
end
|
121
|
-
|
122
|
-
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
123
|
-
#
|
124
|
-
# @api private
|
125
|
-
def prepare_validation_pem
|
126
|
-
info("Preparing validation.pem")
|
127
|
-
debug("Using a dummy validation.pem")
|
128
|
-
|
129
|
-
source = File.join(File.dirname(__FILE__),
|
130
|
-
%w{.. .. .. support dummy-validation.pem})
|
131
|
-
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
132
|
-
end
|
133
|
-
|
134
|
-
# Returns the command that will run a backwards compatible shim script
|
135
|
-
# that approximates local mode in a modern chef-client run.
|
136
|
-
#
|
137
|
-
# @return [String] the command string
|
138
|
-
# @api private
|
139
|
-
def shim_command
|
140
|
-
ruby = remote_path_join(config[:ruby_bindir], "ruby")
|
141
|
-
.tap { |path| path.concat(".exe") if windows_os? }
|
142
|
-
shim = remote_path_join(config[:root_path], "chef-client-zero.rb")
|
143
|
-
|
144
|
-
"#{chef_client_zero_env}\n#{sudo(ruby)} #{shim}"
|
145
|
-
end
|
146
|
-
|
147
|
-
# This provisioner supports policyfiles, so override the default (which
|
148
|
-
# is false)
|
149
|
-
# @return [true] always returns true
|
150
|
-
# @api private
|
151
|
-
def supports_policyfile?
|
152
|
-
true
|
153
|
-
end
|
9
|
+
class ChefZero < ChefInfra
|
154
10
|
end
|
155
11
|
end
|
156
12
|
end
|
@@ -195,18 +195,16 @@ module Kitchen
|
|
195
195
|
FileUtils.mkdir_p(File.dirname(local))
|
196
196
|
|
197
197
|
Array(remotes).each do |file|
|
198
|
+
logger.debug("Attempting to download '#{file}' as file")
|
199
|
+
session.scp.download!(file, local)
|
200
|
+
rescue Net::SCP::Error
|
198
201
|
begin
|
199
|
-
logger.debug("Attempting to download '#{file}' as
|
200
|
-
session.scp.download!(file, local)
|
202
|
+
logger.debug("Attempting to download '#{file}' as directory")
|
203
|
+
session.scp.download!(file, local, recursive: true)
|
201
204
|
rescue Net::SCP::Error
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
rescue Net::SCP::Error
|
206
|
-
logger.warn(
|
207
|
-
"SCP download failed for file or directory '#{file}', perhaps it does not exist?"
|
208
|
-
)
|
209
|
-
end
|
205
|
+
logger.warn(
|
206
|
+
"SCP download failed for file or directory '#{file}', perhaps it does not exist?"
|
207
|
+
)
|
210
208
|
end
|
211
209
|
end
|
212
210
|
rescue Net::SSH::Exception => ex
|
@@ -365,11 +365,9 @@ module Kitchen
|
|
365
365
|
# @return [Winrm::Shells::Elevated] the elevated shell
|
366
366
|
# @api private
|
367
367
|
def elevated_session(retry_options = {})
|
368
|
-
@elevated_session ||=
|
369
|
-
|
370
|
-
|
371
|
-
shell.password = options[:elevated_password]
|
372
|
-
end
|
368
|
+
@elevated_session ||= connection(retry_options).shell(:elevated).tap do |shell|
|
369
|
+
shell.username = options[:elevated_username]
|
370
|
+
shell.password = options[:elevated_password]
|
373
371
|
end
|
374
372
|
end
|
375
373
|
|
@@ -169,11 +169,9 @@ module Kitchen
|
|
169
169
|
# @raise [ClientError] if the sandbox directory has no yet been created
|
170
170
|
# by calling `#create_sandbox`
|
171
171
|
def sandbox_path
|
172
|
-
@sandbox_path ||=
|
173
|
-
raise ClientError, "Sandbox directory has not yet " \
|
172
|
+
@sandbox_path ||= raise ClientError, "Sandbox directory has not yet " \
|
174
173
|
"been created. Please run #{self.class}#create_sandox before " \
|
175
174
|
"trying to access the path."
|
176
|
-
end
|
177
175
|
end
|
178
176
|
|
179
177
|
# Sets the API version for this verifier. If the verifier does not set
|
@@ -88,6 +88,7 @@ module Kitchen
|
|
88
88
|
env_state[:environment]["KITCHEN_INSTANCE"] = instance.name
|
89
89
|
env_state[:environment]["KITCHEN_PLATFORM"] = instance.platform.name
|
90
90
|
env_state[:environment]["KITCHEN_SUITE"] = instance.suite.name
|
91
|
+
env_state[:environment]["KITCHEN_USERNAME"] = instance.transport[:username] if instance.respond_to?(:transport)
|
91
92
|
state.each_pair do |key, value|
|
92
93
|
env_state[:environment]["KITCHEN_" + key.to_s.upcase] = value.to_s
|
93
94
|
end
|
data/lib/kitchen/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright:: Copyright (c) Chef Software Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
require "chef-utils/dsl/which" unless defined?(ChefUtils::DSL::Which)
|
19
|
+
require_relative "chef_utils_wiring" unless defined?(Kitchen::ChefUtilsWiring)
|
20
|
+
|
21
|
+
module Kitchen
|
22
|
+
module Which
|
23
|
+
include ChefUtils::DSL::Which
|
24
|
+
include ChefUtilsWiring
|
25
|
+
end
|
26
|
+
end
|
data/test-kitchen.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.executables = %w{kitchen}
|
21
21
|
gem.require_paths = ["lib"]
|
22
22
|
|
23
|
-
gem.required_ruby_version = ">= 2.
|
23
|
+
gem.required_ruby_version = ">= 2.5"
|
24
24
|
|
25
25
|
gem.add_dependency "mixlib-shellout", ">= 1.2", "< 4.0"
|
26
26
|
gem.add_dependency "net-scp", ">= 1.1", "< 4.0" # pinning until we can confirm 4+ works
|
@@ -33,6 +33,7 @@ Gem::Specification.new do |gem|
|
|
33
33
|
gem.add_dependency "winrm", "~> 2.0"
|
34
34
|
gem.add_dependency "winrm-elevated", "~> 1.0"
|
35
35
|
gem.add_dependency "winrm-fs", "~> 1.1"
|
36
|
+
gem.add_dependency "chef-utils", ">= 16.4.35"
|
36
37
|
# Required to run the Chef provisioner local license check for remote systems
|
37
38
|
# TK is not under Chef EULA
|
38
39
|
gem.add_dependency "license-acceptance", ">= 1.0.11", "< 3.0" # pinning until we can confirm 3+ works
|
@@ -43,7 +44,7 @@ Gem::Specification.new do |gem|
|
|
43
44
|
|
44
45
|
gem.add_development_dependency "aruba", "~> 0.11", "< 1.0"
|
45
46
|
gem.add_development_dependency "fakefs", "~> 1.0"
|
46
|
-
gem.add_development_dependency "minitest", "~> 5.3", "< 5.
|
47
|
+
gem.add_development_dependency "minitest", "~> 5.3", "< 5.15"
|
47
48
|
gem.add_development_dependency "mocha", "~> 1.1"
|
48
49
|
gem.add_development_dependency "cucumber", ">= 2.1", "< 4.0" # we just need to validate 4.0 when it comes out
|
49
50
|
gem.add_development_dependency "countloc", "~> 0.4"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-kitchen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fletcher Nichol
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mixlib-shellout
|
@@ -194,6 +194,20 @@ dependencies:
|
|
194
194
|
- - "~>"
|
195
195
|
- !ruby/object:Gem::Version
|
196
196
|
version: '1.1'
|
197
|
+
- !ruby/object:Gem::Dependency
|
198
|
+
name: chef-utils
|
199
|
+
requirement: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: 16.4.35
|
204
|
+
type: :runtime
|
205
|
+
prerelease: false
|
206
|
+
version_requirements: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - ">="
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: 16.4.35
|
197
211
|
- !ruby/object:Gem::Dependency
|
198
212
|
name: license-acceptance
|
199
213
|
requirement: !ruby/object:Gem::Requirement
|
@@ -299,7 +313,7 @@ dependencies:
|
|
299
313
|
version: '5.3'
|
300
314
|
- - "<"
|
301
315
|
- !ruby/object:Gem::Version
|
302
|
-
version: '5.
|
316
|
+
version: '5.15'
|
303
317
|
type: :development
|
304
318
|
prerelease: false
|
305
319
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -309,7 +323,7 @@ dependencies:
|
|
309
323
|
version: '5.3'
|
310
324
|
- - "<"
|
311
325
|
- !ruby/object:Gem::Version
|
312
|
-
version: '5.
|
326
|
+
version: '5.15'
|
313
327
|
- !ruby/object:Gem::Dependency
|
314
328
|
name: mocha
|
315
329
|
requirement: !ruby/object:Gem::Requirement
|
@@ -387,6 +401,7 @@ files:
|
|
387
401
|
- bin/kitchen
|
388
402
|
- lib/kitchen.rb
|
389
403
|
- lib/kitchen/base64_stream.rb
|
404
|
+
- lib/kitchen/chef_utils_wiring.rb
|
390
405
|
- lib/kitchen/cli.rb
|
391
406
|
- lib/kitchen/collection.rb
|
392
407
|
- lib/kitchen/color.rb
|
@@ -434,6 +449,7 @@ files:
|
|
434
449
|
- lib/kitchen/provisioner/chef/policyfile.rb
|
435
450
|
- lib/kitchen/provisioner/chef_apply.rb
|
436
451
|
- lib/kitchen/provisioner/chef_base.rb
|
452
|
+
- lib/kitchen/provisioner/chef_infra.rb
|
437
453
|
- lib/kitchen/provisioner/chef_solo.rb
|
438
454
|
- lib/kitchen/provisioner/chef_zero.rb
|
439
455
|
- lib/kitchen/provisioner/dummy.rb
|
@@ -457,6 +473,7 @@ files:
|
|
457
473
|
- lib/kitchen/verifier/dummy.rb
|
458
474
|
- lib/kitchen/verifier/shell.rb
|
459
475
|
- lib/kitchen/version.rb
|
476
|
+
- lib/kitchen/which.rb
|
460
477
|
- lib/vendor/hash_recursive_merge.rb
|
461
478
|
- support/busser_install_command.ps1
|
462
479
|
- support/busser_install_command.sh
|
@@ -496,14 +513,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
496
513
|
requirements:
|
497
514
|
- - ">="
|
498
515
|
- !ruby/object:Gem::Version
|
499
|
-
version: '2.
|
516
|
+
version: '2.5'
|
500
517
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
501
518
|
requirements:
|
502
519
|
- - ">="
|
503
520
|
- !ruby/object:Gem::Version
|
504
521
|
version: '0'
|
505
522
|
requirements: []
|
506
|
-
rubygems_version: 3.
|
523
|
+
rubygems_version: 3.2.15
|
507
524
|
signing_key:
|
508
525
|
specification_version: 4
|
509
526
|
summary: Test Kitchen is an integration tool for developing and testing infrastructure
|