test-kitchen-rsync 3.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|