test-kitchen 1.7.0 → 1.7.1.dev
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/.cane +8 -8
- data/.gitattributes +3 -0
- data/.github/ISSUE_TEMPLATE.md +55 -55
- data/.gitignore +28 -28
- data/.kitchen.ci.yml +23 -23
- data/.kitchen.proxy.yml +27 -27
- data/.rubocop.yml +3 -3
- data/.travis.yml +70 -70
- data/.yardopts +3 -3
- data/Berksfile +3 -3
- data/CHANGELOG.md +1090 -1083
- data/CONTRIBUTING.md +14 -14
- data/Gemfile +19 -19
- data/Gemfile.proxy_tests +4 -4
- data/Guardfile +42 -42
- data/LICENSE +15 -15
- data/MAINTAINERS.md +23 -23
- data/README.md +135 -135
- data/Rakefile +61 -61
- data/appveyor.yml +44 -44
- data/features/kitchen_action_commands.feature +164 -164
- data/features/kitchen_command.feature +16 -16
- data/features/kitchen_console_command.feature +34 -34
- data/features/kitchen_defaults.feature +38 -38
- data/features/kitchen_diagnose_command.feature +96 -96
- data/features/kitchen_driver_create_command.feature +64 -64
- data/features/kitchen_driver_discover_command.feature +25 -25
- data/features/kitchen_help_command.feature +16 -16
- data/features/kitchen_init_command.feature +274 -274
- data/features/kitchen_list_command.feature +104 -104
- data/features/kitchen_login_command.feature +62 -62
- data/features/kitchen_sink_command.feature +30 -30
- data/features/kitchen_test_command.feature +88 -88
- data/features/step_definitions/gem_steps.rb +36 -36
- data/features/step_definitions/git_steps.rb +5 -5
- data/features/step_definitions/output_steps.rb +5 -5
- data/features/support/env.rb +75 -75
- data/lib/kitchen.rb +150 -150
- data/lib/kitchen/base64_stream.rb +55 -55
- data/lib/kitchen/cli.rb +419 -419
- data/lib/kitchen/collection.rb +55 -55
- data/lib/kitchen/color.rb +65 -65
- data/lib/kitchen/command.rb +185 -185
- data/lib/kitchen/command/action.rb +45 -45
- data/lib/kitchen/command/console.rb +58 -58
- data/lib/kitchen/command/diagnose.rb +92 -92
- data/lib/kitchen/command/driver_discover.rb +105 -105
- data/lib/kitchen/command/exec.rb +41 -41
- data/lib/kitchen/command/list.rb +119 -119
- data/lib/kitchen/command/login.rb +43 -43
- data/lib/kitchen/command/sink.rb +54 -54
- data/lib/kitchen/command/test.rb +51 -51
- data/lib/kitchen/config.rb +322 -322
- data/lib/kitchen/configurable.rb +529 -529
- data/lib/kitchen/data_munger.rb +959 -959
- data/lib/kitchen/diagnostic.rb +141 -141
- data/lib/kitchen/driver.rb +56 -56
- data/lib/kitchen/driver/base.rb +134 -134
- data/lib/kitchen/driver/dummy.rb +108 -108
- data/lib/kitchen/driver/proxy.rb +72 -72
- data/lib/kitchen/driver/ssh_base.rb +357 -357
- data/lib/kitchen/errors.rb +229 -229
- data/lib/kitchen/generator/driver_create.rb +177 -177
- data/lib/kitchen/generator/init.rb +296 -296
- data/lib/kitchen/instance.rb +662 -662
- data/lib/kitchen/lazy_hash.rb +142 -142
- data/lib/kitchen/loader/yaml.rb +349 -349
- data/lib/kitchen/logger.rb +423 -423
- data/lib/kitchen/logging.rb +56 -56
- data/lib/kitchen/login_command.rb +52 -52
- data/lib/kitchen/metadata_chopper.rb +52 -52
- data/lib/kitchen/platform.rb +67 -67
- data/lib/kitchen/provisioner.rb +54 -54
- data/lib/kitchen/provisioner/base.rb +236 -236
- data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
- data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
- data/lib/kitchen/provisioner/chef_apply.rb +124 -124
- data/lib/kitchen/provisioner/chef_base.rb +341 -341
- data/lib/kitchen/provisioner/chef_solo.rb +88 -88
- data/lib/kitchen/provisioner/chef_zero.rb +245 -245
- data/lib/kitchen/provisioner/dummy.rb +79 -79
- data/lib/kitchen/provisioner/shell.rb +138 -138
- data/lib/kitchen/rake_tasks.rb +63 -63
- data/lib/kitchen/shell_out.rb +93 -93
- data/lib/kitchen/ssh.rb +276 -276
- data/lib/kitchen/state_file.rb +120 -120
- data/lib/kitchen/suite.rb +51 -51
- data/lib/kitchen/thor_tasks.rb +66 -66
- data/lib/kitchen/transport.rb +54 -54
- data/lib/kitchen/transport/base.rb +176 -176
- data/lib/kitchen/transport/dummy.rb +79 -79
- data/lib/kitchen/transport/ssh.rb +364 -364
- data/lib/kitchen/transport/winrm.rb +486 -486
- data/lib/kitchen/util.rb +147 -147
- data/lib/kitchen/verifier.rb +55 -55
- data/lib/kitchen/verifier/base.rb +235 -235
- data/lib/kitchen/verifier/busser.rb +277 -277
- data/lib/kitchen/verifier/dummy.rb +79 -79
- data/lib/kitchen/verifier/shell.rb +101 -101
- data/lib/kitchen/version.rb +21 -21
- data/lib/vendor/hash_recursive_merge.rb +82 -82
- data/spec/kitchen/base64_stream_spec.rb +77 -77
- data/spec/kitchen/cli_spec.rb +56 -56
- data/spec/kitchen/collection_spec.rb +80 -80
- data/spec/kitchen/color_spec.rb +54 -54
- data/spec/kitchen/config_spec.rb +408 -408
- data/spec/kitchen/configurable_spec.rb +1095 -1095
- data/spec/kitchen/data_munger_spec.rb +2694 -2694
- data/spec/kitchen/diagnostic_spec.rb +129 -129
- data/spec/kitchen/driver/base_spec.rb +121 -121
- data/spec/kitchen/driver/dummy_spec.rb +199 -199
- data/spec/kitchen/driver/proxy_spec.rb +138 -138
- data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
- data/spec/kitchen/driver_spec.rb +112 -112
- data/spec/kitchen/errors_spec.rb +309 -309
- data/spec/kitchen/instance_spec.rb +1419 -1419
- data/spec/kitchen/lazy_hash_spec.rb +117 -117
- data/spec/kitchen/loader/yaml_spec.rb +774 -774
- data/spec/kitchen/logger_spec.rb +429 -429
- data/spec/kitchen/logging_spec.rb +59 -59
- data/spec/kitchen/login_command_spec.rb +68 -68
- data/spec/kitchen/metadata_chopper_spec.rb +82 -82
- data/spec/kitchen/platform_spec.rb +89 -89
- data/spec/kitchen/provisioner/base_spec.rb +386 -386
- data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
- data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1161
- data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
- data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
- data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
- data/spec/kitchen/provisioner/shell_spec.rb +566 -566
- data/spec/kitchen/provisioner_spec.rb +107 -107
- data/spec/kitchen/shell_out_spec.rb +150 -150
- data/spec/kitchen/ssh_spec.rb +693 -693
- data/spec/kitchen/state_file_spec.rb +129 -129
- data/spec/kitchen/suite_spec.rb +62 -62
- data/spec/kitchen/transport/base_spec.rb +89 -89
- data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
- data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
- data/spec/kitchen/transport_spec.rb +112 -112
- data/spec/kitchen/util_spec.rb +165 -165
- data/spec/kitchen/verifier/base_spec.rb +362 -362
- data/spec/kitchen/verifier/busser_spec.rb +610 -610
- data/spec/kitchen/verifier/dummy_spec.rb +99 -99
- data/spec/kitchen/verifier/shell_spec.rb +160 -160
- data/spec/kitchen/verifier_spec.rb +120 -120
- data/spec/kitchen_spec.rb +114 -114
- data/spec/spec_helper.rb +85 -85
- data/spec/support/powershell_max_size_spec.rb +40 -40
- data/support/busser_install_command.ps1 +14 -14
- data/support/busser_install_command.sh +14 -14
- data/support/chef-client-zero.rb +77 -77
- data/support/chef_base_init_command.ps1 +18 -18
- data/support/chef_base_init_command.sh +2 -2
- data/support/chef_base_install_command.ps1 +85 -85
- data/support/chef_base_install_command.sh +229 -229
- data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
- data/support/chef_zero_prepare_command_legacy.sh +10 -10
- data/support/download_helpers.sh +109 -109
- data/support/dummy-validation.pem +27 -27
- data/templates/driver/CHANGELOG.md.erb +3 -3
- data/templates/driver/Gemfile.erb +3 -3
- data/templates/driver/README.md.erb +64 -64
- data/templates/driver/Rakefile.erb +21 -21
- data/templates/driver/driver.rb.erb +23 -23
- data/templates/driver/gemspec.erb +29 -29
- data/templates/driver/gitignore.erb +17 -17
- data/templates/driver/license_apachev2.erb +15 -15
- data/templates/driver/license_lgplv3.erb +16 -16
- data/templates/driver/license_mit.erb +22 -22
- data/templates/driver/license_reserved.erb +5 -5
- data/templates/driver/tailor.erb +4 -4
- data/templates/driver/travis.yml.erb +11 -11
- data/templates/driver/version.rb.erb +12 -12
- data/templates/init/chefignore.erb +1 -1
- data/templates/init/kitchen.yml.erb +18 -18
- data/test-kitchen.gemspec +62 -62
- data/test/integration/default/default_spec.rb +3 -3
- data/testing_windows.md +37 -37
- metadata +5 -4
|
@@ -1,277 +1,277 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2012, 2013, Fletcher Nichol
|
|
6
|
-
#
|
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
# See the License for the specific language governing permissions and
|
|
17
|
-
# limitations under the License.
|
|
18
|
-
|
|
19
|
-
require "base64"
|
|
20
|
-
require "digest"
|
|
21
|
-
|
|
22
|
-
require "kitchen/verifier/base"
|
|
23
|
-
|
|
24
|
-
module Kitchen
|
|
25
|
-
|
|
26
|
-
module Verifier
|
|
27
|
-
|
|
28
|
-
# Command string generator to interface with Busser. The commands that are
|
|
29
|
-
# generated are safe to pass to an SSH command or as an unix command
|
|
30
|
-
# argument (escaped in single quotes).
|
|
31
|
-
#
|
|
32
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
33
|
-
class Busser < Kitchen::Verifier::Base
|
|
34
|
-
|
|
35
|
-
kitchen_verifier_api_version 1
|
|
36
|
-
|
|
37
|
-
plugin_version Kitchen::VERSION
|
|
38
|
-
|
|
39
|
-
default_config :busser_bin do |verifier|
|
|
40
|
-
verifier.
|
|
41
|
-
remote_path_join(%W[#{verifier[:root_path]} bin busser]).
|
|
42
|
-
tap { |path| path.concat(".bat") if verifier.windows_os? }
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
default_config :ruby_bindir do |verifier|
|
|
46
|
-
if verifier.windows_os?
|
|
47
|
-
"$env:systemdrive\\opscode\\chef\\embedded\\bin"
|
|
48
|
-
else
|
|
49
|
-
verifier.remote_path_join(%W[#{verifier[:chef_omnibus_root]} embedded bin])
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
default_config :version, "busser"
|
|
54
|
-
|
|
55
|
-
expand_path_for :test_base_path
|
|
56
|
-
|
|
57
|
-
# Creates a new Busser object using the provided configuration data
|
|
58
|
-
# which will be merged with any default configuration.
|
|
59
|
-
#
|
|
60
|
-
# @param config [Hash] provided driver configuration
|
|
61
|
-
def initialize(config = {})
|
|
62
|
-
init_config(config)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# (see Base#create_sandbox)
|
|
66
|
-
def create_sandbox
|
|
67
|
-
super
|
|
68
|
-
prepare_helpers
|
|
69
|
-
prepare_suites
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# (see Base#init_command)
|
|
73
|
-
def init_command
|
|
74
|
-
return if local_suite_files.empty?
|
|
75
|
-
|
|
76
|
-
cmd = sudo(config[:busser_bin]).dup.
|
|
77
|
-
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
78
|
-
|
|
79
|
-
prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
|
|
80
|
-
#{busser_env}
|
|
81
|
-
|
|
82
|
-
#{cmd} suite cleanup
|
|
83
|
-
CMD
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# (see Base#install_command)
|
|
87
|
-
def install_command
|
|
88
|
-
return if local_suite_files.empty?
|
|
89
|
-
|
|
90
|
-
vars = install_command_vars
|
|
91
|
-
|
|
92
|
-
prefix_command(shell_code_from_file(vars, "busser_install_command"))
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# (see Base#run_command)
|
|
96
|
-
def run_command
|
|
97
|
-
return if local_suite_files.empty?
|
|
98
|
-
|
|
99
|
-
cmd = sudo(config[:busser_bin]).dup.
|
|
100
|
-
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
101
|
-
|
|
102
|
-
prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
|
|
103
|
-
#{busser_env}
|
|
104
|
-
|
|
105
|
-
#{cmd} test
|
|
106
|
-
CMD
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
# Legacy method stub for `#setup_cmd` which calls `#install_command`.
|
|
110
|
-
#
|
|
111
|
-
# @return [String] command string
|
|
112
|
-
# @deprecated When backwards compatibility for old Busser methods is
|
|
113
|
-
# removed, this method will no longer be available. Use
|
|
114
|
-
# `#install_command` in its place.
|
|
115
|
-
define_method(:setup_cmd) { install_command }
|
|
116
|
-
|
|
117
|
-
# Legacy method stub for `#run_cmd` which calls `#run_command`.
|
|
118
|
-
#
|
|
119
|
-
# @return [String] command string
|
|
120
|
-
# @deprecated When backwards compatibility for old Busser methods is
|
|
121
|
-
# removed, this method will no longer be available. Use
|
|
122
|
-
# `#run_command` in its place.
|
|
123
|
-
define_method(:run_cmd) { run_command }
|
|
124
|
-
|
|
125
|
-
# Legacy method stub for `#sync_cmd`.
|
|
126
|
-
#
|
|
127
|
-
# @deprecated When backwards compatibility for old Busser methods is
|
|
128
|
-
# removed, this method will no longer be available. Use
|
|
129
|
-
# `transport#upload` to transfer test files in its place.
|
|
130
|
-
def sync_cmd
|
|
131
|
-
warn("Legacy call to #sync_cmd cannot be preserved, meaning that " \
|
|
132
|
-
"test files will not be uploaded. " \
|
|
133
|
-
"Code that calls #sync_cmd can now use the transport#upload " \
|
|
134
|
-
"method to transfer files.")
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
private
|
|
138
|
-
|
|
139
|
-
# Returns a command string that sets appropriate environment variables for
|
|
140
|
-
# busser commands.
|
|
141
|
-
#
|
|
142
|
-
# @return [String] command string
|
|
143
|
-
# @api private
|
|
144
|
-
def busser_env
|
|
145
|
-
root = config[:root_path]
|
|
146
|
-
gem_home = gem_path = remote_path_join(root, "gems")
|
|
147
|
-
gem_cache = remote_path_join(gem_home, "cache")
|
|
148
|
-
|
|
149
|
-
[
|
|
150
|
-
shell_env_var("BUSSER_ROOT", root),
|
|
151
|
-
shell_env_var("GEM_HOME", gem_home),
|
|
152
|
-
shell_env_var("GEM_PATH", gem_path),
|
|
153
|
-
shell_env_var("GEM_CACHE", gem_cache)
|
|
154
|
-
].join("\n")
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# Determines whether or not a local workstation file exists under a
|
|
158
|
-
# Chef-related directory.
|
|
159
|
-
#
|
|
160
|
-
# @return [truthy,falsey] whether or not a given file is some kind of
|
|
161
|
-
# Chef-related file
|
|
162
|
-
# @api private
|
|
163
|
-
def chef_data_dir?(base, file)
|
|
164
|
-
file =~ %r{^#{base}/(data|data_bags|environments|nodes|roles)/}
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Returns arguments to a `gem install` command, suitable to install the
|
|
168
|
-
# Busser gem.
|
|
169
|
-
#
|
|
170
|
-
# @return [String] arguments string
|
|
171
|
-
# @api private
|
|
172
|
-
def gem_install_args
|
|
173
|
-
gem, version = config[:version].split("@")
|
|
174
|
-
gem, version = "busser", gem if gem =~ /^\d+\.\d+\.\d+/
|
|
175
|
-
|
|
176
|
-
root = config[:root_path]
|
|
177
|
-
gem_bin = remote_path_join(root, "bin")
|
|
178
|
-
|
|
179
|
-
# We don't want the gems to be installed in the home directory,
|
|
180
|
-
# this will force the bindir and the gem install location both
|
|
181
|
-
# to be under /tmp/verifier
|
|
182
|
-
args = gem
|
|
183
|
-
args += " --version #{version}" if version
|
|
184
|
-
args += " --no-rdoc --no-ri --no-format-executable -n #{gem_bin}"
|
|
185
|
-
args += " --no-user-install"
|
|
186
|
-
args
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
# Returns an Array of common helper filenames currently residing on the
|
|
190
|
-
# local workstation.
|
|
191
|
-
#
|
|
192
|
-
# @return [Array<String>] array of helper files
|
|
193
|
-
# @api private
|
|
194
|
-
def helper_files
|
|
195
|
-
glob = File.join(config[:test_base_path], "helpers", "*/**/*")
|
|
196
|
-
Dir.glob(glob).reject { |f| File.directory?(f) }
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
def install_command_vars
|
|
200
|
-
ruby = remote_path_join(config[:ruby_bindir], "ruby").
|
|
201
|
-
tap { |path| path.concat(".exe") if windows_os? }
|
|
202
|
-
gem = remote_path_join(config[:ruby_bindir], "gem")
|
|
203
|
-
|
|
204
|
-
[
|
|
205
|
-
busser_env,
|
|
206
|
-
shell_var("ruby", ruby),
|
|
207
|
-
shell_var("gem", gem),
|
|
208
|
-
shell_var("version", config[:version]),
|
|
209
|
-
shell_var("gem_install_args", gem_install_args),
|
|
210
|
-
shell_var("busser", sudo(config[:busser_bin])),
|
|
211
|
-
shell_var("plugins", plugins.join(" "))
|
|
212
|
-
].join("\n")
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
# Returns an Array of test suite filenames for the related suite currently
|
|
216
|
-
# residing on the local workstation. Any special provisioner-specific
|
|
217
|
-
# directories (such as a Chef roles/ directory) are excluded.
|
|
218
|
-
#
|
|
219
|
-
# @return [Array<String>] array of suite files
|
|
220
|
-
# @api private
|
|
221
|
-
def local_suite_files
|
|
222
|
-
base = File.join(config[:test_base_path], config[:suite_name])
|
|
223
|
-
glob = File.join(base, "*/**/*")
|
|
224
|
-
Dir.glob(glob).reject do |f|
|
|
225
|
-
chef_data_dir?(base, f) || File.directory?(f)
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
# Returns a uniquely sorted Array of Busser plugin gems that need to
|
|
230
|
-
# be installed for the related suite.
|
|
231
|
-
#
|
|
232
|
-
# @return [Array<String>] a lexically sorted, unique item array of Busser
|
|
233
|
-
# plugin gem names
|
|
234
|
-
# @api private
|
|
235
|
-
def plugins
|
|
236
|
-
non_suite_dirs = %w[data data_bags environments nodes roles]
|
|
237
|
-
glob = File.join(config[:test_base_path], config[:suite_name], "*")
|
|
238
|
-
Dir.glob(glob).reject { |d|
|
|
239
|
-
!File.directory?(d) || non_suite_dirs.include?(File.basename(d))
|
|
240
|
-
}.map { |d| "busser-#{File.basename(d)}" }.sort.uniq
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
# Copies all common testing helper files into the suites directory in
|
|
244
|
-
# the sandbox.
|
|
245
|
-
#
|
|
246
|
-
# @api private
|
|
247
|
-
def prepare_helpers
|
|
248
|
-
base = File.join(config[:test_base_path], "helpers")
|
|
249
|
-
|
|
250
|
-
helper_files.each do |src|
|
|
251
|
-
dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
|
|
252
|
-
FileUtils.mkdir_p(File.dirname(dest))
|
|
253
|
-
FileUtils.cp(src, dest, :preserve => true)
|
|
254
|
-
end
|
|
255
|
-
end
|
|
256
|
-
|
|
257
|
-
# Copies all test suite files into the suites directory in the sandbox.
|
|
258
|
-
#
|
|
259
|
-
# @api private
|
|
260
|
-
def prepare_suites
|
|
261
|
-
base = File.join(config[:test_base_path], config[:suite_name])
|
|
262
|
-
|
|
263
|
-
local_suite_files.each do |src|
|
|
264
|
-
dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
|
|
265
|
-
FileUtils.mkdir_p(File.dirname(dest))
|
|
266
|
-
FileUtils.cp(src, dest, :preserve => true)
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
# @return [String] path to suites directory under sandbox path
|
|
271
|
-
# @api private
|
|
272
|
-
def sandbox_suites_dir
|
|
273
|
-
File.join(sandbox_path, "suites")
|
|
274
|
-
end
|
|
275
|
-
end
|
|
276
|
-
end
|
|
277
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2012, 2013, Fletcher Nichol
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
|
|
19
|
+
require "base64"
|
|
20
|
+
require "digest"
|
|
21
|
+
|
|
22
|
+
require "kitchen/verifier/base"
|
|
23
|
+
|
|
24
|
+
module Kitchen
|
|
25
|
+
|
|
26
|
+
module Verifier
|
|
27
|
+
|
|
28
|
+
# Command string generator to interface with Busser. The commands that are
|
|
29
|
+
# generated are safe to pass to an SSH command or as an unix command
|
|
30
|
+
# argument (escaped in single quotes).
|
|
31
|
+
#
|
|
32
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
33
|
+
class Busser < Kitchen::Verifier::Base
|
|
34
|
+
|
|
35
|
+
kitchen_verifier_api_version 1
|
|
36
|
+
|
|
37
|
+
plugin_version Kitchen::VERSION
|
|
38
|
+
|
|
39
|
+
default_config :busser_bin do |verifier|
|
|
40
|
+
verifier.
|
|
41
|
+
remote_path_join(%W[#{verifier[:root_path]} bin busser]).
|
|
42
|
+
tap { |path| path.concat(".bat") if verifier.windows_os? }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
default_config :ruby_bindir do |verifier|
|
|
46
|
+
if verifier.windows_os?
|
|
47
|
+
"$env:systemdrive\\opscode\\chef\\embedded\\bin"
|
|
48
|
+
else
|
|
49
|
+
verifier.remote_path_join(%W[#{verifier[:chef_omnibus_root]} embedded bin])
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
default_config :version, "busser"
|
|
54
|
+
|
|
55
|
+
expand_path_for :test_base_path
|
|
56
|
+
|
|
57
|
+
# Creates a new Busser object using the provided configuration data
|
|
58
|
+
# which will be merged with any default configuration.
|
|
59
|
+
#
|
|
60
|
+
# @param config [Hash] provided driver configuration
|
|
61
|
+
def initialize(config = {})
|
|
62
|
+
init_config(config)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# (see Base#create_sandbox)
|
|
66
|
+
def create_sandbox
|
|
67
|
+
super
|
|
68
|
+
prepare_helpers
|
|
69
|
+
prepare_suites
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# (see Base#init_command)
|
|
73
|
+
def init_command
|
|
74
|
+
return if local_suite_files.empty?
|
|
75
|
+
|
|
76
|
+
cmd = sudo(config[:busser_bin]).dup.
|
|
77
|
+
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
78
|
+
|
|
79
|
+
prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
|
|
80
|
+
#{busser_env}
|
|
81
|
+
|
|
82
|
+
#{cmd} suite cleanup
|
|
83
|
+
CMD
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# (see Base#install_command)
|
|
87
|
+
def install_command
|
|
88
|
+
return if local_suite_files.empty?
|
|
89
|
+
|
|
90
|
+
vars = install_command_vars
|
|
91
|
+
|
|
92
|
+
prefix_command(shell_code_from_file(vars, "busser_install_command"))
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# (see Base#run_command)
|
|
96
|
+
def run_command
|
|
97
|
+
return if local_suite_files.empty?
|
|
98
|
+
|
|
99
|
+
cmd = sudo(config[:busser_bin]).dup.
|
|
100
|
+
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
101
|
+
|
|
102
|
+
prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
|
|
103
|
+
#{busser_env}
|
|
104
|
+
|
|
105
|
+
#{cmd} test
|
|
106
|
+
CMD
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Legacy method stub for `#setup_cmd` which calls `#install_command`.
|
|
110
|
+
#
|
|
111
|
+
# @return [String] command string
|
|
112
|
+
# @deprecated When backwards compatibility for old Busser methods is
|
|
113
|
+
# removed, this method will no longer be available. Use
|
|
114
|
+
# `#install_command` in its place.
|
|
115
|
+
define_method(:setup_cmd) { install_command }
|
|
116
|
+
|
|
117
|
+
# Legacy method stub for `#run_cmd` which calls `#run_command`.
|
|
118
|
+
#
|
|
119
|
+
# @return [String] command string
|
|
120
|
+
# @deprecated When backwards compatibility for old Busser methods is
|
|
121
|
+
# removed, this method will no longer be available. Use
|
|
122
|
+
# `#run_command` in its place.
|
|
123
|
+
define_method(:run_cmd) { run_command }
|
|
124
|
+
|
|
125
|
+
# Legacy method stub for `#sync_cmd`.
|
|
126
|
+
#
|
|
127
|
+
# @deprecated When backwards compatibility for old Busser methods is
|
|
128
|
+
# removed, this method will no longer be available. Use
|
|
129
|
+
# `transport#upload` to transfer test files in its place.
|
|
130
|
+
def sync_cmd
|
|
131
|
+
warn("Legacy call to #sync_cmd cannot be preserved, meaning that " \
|
|
132
|
+
"test files will not be uploaded. " \
|
|
133
|
+
"Code that calls #sync_cmd can now use the transport#upload " \
|
|
134
|
+
"method to transfer files.")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
private
|
|
138
|
+
|
|
139
|
+
# Returns a command string that sets appropriate environment variables for
|
|
140
|
+
# busser commands.
|
|
141
|
+
#
|
|
142
|
+
# @return [String] command string
|
|
143
|
+
# @api private
|
|
144
|
+
def busser_env
|
|
145
|
+
root = config[:root_path]
|
|
146
|
+
gem_home = gem_path = remote_path_join(root, "gems")
|
|
147
|
+
gem_cache = remote_path_join(gem_home, "cache")
|
|
148
|
+
|
|
149
|
+
[
|
|
150
|
+
shell_env_var("BUSSER_ROOT", root),
|
|
151
|
+
shell_env_var("GEM_HOME", gem_home),
|
|
152
|
+
shell_env_var("GEM_PATH", gem_path),
|
|
153
|
+
shell_env_var("GEM_CACHE", gem_cache)
|
|
154
|
+
].join("\n")
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Determines whether or not a local workstation file exists under a
|
|
158
|
+
# Chef-related directory.
|
|
159
|
+
#
|
|
160
|
+
# @return [truthy,falsey] whether or not a given file is some kind of
|
|
161
|
+
# Chef-related file
|
|
162
|
+
# @api private
|
|
163
|
+
def chef_data_dir?(base, file)
|
|
164
|
+
file =~ %r{^#{base}/(data|data_bags|environments|nodes|roles)/}
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Returns arguments to a `gem install` command, suitable to install the
|
|
168
|
+
# Busser gem.
|
|
169
|
+
#
|
|
170
|
+
# @return [String] arguments string
|
|
171
|
+
# @api private
|
|
172
|
+
def gem_install_args
|
|
173
|
+
gem, version = config[:version].split("@")
|
|
174
|
+
gem, version = "busser", gem if gem =~ /^\d+\.\d+\.\d+/
|
|
175
|
+
|
|
176
|
+
root = config[:root_path]
|
|
177
|
+
gem_bin = remote_path_join(root, "bin")
|
|
178
|
+
|
|
179
|
+
# We don't want the gems to be installed in the home directory,
|
|
180
|
+
# this will force the bindir and the gem install location both
|
|
181
|
+
# to be under /tmp/verifier
|
|
182
|
+
args = gem
|
|
183
|
+
args += " --version #{version}" if version
|
|
184
|
+
args += " --no-rdoc --no-ri --no-format-executable -n #{gem_bin}"
|
|
185
|
+
args += " --no-user-install"
|
|
186
|
+
args
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Returns an Array of common helper filenames currently residing on the
|
|
190
|
+
# local workstation.
|
|
191
|
+
#
|
|
192
|
+
# @return [Array<String>] array of helper files
|
|
193
|
+
# @api private
|
|
194
|
+
def helper_files
|
|
195
|
+
glob = File.join(config[:test_base_path], "helpers", "*/**/*")
|
|
196
|
+
Dir.glob(glob).reject { |f| File.directory?(f) }
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def install_command_vars
|
|
200
|
+
ruby = remote_path_join(config[:ruby_bindir], "ruby").
|
|
201
|
+
tap { |path| path.concat(".exe") if windows_os? }
|
|
202
|
+
gem = remote_path_join(config[:ruby_bindir], "gem")
|
|
203
|
+
|
|
204
|
+
[
|
|
205
|
+
busser_env,
|
|
206
|
+
shell_var("ruby", ruby),
|
|
207
|
+
shell_var("gem", gem),
|
|
208
|
+
shell_var("version", config[:version]),
|
|
209
|
+
shell_var("gem_install_args", gem_install_args),
|
|
210
|
+
shell_var("busser", sudo(config[:busser_bin])),
|
|
211
|
+
shell_var("plugins", plugins.join(" "))
|
|
212
|
+
].join("\n")
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Returns an Array of test suite filenames for the related suite currently
|
|
216
|
+
# residing on the local workstation. Any special provisioner-specific
|
|
217
|
+
# directories (such as a Chef roles/ directory) are excluded.
|
|
218
|
+
#
|
|
219
|
+
# @return [Array<String>] array of suite files
|
|
220
|
+
# @api private
|
|
221
|
+
def local_suite_files
|
|
222
|
+
base = File.join(config[:test_base_path], config[:suite_name])
|
|
223
|
+
glob = File.join(base, "*/**/*")
|
|
224
|
+
Dir.glob(glob).reject do |f|
|
|
225
|
+
chef_data_dir?(base, f) || File.directory?(f)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Returns a uniquely sorted Array of Busser plugin gems that need to
|
|
230
|
+
# be installed for the related suite.
|
|
231
|
+
#
|
|
232
|
+
# @return [Array<String>] a lexically sorted, unique item array of Busser
|
|
233
|
+
# plugin gem names
|
|
234
|
+
# @api private
|
|
235
|
+
def plugins
|
|
236
|
+
non_suite_dirs = %w[data data_bags environments nodes roles]
|
|
237
|
+
glob = File.join(config[:test_base_path], config[:suite_name], "*")
|
|
238
|
+
Dir.glob(glob).reject { |d|
|
|
239
|
+
!File.directory?(d) || non_suite_dirs.include?(File.basename(d))
|
|
240
|
+
}.map { |d| "busser-#{File.basename(d)}" }.sort.uniq
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Copies all common testing helper files into the suites directory in
|
|
244
|
+
# the sandbox.
|
|
245
|
+
#
|
|
246
|
+
# @api private
|
|
247
|
+
def prepare_helpers
|
|
248
|
+
base = File.join(config[:test_base_path], "helpers")
|
|
249
|
+
|
|
250
|
+
helper_files.each do |src|
|
|
251
|
+
dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
|
|
252
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
|
253
|
+
FileUtils.cp(src, dest, :preserve => true)
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# Copies all test suite files into the suites directory in the sandbox.
|
|
258
|
+
#
|
|
259
|
+
# @api private
|
|
260
|
+
def prepare_suites
|
|
261
|
+
base = File.join(config[:test_base_path], config[:suite_name])
|
|
262
|
+
|
|
263
|
+
local_suite_files.each do |src|
|
|
264
|
+
dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
|
|
265
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
|
266
|
+
FileUtils.cp(src, dest, :preserve => true)
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# @return [String] path to suites directory under sandbox path
|
|
271
|
+
# @api private
|
|
272
|
+
def sandbox_suites_dir
|
|
273
|
+
File.join(sandbox_path, "suites")
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
end
|