test-kitchen-rsync 3.0.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +21 -0
- data/LICENSE +15 -0
- data/Rakefile +53 -0
- data/bin/zl-kitchen +11 -0
- data/lib/kitchen/base64_stream.rb +48 -0
- data/lib/kitchen/chef_utils_wiring.rb +40 -0
- data/lib/kitchen/cli.rb +413 -0
- data/lib/kitchen/collection.rb +52 -0
- data/lib/kitchen/color.rb +63 -0
- data/lib/kitchen/command/action.rb +41 -0
- data/lib/kitchen/command/console.rb +54 -0
- data/lib/kitchen/command/diagnose.rb +84 -0
- data/lib/kitchen/command/doctor.rb +39 -0
- data/lib/kitchen/command/exec.rb +37 -0
- data/lib/kitchen/command/list.rb +148 -0
- data/lib/kitchen/command/login.rb +39 -0
- data/lib/kitchen/command/package.rb +32 -0
- data/lib/kitchen/command/sink.rb +50 -0
- data/lib/kitchen/command/test.rb +47 -0
- data/lib/kitchen/command.rb +207 -0
- data/lib/kitchen/config.rb +344 -0
- data/lib/kitchen/configurable.rb +616 -0
- data/lib/kitchen/data_munger.rb +1024 -0
- data/lib/kitchen/diagnostic.rb +138 -0
- data/lib/kitchen/driver/base.rb +133 -0
- data/lib/kitchen/driver/dummy.rb +105 -0
- data/lib/kitchen/driver/exec.rb +70 -0
- data/lib/kitchen/driver/proxy.rb +70 -0
- data/lib/kitchen/driver/ssh_base.rb +351 -0
- data/lib/kitchen/driver.rb +40 -0
- data/lib/kitchen/errors.rb +243 -0
- data/lib/kitchen/generator/init.rb +254 -0
- data/lib/kitchen/instance.rb +726 -0
- data/lib/kitchen/lazy_hash.rb +148 -0
- data/lib/kitchen/lifecycle_hook/base.rb +78 -0
- data/lib/kitchen/lifecycle_hook/local.rb +53 -0
- data/lib/kitchen/lifecycle_hook/remote.rb +39 -0
- data/lib/kitchen/lifecycle_hooks.rb +92 -0
- data/lib/kitchen/loader/yaml.rb +377 -0
- data/lib/kitchen/logger.rb +422 -0
- data/lib/kitchen/logging.rb +52 -0
- data/lib/kitchen/login_command.rb +49 -0
- data/lib/kitchen/metadata_chopper.rb +49 -0
- data/lib/kitchen/platform.rb +64 -0
- data/lib/kitchen/plugin.rb +76 -0
- data/lib/kitchen/plugin_base.rb +60 -0
- data/lib/kitchen/provisioner/base.rb +269 -0
- data/lib/kitchen/provisioner/chef/berkshelf.rb +116 -0
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +350 -0
- data/lib/kitchen/provisioner/chef/policyfile.rb +163 -0
- data/lib/kitchen/provisioner/chef_apply.rb +121 -0
- data/lib/kitchen/provisioner/chef_base.rb +705 -0
- data/lib/kitchen/provisioner/chef_infra.rb +167 -0
- data/lib/kitchen/provisioner/chef_solo.rb +82 -0
- data/lib/kitchen/provisioner/chef_zero.rb +12 -0
- data/lib/kitchen/provisioner/dummy.rb +75 -0
- data/lib/kitchen/provisioner/shell.rb +157 -0
- data/lib/kitchen/provisioner.rb +42 -0
- data/lib/kitchen/rake_tasks.rb +80 -0
- data/lib/kitchen/shell_out.rb +90 -0
- data/lib/kitchen/ssh.rb +289 -0
- data/lib/kitchen/state_file.rb +112 -0
- data/lib/kitchen/suite.rb +48 -0
- data/lib/kitchen/thor_tasks.rb +63 -0
- data/lib/kitchen/transport/base.rb +236 -0
- data/lib/kitchen/transport/dummy.rb +78 -0
- data/lib/kitchen/transport/exec.rb +145 -0
- data/lib/kitchen/transport/ssh.rb +579 -0
- data/lib/kitchen/transport/winrm.rb +546 -0
- data/lib/kitchen/transport.rb +40 -0
- data/lib/kitchen/util.rb +229 -0
- data/lib/kitchen/verifier/base.rb +243 -0
- data/lib/kitchen/verifier/busser.rb +275 -0
- data/lib/kitchen/verifier/dummy.rb +75 -0
- data/lib/kitchen/verifier/shell.rb +99 -0
- data/lib/kitchen/verifier.rb +39 -0
- data/lib/kitchen/version.rb +20 -0
- data/lib/kitchen/which.rb +26 -0
- data/lib/kitchen.rb +152 -0
- data/lib/vendor/hash_recursive_merge.rb +79 -0
- data/support/busser_install_command.ps1 +14 -0
- data/support/busser_install_command.sh +21 -0
- data/support/chef-client-fail-if-update-handler.rb +15 -0
- data/support/chef_base_init_command.ps1 +18 -0
- data/support/chef_base_init_command.sh +1 -0
- data/support/chef_base_install_command.ps1 +85 -0
- data/support/chef_base_install_command.sh +229 -0
- data/support/download_helpers.sh +109 -0
- data/support/dummy-validation.pem +27 -0
- data/templates/driver/CHANGELOG.md.erb +3 -0
- data/templates/driver/Gemfile.erb +3 -0
- data/templates/driver/README.md.erb +64 -0
- data/templates/driver/Rakefile.erb +21 -0
- data/templates/driver/driver.rb.erb +23 -0
- data/templates/driver/gemspec.erb +29 -0
- data/templates/driver/gitignore.erb +17 -0
- data/templates/driver/license_apachev2.erb +15 -0
- data/templates/driver/license_lgplv3.erb +16 -0
- data/templates/driver/license_mit.erb +22 -0
- data/templates/driver/license_reserved.erb +5 -0
- data/templates/driver/tailor.erb +4 -0
- data/templates/driver/travis.yml.erb +11 -0
- data/templates/driver/version.rb.erb +12 -0
- data/templates/init/chefignore.erb +2 -0
- data/templates/init/kitchen.yml.erb +18 -0
- data/test-kitchen.gemspec +52 -0
- metadata +528 -0
|
@@ -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
|
|
@@ -0,0 +1,82 @@
|
|
|
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 Solo provisioner.
|
|
23
|
+
#
|
|
24
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
25
|
+
class ChefSolo < ChefBase
|
|
26
|
+
kitchen_provisioner_api_version 2
|
|
27
|
+
|
|
28
|
+
plugin_version Kitchen::VERSION
|
|
29
|
+
|
|
30
|
+
# ChefSolo is dependent on Berkshelf, which is not thread-safe.
|
|
31
|
+
# See discussion on https://github.com/test-kitchen/test-kitchen/issues/1307
|
|
32
|
+
no_parallel_for :converge
|
|
33
|
+
|
|
34
|
+
default_config :solo_rb, {}
|
|
35
|
+
|
|
36
|
+
default_config :chef_solo_path do |provisioner|
|
|
37
|
+
provisioner
|
|
38
|
+
.remote_path_join(%W{#{provisioner[:chef_omnibus_root]} bin chef-solo})
|
|
39
|
+
.tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# (see Base#config_filename)
|
|
43
|
+
def config_filename
|
|
44
|
+
"solo.rb"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# (see Base#create_sandbox)
|
|
48
|
+
def create_sandbox
|
|
49
|
+
super
|
|
50
|
+
prepare_config_rb
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# (see Base#run_command)
|
|
54
|
+
def run_command
|
|
55
|
+
cmd = sudo(config[:chef_solo_path]).dup
|
|
56
|
+
.tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
57
|
+
|
|
58
|
+
chef_cmd(cmd)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
# Returns an Array of command line arguments for the chef client.
|
|
64
|
+
#
|
|
65
|
+
# @return [Array<String>] an array of command line arguments
|
|
66
|
+
# @api private
|
|
67
|
+
def chef_args(solo_rb_filename)
|
|
68
|
+
args = [
|
|
69
|
+
"--config #{remote_path_join(config[:root_path], solo_rb_filename)}",
|
|
70
|
+
"--log_level #{config[:log_level]}",
|
|
71
|
+
"--force-formatter",
|
|
72
|
+
"--no-color",
|
|
73
|
+
"--json-attributes #{remote_path_join(config[:root_path], "dna.json")}",
|
|
74
|
+
]
|
|
75
|
+
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
|
76
|
+
args << "--profile-ruby" if config[:profile_ruby]
|
|
77
|
+
args << "--legacy-mode" if config[:legacy_mode]
|
|
78
|
+
args
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Deprecated AS PER THE PR - https://github.com/test-kitchen/test-kitchen/pull/1730
|
|
2
|
+
require_relative "chef_infra"
|
|
3
|
+
|
|
4
|
+
module Kitchen
|
|
5
|
+
module Provisioner
|
|
6
|
+
# Chef Zero provisioner.
|
|
7
|
+
#
|
|
8
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
9
|
+
class ChefZero < ChefInfra
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
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 "../../kitchen"
|
|
19
|
+
|
|
20
|
+
module Kitchen
|
|
21
|
+
module Provisioner
|
|
22
|
+
# Dummy provisioner for Kitchen. This driver does nothing but report what
|
|
23
|
+
# would happen if this provisioner did anything of consequence. As a result
|
|
24
|
+
# it may be a useful provisioner to use when debugging or developing new
|
|
25
|
+
# features or plugins.
|
|
26
|
+
#
|
|
27
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
+
class Dummy < Kitchen::Provisioner::Base
|
|
29
|
+
kitchen_provisioner_api_version 2
|
|
30
|
+
|
|
31
|
+
plugin_version Kitchen::VERSION
|
|
32
|
+
|
|
33
|
+
default_config :sleep, 0
|
|
34
|
+
default_config :random_failure, false
|
|
35
|
+
|
|
36
|
+
# (see Base#call)
|
|
37
|
+
def call(state)
|
|
38
|
+
info("[#{name}] Converge on instance=#{instance} with state=#{state}")
|
|
39
|
+
sleep_if_set
|
|
40
|
+
failure_if_set
|
|
41
|
+
debug("[#{name}] Converge completed (#{config[:sleep]}s).")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
# Sleep for a period of time, if a value is set in the config.
|
|
47
|
+
#
|
|
48
|
+
# @api private
|
|
49
|
+
def sleep_if_set
|
|
50
|
+
sleep(config[:sleep].to_f) if config[:sleep].to_f > 0.0
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Simulate a failure in an action, if set in the config.
|
|
54
|
+
#
|
|
55
|
+
# @api private
|
|
56
|
+
def failure_if_set
|
|
57
|
+
if config[:fail]
|
|
58
|
+
debug("Failure for Provisioner #{name}.")
|
|
59
|
+
raise ActionFailed, "Action #converge failed for #{instance.to_str}."
|
|
60
|
+
elsif config[:random_failure] && randomly_fail?
|
|
61
|
+
debug("Random failure for Provisioner #{name}.")
|
|
62
|
+
raise ActionFailed, "Action #converge failed for #{instance.to_str}."
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Determine whether or not to randomly fail.
|
|
67
|
+
#
|
|
68
|
+
# @return [true, false]
|
|
69
|
+
# @api private
|
|
70
|
+
def randomly_fail?
|
|
71
|
+
[true, false].sample
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Chris Lundquist (<chris.lundquist@github.com>)
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2013, Chris Lundquist
|
|
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 "shellwords" unless defined?(Shellwords)
|
|
19
|
+
|
|
20
|
+
require_relative "base"
|
|
21
|
+
require_relative "../version"
|
|
22
|
+
|
|
23
|
+
module Kitchen
|
|
24
|
+
module Provisioner
|
|
25
|
+
# Basic shell provisioner.
|
|
26
|
+
#
|
|
27
|
+
# @author Chris Lundquist (<chris.ludnquist@github.com>)
|
|
28
|
+
class Shell < Base
|
|
29
|
+
kitchen_provisioner_api_version 2
|
|
30
|
+
|
|
31
|
+
plugin_version Kitchen::VERSION
|
|
32
|
+
|
|
33
|
+
default_config :script do |provisioner|
|
|
34
|
+
src = provisioner.powershell_shell? ? "bootstrap.ps1" : "bootstrap.sh"
|
|
35
|
+
provisioner.calculate_path(src, type: :file)
|
|
36
|
+
end
|
|
37
|
+
expand_path_for :script
|
|
38
|
+
|
|
39
|
+
# Run a single command instead of managing and running a script.
|
|
40
|
+
default_config :command, nil
|
|
41
|
+
|
|
42
|
+
# Add extra arguments to the converge script.
|
|
43
|
+
default_config :arguments, []
|
|
44
|
+
|
|
45
|
+
default_config :data_path do |provisioner|
|
|
46
|
+
provisioner.calculate_path("data")
|
|
47
|
+
end
|
|
48
|
+
expand_path_for :data_path
|
|
49
|
+
|
|
50
|
+
# (see Base#create_sandbox)
|
|
51
|
+
def create_sandbox
|
|
52
|
+
super
|
|
53
|
+
prepare_data
|
|
54
|
+
prepare_script
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# (see Base#init_command)
|
|
58
|
+
def init_command
|
|
59
|
+
return nil if config[:command]
|
|
60
|
+
|
|
61
|
+
root = config[:root_path]
|
|
62
|
+
data = remote_path_join(root, "data")
|
|
63
|
+
|
|
64
|
+
code = if powershell_shell?
|
|
65
|
+
Util.outdent!(<<-POWERSHELL)
|
|
66
|
+
if (Test-Path "#{data}") {
|
|
67
|
+
Remove-Item "#{data}" -Recurse -Force
|
|
68
|
+
}
|
|
69
|
+
if (-Not (Test-Path "#{root}")) {
|
|
70
|
+
New-Item "#{root}" -ItemType directory | Out-Null
|
|
71
|
+
}
|
|
72
|
+
POWERSHELL
|
|
73
|
+
else
|
|
74
|
+
"#{sudo("rm")} -rf #{data} ; mkdir -p #{root}"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
prefix_command(wrap_shell_code(code))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# (see Base#prepare_command)
|
|
81
|
+
def prepare_command
|
|
82
|
+
# On a windows host, the supplied script does not get marked as executable
|
|
83
|
+
# due to windows not having the concept of an executable flag
|
|
84
|
+
#
|
|
85
|
+
# When the guest instance is *nix, `chmod +x` the script in the guest, prior to executing
|
|
86
|
+
return unless unix_os? && config[:script] && !config[:command]
|
|
87
|
+
|
|
88
|
+
debug "Marking script as executable"
|
|
89
|
+
script = remote_path_join(
|
|
90
|
+
config[:root_path],
|
|
91
|
+
File.basename(config[:script])
|
|
92
|
+
)
|
|
93
|
+
prefix_command(wrap_shell_code(sudo("chmod +x #{script}")))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# (see Base#run_command)
|
|
97
|
+
def run_command
|
|
98
|
+
return prefix_command(wrap_shell_code(config[:command])) if config[:command]
|
|
99
|
+
return unless config[:script]
|
|
100
|
+
|
|
101
|
+
script = remote_path_join(
|
|
102
|
+
config[:root_path],
|
|
103
|
+
File.basename(config[:script])
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if config[:arguments] && !config[:arguments].empty?
|
|
107
|
+
if config[:arguments].is_a?(Array)
|
|
108
|
+
if powershell_shell?
|
|
109
|
+
script = ([script] + config[:arguments]).join(" ")
|
|
110
|
+
else
|
|
111
|
+
script = Shellwords.join([script] + config[:arguments])
|
|
112
|
+
end
|
|
113
|
+
else
|
|
114
|
+
script.concat(" ").concat(config[:arguments].to_s)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
code = powershell_shell? ? %{& #{script}} : sudo(script)
|
|
119
|
+
|
|
120
|
+
prefix_command(wrap_shell_code(code))
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
private
|
|
124
|
+
|
|
125
|
+
# Creates a data directory in the sandbox directory, if a data directory
|
|
126
|
+
# can be found and copies in the tree.
|
|
127
|
+
#
|
|
128
|
+
# @api private
|
|
129
|
+
def prepare_data
|
|
130
|
+
return unless config[:data_path]
|
|
131
|
+
|
|
132
|
+
info("Preparing data")
|
|
133
|
+
debug("Using data from #{config[:data_path]}")
|
|
134
|
+
|
|
135
|
+
tmpdata_dir = File.join(sandbox_path, "data")
|
|
136
|
+
FileUtils.mkdir_p(tmpdata_dir)
|
|
137
|
+
FileUtils.cp_r(Util.list_directory(config[:data_path]), tmpdata_dir)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Copies the executable script to the sandbox directory or creates a
|
|
141
|
+
# stub script if one cannot be found.
|
|
142
|
+
#
|
|
143
|
+
# @api private
|
|
144
|
+
def prepare_script
|
|
145
|
+
info("Preparing script")
|
|
146
|
+
|
|
147
|
+
if config[:script]
|
|
148
|
+
debug("Using script from #{config[:script]}")
|
|
149
|
+
FileUtils.cp_r(config[:script], sandbox_path)
|
|
150
|
+
else
|
|
151
|
+
info("No provisioner script file specified, skipping")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2013, Fletcher Nichol
|
|
5
|
+
# Copyright (C) Chef Software Inc.
|
|
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_relative "plugin"
|
|
20
|
+
|
|
21
|
+
module Kitchen
|
|
22
|
+
# A provisioner is responsible for generating the commands necessary to
|
|
23
|
+
# install set up and use a configuration management tool such as Chef and
|
|
24
|
+
# Puppet.
|
|
25
|
+
#
|
|
26
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
27
|
+
module Provisioner
|
|
28
|
+
# Default provisioner to use
|
|
29
|
+
DEFAULT_PLUGIN = "chef_infra".freeze
|
|
30
|
+
|
|
31
|
+
# Returns an instance of a provisioner given a plugin type string.
|
|
32
|
+
#
|
|
33
|
+
# @param plugin [String] a provisioner plugin type, to be constantized
|
|
34
|
+
# @param config [Hash] a configuration hash to initialize the provisioner
|
|
35
|
+
# @return [Provisioner::Base] a provisioner instance
|
|
36
|
+
# @raise [ClientError] if a provisioner instance could not be created
|
|
37
|
+
def self.for_plugin(plugin, config)
|
|
38
|
+
plugin, config[:name] = "chef_infra", "chef_infra" if plugin == "chef_zero"
|
|
39
|
+
Kitchen::Plugin.load(self, plugin, config)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2012, 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 "rake/tasklib"
|
|
19
|
+
|
|
20
|
+
require_relative "../kitchen"
|
|
21
|
+
|
|
22
|
+
module Kitchen
|
|
23
|
+
# Kitchen Rake task generator.
|
|
24
|
+
#
|
|
25
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
26
|
+
class RakeTasks < ::Rake::TaskLib
|
|
27
|
+
# Creates Kitchen Rake tasks and allows the callee to configure it.
|
|
28
|
+
#
|
|
29
|
+
# @yield [self] gives itself to the block
|
|
30
|
+
def initialize(cfg = {})
|
|
31
|
+
@loader = Kitchen::Loader::YAML.new(
|
|
32
|
+
project_config: ENV["KITCHEN_YAML"],
|
|
33
|
+
local_config: ENV["KITCHEN_LOCAL_YAML"],
|
|
34
|
+
global_config: ENV["KITCHEN_GLOBAL_YAML"]
|
|
35
|
+
)
|
|
36
|
+
@config = Kitchen::Config.new(
|
|
37
|
+
{ loader: @loader }.merge(cfg)
|
|
38
|
+
)
|
|
39
|
+
Kitchen.logger = Kitchen.default_file_logger(nil, false)
|
|
40
|
+
yield self if block_given?
|
|
41
|
+
define
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @return [Config] a Kitchen::Config
|
|
45
|
+
attr_reader :config
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
# Generates a test Rake task for each instance and one to test all
|
|
50
|
+
# instances in serial.
|
|
51
|
+
#
|
|
52
|
+
# @api private
|
|
53
|
+
def define
|
|
54
|
+
namespace "kitchen" do
|
|
55
|
+
kitchen_commands = %w{create converge setup verify destroy}
|
|
56
|
+
config.instances.each do |instance|
|
|
57
|
+
desc "Run #{instance.name} test instance"
|
|
58
|
+
task instance.name do
|
|
59
|
+
instance.test(:always)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
kitchen_commands.each do |cmd|
|
|
63
|
+
namespace cmd do
|
|
64
|
+
task instance.name do
|
|
65
|
+
instance.send(cmd)
|
|
66
|
+
end
|
|
67
|
+
desc "Run all #{cmd} instances"
|
|
68
|
+
task "all" => config.instances.map(&:name)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
desc "Run all test instances"
|
|
74
|
+
task "all" => config.instances.map(&:name)
|
|
75
|
+
|
|
76
|
+
kitchen_commands.each { |cmd| task cmd => "#{cmd}:all" }
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|