test-kitchen 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.cane +1 -1
- data/.rubocop.yml +3 -0
- data/.travis.yml +20 -9
- data/CHANGELOG.md +219 -108
- data/Gemfile +10 -6
- data/Guardfile +38 -9
- data/README.md +11 -1
- data/Rakefile +21 -37
- data/bin/kitchen +4 -4
- data/features/kitchen_action_commands.feature +161 -0
- data/features/kitchen_console_command.feature +34 -0
- data/features/kitchen_diagnose_command.feature +64 -0
- data/features/kitchen_init_command.feature +29 -17
- data/features/kitchen_list_command.feature +2 -2
- data/features/kitchen_login_command.feature +56 -0
- data/features/{sink_command.feature → kitchen_sink_command.feature} +0 -0
- data/features/kitchen_test_command.feature +88 -0
- data/features/step_definitions/gem_steps.rb +8 -6
- data/features/step_definitions/git_steps.rb +4 -2
- data/features/step_definitions/output_steps.rb +5 -0
- data/features/support/env.rb +12 -9
- data/lib/kitchen.rb +60 -38
- data/lib/kitchen/base64_stream.rb +55 -0
- data/lib/kitchen/busser.rb +124 -58
- data/lib/kitchen/cli.rb +121 -38
- data/lib/kitchen/collection.rb +3 -3
- data/lib/kitchen/color.rb +4 -4
- data/lib/kitchen/command.rb +78 -11
- data/lib/kitchen/command/action.rb +3 -2
- data/lib/kitchen/command/console.rb +12 -5
- data/lib/kitchen/command/diagnose.rb +17 -3
- data/lib/kitchen/command/driver_discover.rb +26 -7
- data/lib/kitchen/command/exec.rb +41 -0
- data/lib/kitchen/command/list.rb +44 -14
- data/lib/kitchen/command/login.rb +2 -1
- data/lib/kitchen/command/sink.rb +2 -1
- data/lib/kitchen/command/test.rb +5 -4
- data/lib/kitchen/config.rb +146 -14
- data/lib/kitchen/configurable.rb +314 -0
- data/lib/kitchen/data_munger.rb +522 -18
- data/lib/kitchen/diagnostic.rb +43 -4
- data/lib/kitchen/driver.rb +4 -4
- data/lib/kitchen/driver/base.rb +80 -115
- data/lib/kitchen/driver/dummy.rb +34 -6
- data/lib/kitchen/driver/proxy.rb +14 -3
- data/lib/kitchen/driver/ssh_base.rb +61 -7
- data/lib/kitchen/errors.rb +109 -9
- data/lib/kitchen/generator/driver_create.rb +39 -5
- data/lib/kitchen/generator/init.rb +130 -45
- data/lib/kitchen/instance.rb +162 -28
- data/lib/kitchen/lazy_hash.rb +79 -7
- data/lib/kitchen/loader/yaml.rb +159 -27
- data/lib/kitchen/logger.rb +267 -21
- data/lib/kitchen/logging.rb +30 -3
- data/lib/kitchen/login_command.rb +11 -2
- data/lib/kitchen/metadata_chopper.rb +2 -2
- data/lib/kitchen/provisioner.rb +4 -4
- data/lib/kitchen/provisioner/base.rb +107 -103
- data/lib/kitchen/provisioner/chef/berkshelf.rb +36 -8
- data/lib/kitchen/provisioner/chef/librarian.rb +40 -11
- data/lib/kitchen/provisioner/chef_base.rb +206 -167
- data/lib/kitchen/provisioner/chef_solo.rb +25 -7
- data/lib/kitchen/provisioner/chef_zero.rb +105 -29
- data/lib/kitchen/provisioner/dummy.rb +1 -1
- data/lib/kitchen/provisioner/shell.rb +21 -6
- data/lib/kitchen/rake_tasks.rb +8 -3
- data/lib/kitchen/shell_out.rb +15 -18
- data/lib/kitchen/ssh.rb +122 -27
- data/lib/kitchen/state_file.rb +24 -7
- data/lib/kitchen/thor_tasks.rb +9 -4
- data/lib/kitchen/util.rb +43 -118
- data/lib/kitchen/version.rb +1 -1
- data/lib/vendor/hash_recursive_merge.rb +10 -2
- data/spec/kitchen/base64_stream_spec.rb +77 -0
- data/spec/kitchen/busser_spec.rb +490 -0
- data/spec/kitchen/collection_spec.rb +10 -10
- data/spec/kitchen/color_spec.rb +2 -2
- data/spec/kitchen/config_spec.rb +234 -62
- data/spec/kitchen/configurable_spec.rb +490 -0
- data/spec/kitchen/data_munger_spec.rb +1070 -862
- data/spec/kitchen/diagnostic_spec.rb +79 -0
- data/spec/kitchen/driver/base_spec.rb +80 -85
- data/spec/kitchen/driver/dummy_spec.rb +43 -14
- data/spec/kitchen/driver/proxy_spec.rb +134 -0
- data/spec/kitchen/driver/ssh_base_spec.rb +644 -0
- data/spec/kitchen/driver_spec.rb +15 -15
- data/spec/kitchen/errors_spec.rb +309 -0
- data/spec/kitchen/instance_spec.rb +143 -46
- data/spec/kitchen/lazy_hash_spec.rb +36 -9
- data/spec/kitchen/loader/yaml_spec.rb +237 -226
- data/spec/kitchen/logger_spec.rb +419 -0
- data/spec/kitchen/logging_spec.rb +59 -0
- data/spec/kitchen/login_command_spec.rb +49 -0
- data/spec/kitchen/metadata_chopper_spec.rb +82 -0
- data/spec/kitchen/platform_spec.rb +4 -4
- data/spec/kitchen/provisioner/base_spec.rb +65 -125
- data/spec/kitchen/provisioner/chef_base_spec.rb +798 -0
- data/spec/kitchen/provisioner/chef_solo_spec.rb +316 -0
- data/spec/kitchen/provisioner/chef_zero_spec.rb +624 -0
- data/spec/kitchen/provisioner/shell_spec.rb +269 -0
- data/spec/kitchen/provisioner_spec.rb +6 -6
- data/spec/kitchen/shell_out_spec.rb +143 -0
- data/spec/kitchen/ssh_spec.rb +683 -0
- data/spec/kitchen/state_file_spec.rb +28 -21
- data/spec/kitchen/suite_spec.rb +7 -7
- data/spec/kitchen/util_spec.rb +68 -10
- data/spec/kitchen_spec.rb +107 -0
- data/spec/spec_helper.rb +18 -13
- data/support/chef-client-zero.rb +10 -9
- data/support/chef_helpers.sh +16 -0
- data/support/download_helpers.sh +109 -0
- data/test-kitchen.gemspec +42 -33
- metadata +107 -33
@@ -16,7 +16,7 @@
|
|
16
16
|
# See the License for the specific language governing permissions and
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
|
-
require
|
19
|
+
require "kitchen/provisioner/chef_base"
|
20
20
|
|
21
21
|
module Kitchen
|
22
22
|
|
@@ -29,26 +29,44 @@ module Kitchen
|
|
29
29
|
|
30
30
|
default_config :solo_rb, {}
|
31
31
|
|
32
|
+
default_config :chef_solo_path do |provisioner|
|
33
|
+
File.join(provisioner[:chef_omnibus_root], %w[bin chef-solo])
|
34
|
+
end
|
35
|
+
|
36
|
+
# (see Base#create_sandbox)
|
32
37
|
def create_sandbox
|
33
38
|
super
|
34
39
|
prepare_solo_rb
|
35
40
|
end
|
36
41
|
|
42
|
+
# (see Base#run_command)
|
37
43
|
def run_command
|
38
|
-
[
|
39
|
-
|
44
|
+
level = config[:log_level] == :info ? :auto : config[:log_level]
|
45
|
+
|
46
|
+
cmd = sudo(config[:chef_solo_path])
|
47
|
+
args = [
|
40
48
|
"--config #{config[:root_path]}/solo.rb",
|
41
|
-
"--
|
42
|
-
|
43
|
-
"--
|
44
|
-
|
49
|
+
"--log_level #{level}",
|
50
|
+
"--force-formatter",
|
51
|
+
"--no-color",
|
52
|
+
"--json-attributes #{config[:root_path]}/dna.json"
|
53
|
+
]
|
54
|
+
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
55
|
+
|
56
|
+
Util.wrap_command([cmd, *args].join(" "))
|
45
57
|
end
|
46
58
|
|
47
59
|
private
|
48
60
|
|
61
|
+
# Writes a solo.rb configuration file to the sandbox directory.
|
62
|
+
#
|
63
|
+
# @api private
|
49
64
|
def prepare_solo_rb
|
50
65
|
data = default_config_rb.merge(config[:solo_rb])
|
51
66
|
|
67
|
+
info("Preparing solo.rb")
|
68
|
+
debug("Creating solo.rb from #{data.inspect}")
|
69
|
+
|
52
70
|
File.open(File.join(sandbox_path, "solo.rb"), "wb") do |file|
|
53
71
|
file.write(format_config_file(data))
|
54
72
|
end
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# See the License for the specific language governing permissions and
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
|
-
require
|
19
|
+
require "kitchen/provisioner/chef_base"
|
20
20
|
|
21
21
|
module Kitchen
|
22
22
|
|
@@ -30,7 +30,14 @@ module Kitchen
|
|
30
30
|
default_config :client_rb, {}
|
31
31
|
default_config :ruby_bindir, "/opt/chef/embedded/bin"
|
32
32
|
default_config :json_attributes, true
|
33
|
+
default_config :chef_zero_host, nil
|
34
|
+
default_config :chef_zero_port, 8889
|
33
35
|
|
36
|
+
default_config :chef_client_path do |provisioner|
|
37
|
+
File.join(provisioner[:chef_omnibus_root], %w[bin chef-client])
|
38
|
+
end
|
39
|
+
|
40
|
+
# (see Base#create_sandbox)
|
34
41
|
def create_sandbox
|
35
42
|
super
|
36
43
|
prepare_chef_client_zero_rb
|
@@ -38,71 +45,136 @@ module Kitchen
|
|
38
45
|
prepare_client_rb
|
39
46
|
end
|
40
47
|
|
48
|
+
# (see Base#prepare_command)
|
41
49
|
def prepare_command
|
42
|
-
return if
|
50
|
+
return if modern?
|
43
51
|
|
44
|
-
ruby_bin = config[:ruby_bindir]
|
52
|
+
ruby_bin = Pathname.new(config[:ruby_bindir])
|
45
53
|
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
|
50
|
-
# the installed omnibus package. Yep, this is funky :)
|
51
|
-
<<-PREPARE.gsub(/^ {10}/, '')
|
52
|
-
sh -c '
|
54
|
+
# we are installing latest chef in order to get chef-zero and
|
55
|
+
# Chef::ChefFS only. The version of Chef that gets run will be
|
56
|
+
# the installed omnibus package. Yep, this is funky :)
|
57
|
+
cmd = <<-PREPARE.gsub(/^ {10}/, "")
|
53
58
|
#{chef_client_zero_env(:export)}
|
54
|
-
if ! #{sudo("
|
59
|
+
if ! #{sudo(ruby_bin.join("gem"))} list chef-zero -i >/dev/null; then
|
55
60
|
echo ">>>>>> Attempting to use chef-zero with old version of Chef"
|
56
61
|
echo "-----> Installing chef zero dependencies"
|
57
|
-
#{sudo("
|
58
|
-
fi
|
62
|
+
#{sudo(ruby_bin.join("gem"))} install chef --no-ri --no-rdoc --conservative
|
63
|
+
fi
|
59
64
|
PREPARE
|
65
|
+
|
66
|
+
Util.wrap_command(cmd)
|
60
67
|
end
|
61
68
|
|
69
|
+
# (see Base#run_command)
|
62
70
|
def run_command
|
71
|
+
cmd = modern? ? local_mode_command : shim_command
|
72
|
+
|
73
|
+
Util.wrap_command([cmd, *chef_client_args].join(" "))
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
# Returns the command that will run chef client in local mode (a.k.a.
|
79
|
+
# chef zero mode).
|
80
|
+
#
|
81
|
+
# @return [String] the command string
|
82
|
+
# @api private
|
83
|
+
def local_mode_command
|
84
|
+
"#{sudo(config[:chef_client_path])} --local-mode"
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the command that will run a backwards compatible shim script
|
88
|
+
# that approximates local mode in a modern chef-client run.
|
89
|
+
#
|
90
|
+
# @return [String] the command string
|
91
|
+
# @api private
|
92
|
+
def shim_command
|
93
|
+
[
|
94
|
+
chef_client_zero_env,
|
95
|
+
sudo("#{config[:ruby_bindir]}/ruby"),
|
96
|
+
"#{config[:root_path]}/chef-client-zero.rb"
|
97
|
+
].join(" ")
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns an Array of command line arguments for the chef client.
|
101
|
+
#
|
102
|
+
# @return [Array<String>] an array of command line arguments
|
103
|
+
# @api private
|
104
|
+
def chef_client_args
|
105
|
+
level = config[:log_level] == :info ? :auto : config[:log_level]
|
63
106
|
args = [
|
64
107
|
"--config #{config[:root_path]}/client.rb",
|
65
|
-
"--log_level #{
|
108
|
+
"--log_level #{level}",
|
109
|
+
"--force-formatter",
|
110
|
+
"--no-color"
|
66
111
|
]
|
112
|
+
|
113
|
+
if config[:chef_zero_host]
|
114
|
+
args << "--chef-zero-host #{config[:chef_zero_host]}"
|
115
|
+
end
|
116
|
+
if config[:chef_zero_port]
|
117
|
+
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
118
|
+
end
|
67
119
|
if config[:json_attributes]
|
68
120
|
args << "--json-attributes #{config[:root_path]}/dna.json"
|
69
121
|
end
|
70
|
-
|
71
|
-
|
72
|
-
["#{sudo('chef-client')} -z"].concat(args).join(" ")
|
73
|
-
else
|
74
|
-
[
|
75
|
-
chef_client_zero_env,
|
76
|
-
sudo("#{config[:ruby_bindir]}/ruby"),
|
77
|
-
"#{config[:root_path]}/chef-client-zero.rb"
|
78
|
-
].concat(args).join(" ")
|
122
|
+
if config[:log_file]
|
123
|
+
args << "--logfile #{config[:log_file]}"
|
79
124
|
end
|
80
|
-
end
|
81
125
|
|
82
|
-
|
126
|
+
args
|
127
|
+
end
|
83
128
|
|
129
|
+
# Writes a chef-client local-mode shim script to the sandbox directory
|
130
|
+
# only if the desired version of Chef is old enough. The version of Chef
|
131
|
+
# is determined using the `config[:require_chef_omnibus]` value.
|
132
|
+
#
|
133
|
+
# @api private
|
84
134
|
def prepare_chef_client_zero_rb
|
85
|
-
return if
|
135
|
+
return if modern?
|
136
|
+
|
137
|
+
info("Preparing chef-client-zero.rb")
|
138
|
+
debug("Using a vendored chef-client-zero.rb")
|
86
139
|
|
87
140
|
source = File.join(File.dirname(__FILE__),
|
88
|
-
%w
|
141
|
+
%w[.. .. .. support chef-client-zero.rb])
|
89
142
|
FileUtils.cp(source, File.join(sandbox_path, "chef-client-zero.rb"))
|
90
143
|
end
|
91
144
|
|
145
|
+
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
146
|
+
#
|
147
|
+
# @api private
|
92
148
|
def prepare_validation_pem
|
149
|
+
info("Preparing validation.pem")
|
150
|
+
debug("Using a dummy validation.pem")
|
151
|
+
|
93
152
|
source = File.join(File.dirname(__FILE__),
|
94
|
-
%w
|
153
|
+
%w[.. .. .. support dummy-validation.pem])
|
95
154
|
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
96
155
|
end
|
97
156
|
|
157
|
+
# Writes a client.rb configuration file to the sandbox directory.
|
158
|
+
#
|
159
|
+
# @api private
|
98
160
|
def prepare_client_rb
|
99
161
|
data = default_config_rb.merge(config[:client_rb])
|
100
162
|
|
163
|
+
info("Preparing client.rb")
|
164
|
+
debug("Creating client.rb from #{data.inspect}")
|
165
|
+
|
101
166
|
File.open(File.join(sandbox_path, "client.rb"), "wb") do |file|
|
102
167
|
file.write(format_config_file(data))
|
103
168
|
end
|
104
169
|
end
|
105
170
|
|
171
|
+
# Generates a string of shell environment variables needed for the
|
172
|
+
# chef-client-zero.rb shim script to properly function.
|
173
|
+
#
|
174
|
+
# @param extra [Symbol] whether or not the environment variables need to
|
175
|
+
# be exported, using the `:export` symbol (default: `nil`)
|
176
|
+
# @return [String] a shell script string
|
177
|
+
# @api private
|
106
178
|
def chef_client_zero_env(extra = nil)
|
107
179
|
args = [
|
108
180
|
%{CHEF_REPO_PATH="#{config[:root_path]}"},
|
@@ -123,7 +195,11 @@ module Kitchen
|
|
123
195
|
# The only way this method returns false is if require_chef_omnibus has
|
124
196
|
# an explicit version set to less than 11.8.0, when chef zero mode was
|
125
197
|
# introduced. Otherwise a modern Chef installation is assumed.
|
126
|
-
|
198
|
+
#
|
199
|
+
# @return [true,false] whether or not the desired version of Chef
|
200
|
+
# supports local mode
|
201
|
+
# @api private
|
202
|
+
def modern?
|
127
203
|
version = config[:require_chef_omnibus]
|
128
204
|
|
129
205
|
case version
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# See the License for the specific language governing permissions and
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
|
-
require
|
19
|
+
require "kitchen/provisioner/base"
|
20
20
|
|
21
21
|
module Kitchen
|
22
22
|
|
@@ -28,7 +28,7 @@ module Kitchen
|
|
28
28
|
class Shell < Base
|
29
29
|
|
30
30
|
default_config :script do |provisioner|
|
31
|
-
provisioner.calculate_path("bootstrap.sh", :
|
31
|
+
provisioner.calculate_path("bootstrap.sh", :type => :file)
|
32
32
|
end
|
33
33
|
expand_path_for :script
|
34
34
|
|
@@ -37,23 +37,34 @@ module Kitchen
|
|
37
37
|
end
|
38
38
|
expand_path_for :data_path
|
39
39
|
|
40
|
+
# (see Base#create_sandbox)
|
40
41
|
def create_sandbox
|
41
42
|
super
|
42
43
|
prepare_data
|
43
44
|
prepare_script
|
44
45
|
end
|
45
46
|
|
47
|
+
# (see Base#init_command)
|
46
48
|
def init_command
|
47
49
|
data = File.join(config[:root_path], "data")
|
48
|
-
"#{sudo(
|
50
|
+
cmd = "#{sudo("rm")} -rf #{data} ; mkdir -p #{config[:root_path]}"
|
51
|
+
|
52
|
+
Util.wrap_command(cmd)
|
49
53
|
end
|
50
54
|
|
55
|
+
# (see Base#run_command)
|
51
56
|
def run_command
|
52
|
-
|
57
|
+
Util.wrap_command(
|
58
|
+
sudo(File.join(config[:root_path], File.basename(config[:script])))
|
59
|
+
)
|
53
60
|
end
|
54
61
|
|
55
|
-
|
62
|
+
private
|
56
63
|
|
64
|
+
# Creates a data directory in the sandbox directory, if a data directory
|
65
|
+
# can be found and copies in the tree.
|
66
|
+
#
|
67
|
+
# @api private
|
57
68
|
def prepare_data
|
58
69
|
return unless config[:data_path]
|
59
70
|
|
@@ -65,6 +76,10 @@ module Kitchen
|
|
65
76
|
FileUtils.cp_r(Dir.glob("#{config[:data_path]}/*"), tmpdata_dir)
|
66
77
|
end
|
67
78
|
|
79
|
+
# Copies the executable script to the sandbox directory or creates a
|
80
|
+
# stub script if one cannot be found.
|
81
|
+
#
|
82
|
+
# @api private
|
68
83
|
def prepare_script
|
69
84
|
info("Preparing script")
|
70
85
|
|
@@ -73,7 +88,7 @@ module Kitchen
|
|
73
88
|
FileUtils.cp_r(config[:script], sandbox_path)
|
74
89
|
else
|
75
90
|
config[:script] = File.join(sandbox_path, "bootstrap.sh")
|
76
|
-
info("#{File.basename(config[:script])} not found "
|
91
|
+
info("#{File.basename(config[:script])} not found " \
|
77
92
|
"so Kitchen will run a stubbed script. Is this intended?")
|
78
93
|
File.open(config[:script], "wb") do |file|
|
79
94
|
file.write(%{#!/bin/sh\necho "NO BOOTSTRAP SCRIPT PRESENT"\n})
|
data/lib/kitchen/rake_tasks.rb
CHANGED
@@ -16,9 +16,9 @@
|
|
16
16
|
# See the License for the specific language governing permissions and
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
|
-
require
|
19
|
+
require "rake/tasklib"
|
20
20
|
|
21
|
-
require
|
21
|
+
require "kitchen"
|
22
22
|
|
23
23
|
module Kitchen
|
24
24
|
|
@@ -39,8 +39,13 @@ module Kitchen
|
|
39
39
|
|
40
40
|
private
|
41
41
|
|
42
|
+
# @return [Config] a Kitchen::Config
|
42
43
|
attr_reader :config
|
43
44
|
|
45
|
+
# Generates a test Rake task for each instance and one to test all
|
46
|
+
# instances in serial.
|
47
|
+
#
|
48
|
+
# @api private
|
44
49
|
def define
|
45
50
|
namespace "kitchen" do
|
46
51
|
config.instances.each do |instance|
|
@@ -51,7 +56,7 @@ module Kitchen
|
|
51
56
|
end
|
52
57
|
|
53
58
|
desc "Run all test instances"
|
54
|
-
task "all" => config.instances.map
|
59
|
+
task "all" => config.instances.map(&:name)
|
55
60
|
end
|
56
61
|
end
|
57
62
|
end
|
data/lib/kitchen/shell_out.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
# See the License for the specific language governing permissions and
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
|
-
require
|
19
|
+
require "mixlib/shellout"
|
20
20
|
|
21
21
|
module Kitchen
|
22
22
|
|
@@ -27,7 +27,7 @@ module Kitchen
|
|
27
27
|
module ShellOut
|
28
28
|
|
29
29
|
# Wrapped exception for any interally raised shell out commands.
|
30
|
-
class ShellCommandFailed < TransientFailure
|
30
|
+
class ShellCommandFailed < TransientFailure; end
|
31
31
|
|
32
32
|
# Executes a command in a subshell on the local running system.
|
33
33
|
#
|
@@ -41,11 +41,11 @@ module Kitchen
|
|
41
41
|
# the command
|
42
42
|
# @option options [Hash] :environment a Hash of environment variables to
|
43
43
|
# set before the command is run. By default, the environment will
|
44
|
-
# *always* be set to 'LC_ALL' => 'C' to prevent issues with multibyte
|
44
|
+
# *always* be set to `'LC_ALL' => 'C'` to prevent issues with multibyte
|
45
45
|
# characters in Ruby 1.8. To avoid this, use :environment => nil for
|
46
46
|
# *no* extra environment settings, or
|
47
|
-
#
|
48
|
-
# without changing the locale.
|
47
|
+
# `:environment => {'LC_ALL'=>nil, ...}` to set other environment
|
48
|
+
# settings without changing the locale.
|
49
49
|
# @option options [Integer] :timeout Numeric value for the number of
|
50
50
|
# seconds to wait on the child process before raising an Exception.
|
51
51
|
# This is calculated as the total amount of time that ShellOut waited on
|
@@ -56,11 +56,10 @@ module Kitchen
|
|
56
56
|
# @raise [ShellCommandFailed] if the command fails
|
57
57
|
# @raise [Error] for all other unexpected exceptions
|
58
58
|
def run_command(cmd, options = {})
|
59
|
-
|
60
|
-
|
61
|
-
subject = "[#{options[:log_subject] || "local"} command]"
|
59
|
+
cmd = "sudo -E #{cmd}" if options.fetch(:use_sudo, false)
|
60
|
+
subject = "[#{options.fetch(:log_subject, "local")} command]"
|
62
61
|
|
63
|
-
debug("#{subject} BEGIN (#{
|
62
|
+
debug("#{subject} BEGIN (#{cmd})")
|
64
63
|
sh = Mixlib::ShellOut.new(cmd, shell_opts(options))
|
65
64
|
sh.run_command
|
66
65
|
debug("#{subject} END #{Util.duration(sh.execution_time)}")
|
@@ -68,22 +67,20 @@ module Kitchen
|
|
68
67
|
sh.stdout
|
69
68
|
rescue Mixlib::ShellOut::ShellCommandFailed => ex
|
70
69
|
raise ShellCommandFailed, ex.message
|
71
|
-
rescue Exception => error
|
70
|
+
rescue Exception => error # rubocop:disable Lint/RescueException
|
72
71
|
error.extend(Kitchen::Error)
|
73
72
|
raise
|
74
73
|
end
|
75
74
|
|
76
75
|
private
|
77
76
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
|
77
|
+
# Returns a hash of MixLib::ShellOut options for the command.
|
78
|
+
#
|
79
|
+
# @param options [Hash] a Hash of options
|
80
|
+
# @return [Hash] a new Hash of options, filterd and merged with defaults
|
81
|
+
# @api private
|
85
82
|
def shell_opts(options)
|
86
|
-
filtered_opts = options.reject do |key,
|
83
|
+
filtered_opts = options.reject do |key, _value|
|
87
84
|
[:use_sudo, :log_subject, :quiet].include?(key)
|
88
85
|
end
|
89
86
|
{ :live_stream => logger, :timeout => 60000 }.merge(filtered_opts)
|