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,88 +1,88 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 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 "kitchen/provisioner/chef_base"
|
|
20
|
-
|
|
21
|
-
module Kitchen
|
|
22
|
-
|
|
23
|
-
module Provisioner
|
|
24
|
-
|
|
25
|
-
# Chef Solo provisioner.
|
|
26
|
-
#
|
|
27
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
-
class ChefSolo < ChefBase
|
|
29
|
-
|
|
30
|
-
kitchen_provisioner_api_version 2
|
|
31
|
-
|
|
32
|
-
plugin_version Kitchen::VERSION
|
|
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#create_sandbox)
|
|
43
|
-
def create_sandbox
|
|
44
|
-
super
|
|
45
|
-
prepare_solo_rb
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# (see Base#run_command)
|
|
49
|
-
def run_command # rubocop:disable Metrics/AbcSize
|
|
50
|
-
level = config[:log_level]
|
|
51
|
-
cmd = sudo(config[:chef_solo_path]).dup.
|
|
52
|
-
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
53
|
-
args = [
|
|
54
|
-
"--config #{remote_path_join(config[:root_path], "solo.rb")}",
|
|
55
|
-
"--log_level #{level}",
|
|
56
|
-
"--force-formatter",
|
|
57
|
-
"--no-color",
|
|
58
|
-
"--json-attributes #{remote_path_join(config[:root_path], "dna.json")}"
|
|
59
|
-
]
|
|
60
|
-
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
|
61
|
-
args << "--profile-ruby" if config[:profile_ruby]
|
|
62
|
-
|
|
63
|
-
prefix_command(
|
|
64
|
-
wrap_shell_code(
|
|
65
|
-
[cmd, *args].join(" ").
|
|
66
|
-
tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
|
|
67
|
-
)
|
|
68
|
-
)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
private
|
|
72
|
-
|
|
73
|
-
# Writes a solo.rb configuration file to the sandbox directory.
|
|
74
|
-
#
|
|
75
|
-
# @api private
|
|
76
|
-
def prepare_solo_rb
|
|
77
|
-
data = default_config_rb.merge(config[:solo_rb])
|
|
78
|
-
|
|
79
|
-
info("Preparing solo.rb")
|
|
80
|
-
debug("Creating solo.rb from #{data.inspect}")
|
|
81
|
-
|
|
82
|
-
File.open(File.join(sandbox_path, "solo.rb"), "wb") do |file|
|
|
83
|
-
file.write(format_config_file(data))
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 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 "kitchen/provisioner/chef_base"
|
|
20
|
+
|
|
21
|
+
module Kitchen
|
|
22
|
+
|
|
23
|
+
module Provisioner
|
|
24
|
+
|
|
25
|
+
# Chef Solo provisioner.
|
|
26
|
+
#
|
|
27
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
+
class ChefSolo < ChefBase
|
|
29
|
+
|
|
30
|
+
kitchen_provisioner_api_version 2
|
|
31
|
+
|
|
32
|
+
plugin_version Kitchen::VERSION
|
|
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#create_sandbox)
|
|
43
|
+
def create_sandbox
|
|
44
|
+
super
|
|
45
|
+
prepare_solo_rb
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# (see Base#run_command)
|
|
49
|
+
def run_command # rubocop:disable Metrics/AbcSize
|
|
50
|
+
level = config[:log_level]
|
|
51
|
+
cmd = sudo(config[:chef_solo_path]).dup.
|
|
52
|
+
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
53
|
+
args = [
|
|
54
|
+
"--config #{remote_path_join(config[:root_path], "solo.rb")}",
|
|
55
|
+
"--log_level #{level}",
|
|
56
|
+
"--force-formatter",
|
|
57
|
+
"--no-color",
|
|
58
|
+
"--json-attributes #{remote_path_join(config[:root_path], "dna.json")}"
|
|
59
|
+
]
|
|
60
|
+
args << "--logfile #{config[:log_file]}" if config[:log_file]
|
|
61
|
+
args << "--profile-ruby" if config[:profile_ruby]
|
|
62
|
+
|
|
63
|
+
prefix_command(
|
|
64
|
+
wrap_shell_code(
|
|
65
|
+
[cmd, *args].join(" ").
|
|
66
|
+
tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
# Writes a solo.rb configuration file to the sandbox directory.
|
|
74
|
+
#
|
|
75
|
+
# @api private
|
|
76
|
+
def prepare_solo_rb
|
|
77
|
+
data = default_config_rb.merge(config[:solo_rb])
|
|
78
|
+
|
|
79
|
+
info("Preparing solo.rb")
|
|
80
|
+
debug("Creating solo.rb from #{data.inspect}")
|
|
81
|
+
|
|
82
|
+
File.open(File.join(sandbox_path, "solo.rb"), "wb") do |file|
|
|
83
|
+
file.write(format_config_file(data))
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 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 "kitchen/provisioner/chef_base"
|
|
20
|
-
|
|
21
|
-
module Kitchen
|
|
22
|
-
|
|
23
|
-
module Provisioner
|
|
24
|
-
|
|
25
|
-
# Chef Zero provisioner.
|
|
26
|
-
#
|
|
27
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
-
class ChefZero < ChefBase
|
|
29
|
-
|
|
30
|
-
kitchen_provisioner_api_version 2
|
|
31
|
-
|
|
32
|
-
plugin_version Kitchen::VERSION
|
|
33
|
-
|
|
34
|
-
default_config :client_rb, {}
|
|
35
|
-
default_config :json_attributes, true
|
|
36
|
-
default_config :chef_zero_host, nil
|
|
37
|
-
default_config :chef_zero_port, 8889
|
|
38
|
-
|
|
39
|
-
default_config :chef_client_path do |provisioner|
|
|
40
|
-
provisioner.
|
|
41
|
-
remote_path_join(%W[#{provisioner[:chef_omnibus_root]} bin chef-client]).
|
|
42
|
-
tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
default_config :ruby_bindir do |provisioner|
|
|
46
|
-
provisioner.
|
|
47
|
-
remote_path_join(%W[#{provisioner[:chef_omnibus_root]} embedded bin])
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# (see Base#create_sandbox)
|
|
51
|
-
def create_sandbox
|
|
52
|
-
super
|
|
53
|
-
prepare_chef_client_zero_rb
|
|
54
|
-
prepare_validation_pem
|
|
55
|
-
prepare_client_rb
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# (see Base#prepare_command)
|
|
59
|
-
def prepare_command
|
|
60
|
-
return if modern?
|
|
61
|
-
|
|
62
|
-
gem_bin = remote_path_join(config[:ruby_bindir], "gem").
|
|
63
|
-
tap { |path| path.concat(".bat") if windows_os? }
|
|
64
|
-
vars = [
|
|
65
|
-
chef_client_zero_env,
|
|
66
|
-
shell_var("gem", sudo(gem_bin))
|
|
67
|
-
].join("\n").concat("\n")
|
|
68
|
-
|
|
69
|
-
prefix_command(shell_code_from_file(vars, "chef_zero_prepare_command_legacy"))
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# (see Base#run_command)
|
|
73
|
-
def run_command
|
|
74
|
-
cmd = modern? ? local_mode_command : shim_command
|
|
75
|
-
|
|
76
|
-
prefix_command(
|
|
77
|
-
wrap_shell_code(
|
|
78
|
-
[cmd, *chef_client_args].join(" ").
|
|
79
|
-
tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
|
|
80
|
-
)
|
|
81
|
-
)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
private
|
|
85
|
-
|
|
86
|
-
# Adds optional flags to a chef-client command, depending on
|
|
87
|
-
# configuration data. Note that this method mutates the incoming Array.
|
|
88
|
-
#
|
|
89
|
-
# @param args [Array<String>] array of flags
|
|
90
|
-
# @api private
|
|
91
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
92
|
-
def add_optional_chef_client_args!(args)
|
|
93
|
-
if config[:json_attributes]
|
|
94
|
-
json = remote_path_join(config[:root_path], "dna.json")
|
|
95
|
-
args << "--json-attributes #{json}"
|
|
96
|
-
end
|
|
97
|
-
if config[:log_file]
|
|
98
|
-
args << "--logfile #{config[:log_file]}"
|
|
99
|
-
end
|
|
100
|
-
return unless modern?
|
|
101
|
-
|
|
102
|
-
# these flags are modern/chef-client local most only and will not work
|
|
103
|
-
# on older versions of chef-client
|
|
104
|
-
if config[:chef_zero_host]
|
|
105
|
-
args << "--chef-zero-host #{config[:chef_zero_host]}"
|
|
106
|
-
end
|
|
107
|
-
if config[:chef_zero_port]
|
|
108
|
-
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
|
109
|
-
end
|
|
110
|
-
if config[:profile_ruby]
|
|
111
|
-
args << "--profile-ruby"
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
115
|
-
|
|
116
|
-
# Returns an Array of command line arguments for the chef client.
|
|
117
|
-
#
|
|
118
|
-
# @return [Array<String>] an array of command line arguments
|
|
119
|
-
# @api private
|
|
120
|
-
def chef_client_args
|
|
121
|
-
level = config[:log_level]
|
|
122
|
-
args = [
|
|
123
|
-
"--config #{remote_path_join(config[:root_path], "client.rb")}",
|
|
124
|
-
"--log_level #{level}",
|
|
125
|
-
"--force-formatter",
|
|
126
|
-
"--no-color"
|
|
127
|
-
]
|
|
128
|
-
add_optional_chef_client_args!(args)
|
|
129
|
-
|
|
130
|
-
args
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Generates a string of shell environment variables needed for the
|
|
134
|
-
# chef-client-zero.rb shim script to properly function.
|
|
135
|
-
#
|
|
136
|
-
# @return [String] a shell script string
|
|
137
|
-
# @api private
|
|
138
|
-
def chef_client_zero_env
|
|
139
|
-
root = config[:root_path]
|
|
140
|
-
gem_home = gem_path = remote_path_join(root, "chef-client-zero-gems")
|
|
141
|
-
gem_cache = remote_path_join(gem_home, "cache")
|
|
142
|
-
|
|
143
|
-
[
|
|
144
|
-
shell_env_var("CHEF_REPO_PATH", root),
|
|
145
|
-
shell_env_var("GEM_HOME", gem_home),
|
|
146
|
-
shell_env_var("GEM_PATH", gem_path),
|
|
147
|
-
shell_env_var("GEM_CACHE", gem_cache)
|
|
148
|
-
].join("\n").concat("\n")
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Returns the command that will run chef client in local mode (a.k.a.
|
|
152
|
-
# chef zero mode).
|
|
153
|
-
#
|
|
154
|
-
# @return [String] the command string
|
|
155
|
-
# @api private
|
|
156
|
-
def local_mode_command
|
|
157
|
-
"#{sudo(config[:chef_client_path])} --local-mode".
|
|
158
|
-
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
# Determines whether or not local mode (a.k.a chef zero mode) is
|
|
162
|
-
# supported in the version of Chef as determined by inspecting the
|
|
163
|
-
# require_chef_omnibus config variable.
|
|
164
|
-
#
|
|
165
|
-
# The only way this method returns false is if require_chef_omnibus has
|
|
166
|
-
# an explicit version set to less than 11.8.0, when chef zero mode was
|
|
167
|
-
# introduced. Otherwise a modern Chef installation is assumed.
|
|
168
|
-
#
|
|
169
|
-
# @return [true,false] whether or not the desired version of Chef
|
|
170
|
-
# supports local mode
|
|
171
|
-
# @api private
|
|
172
|
-
def modern?
|
|
173
|
-
version = config[:require_chef_omnibus]
|
|
174
|
-
|
|
175
|
-
case version
|
|
176
|
-
when nil, false, true, 11, "11", "latest"
|
|
177
|
-
true
|
|
178
|
-
else
|
|
179
|
-
if Gem::Version.correct?(version)
|
|
180
|
-
Gem::Version.new(version) >= Gem::Version.new("11.8.0") ? true : false
|
|
181
|
-
else
|
|
182
|
-
# Build versions of chef, for example
|
|
183
|
-
# 12.5.0-current.0+20150721082808.git.14.c91b337-1
|
|
184
|
-
true
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
# Writes a chef-client local-mode shim script to the sandbox directory
|
|
190
|
-
# only if the desired version of Chef is old enough. The version of Chef
|
|
191
|
-
# is determined using the `config[:require_chef_omnibus]` value.
|
|
192
|
-
#
|
|
193
|
-
# @api private
|
|
194
|
-
def prepare_chef_client_zero_rb
|
|
195
|
-
return if modern?
|
|
196
|
-
|
|
197
|
-
info("Preparing chef-client-zero.rb")
|
|
198
|
-
debug("Using a vendored chef-client-zero.rb")
|
|
199
|
-
|
|
200
|
-
source = File.join(File.dirname(__FILE__),
|
|
201
|
-
%w[.. .. .. support chef-client-zero.rb])
|
|
202
|
-
FileUtils.cp(source, File.join(sandbox_path, "chef-client-zero.rb"))
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# Writes a client.rb configuration file to the sandbox directory.
|
|
206
|
-
#
|
|
207
|
-
# @api private
|
|
208
|
-
def prepare_client_rb
|
|
209
|
-
data = default_config_rb.merge(config[:client_rb])
|
|
210
|
-
|
|
211
|
-
info("Preparing client.rb")
|
|
212
|
-
debug("Creating client.rb from #{data.inspect}")
|
|
213
|
-
|
|
214
|
-
File.open(File.join(sandbox_path, "client.rb"), "wb") do |file|
|
|
215
|
-
file.write(format_config_file(data))
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
|
220
|
-
#
|
|
221
|
-
# @api private
|
|
222
|
-
def prepare_validation_pem
|
|
223
|
-
info("Preparing validation.pem")
|
|
224
|
-
debug("Using a dummy validation.pem")
|
|
225
|
-
|
|
226
|
-
source = File.join(File.dirname(__FILE__),
|
|
227
|
-
%w[.. .. .. support dummy-validation.pem])
|
|
228
|
-
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
# Returns the command that will run a backwards compatible shim script
|
|
232
|
-
# that approximates local mode in a modern chef-client run.
|
|
233
|
-
#
|
|
234
|
-
# @return [String] the command string
|
|
235
|
-
# @api private
|
|
236
|
-
def shim_command
|
|
237
|
-
ruby = remote_path_join(config[:ruby_bindir], "ruby").
|
|
238
|
-
tap { |path| path.concat(".exe") if windows_os? }
|
|
239
|
-
shim = remote_path_join(config[:root_path], "chef-client-zero.rb")
|
|
240
|
-
|
|
241
|
-
"#{chef_client_zero_env}\n#{sudo(ruby)} #{shim}"
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 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 "kitchen/provisioner/chef_base"
|
|
20
|
+
|
|
21
|
+
module Kitchen
|
|
22
|
+
|
|
23
|
+
module Provisioner
|
|
24
|
+
|
|
25
|
+
# Chef Zero provisioner.
|
|
26
|
+
#
|
|
27
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
+
class ChefZero < ChefBase
|
|
29
|
+
|
|
30
|
+
kitchen_provisioner_api_version 2
|
|
31
|
+
|
|
32
|
+
plugin_version Kitchen::VERSION
|
|
33
|
+
|
|
34
|
+
default_config :client_rb, {}
|
|
35
|
+
default_config :json_attributes, true
|
|
36
|
+
default_config :chef_zero_host, nil
|
|
37
|
+
default_config :chef_zero_port, 8889
|
|
38
|
+
|
|
39
|
+
default_config :chef_client_path do |provisioner|
|
|
40
|
+
provisioner.
|
|
41
|
+
remote_path_join(%W[#{provisioner[:chef_omnibus_root]} bin chef-client]).
|
|
42
|
+
tap { |path| path.concat(".bat") if provisioner.windows_os? }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
default_config :ruby_bindir do |provisioner|
|
|
46
|
+
provisioner.
|
|
47
|
+
remote_path_join(%W[#{provisioner[:chef_omnibus_root]} embedded bin])
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# (see Base#create_sandbox)
|
|
51
|
+
def create_sandbox
|
|
52
|
+
super
|
|
53
|
+
prepare_chef_client_zero_rb
|
|
54
|
+
prepare_validation_pem
|
|
55
|
+
prepare_client_rb
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# (see Base#prepare_command)
|
|
59
|
+
def prepare_command
|
|
60
|
+
return if modern?
|
|
61
|
+
|
|
62
|
+
gem_bin = remote_path_join(config[:ruby_bindir], "gem").
|
|
63
|
+
tap { |path| path.concat(".bat") if windows_os? }
|
|
64
|
+
vars = [
|
|
65
|
+
chef_client_zero_env,
|
|
66
|
+
shell_var("gem", sudo(gem_bin))
|
|
67
|
+
].join("\n").concat("\n")
|
|
68
|
+
|
|
69
|
+
prefix_command(shell_code_from_file(vars, "chef_zero_prepare_command_legacy"))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# (see Base#run_command)
|
|
73
|
+
def run_command
|
|
74
|
+
cmd = modern? ? local_mode_command : shim_command
|
|
75
|
+
|
|
76
|
+
prefix_command(
|
|
77
|
+
wrap_shell_code(
|
|
78
|
+
[cmd, *chef_client_args].join(" ").
|
|
79
|
+
tap { |str| str.insert(0, reload_ps1_path) if windows_os? }
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
# Adds optional flags to a chef-client command, depending on
|
|
87
|
+
# configuration data. Note that this method mutates the incoming Array.
|
|
88
|
+
#
|
|
89
|
+
# @param args [Array<String>] array of flags
|
|
90
|
+
# @api private
|
|
91
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
92
|
+
def add_optional_chef_client_args!(args)
|
|
93
|
+
if config[:json_attributes]
|
|
94
|
+
json = remote_path_join(config[:root_path], "dna.json")
|
|
95
|
+
args << "--json-attributes #{json}"
|
|
96
|
+
end
|
|
97
|
+
if config[:log_file]
|
|
98
|
+
args << "--logfile #{config[:log_file]}"
|
|
99
|
+
end
|
|
100
|
+
return unless modern?
|
|
101
|
+
|
|
102
|
+
# these flags are modern/chef-client local most only and will not work
|
|
103
|
+
# on older versions of chef-client
|
|
104
|
+
if config[:chef_zero_host]
|
|
105
|
+
args << "--chef-zero-host #{config[:chef_zero_host]}"
|
|
106
|
+
end
|
|
107
|
+
if config[:chef_zero_port]
|
|
108
|
+
args << "--chef-zero-port #{config[:chef_zero_port]}"
|
|
109
|
+
end
|
|
110
|
+
if config[:profile_ruby]
|
|
111
|
+
args << "--profile-ruby"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
115
|
+
|
|
116
|
+
# Returns an Array of command line arguments for the chef client.
|
|
117
|
+
#
|
|
118
|
+
# @return [Array<String>] an array of command line arguments
|
|
119
|
+
# @api private
|
|
120
|
+
def chef_client_args
|
|
121
|
+
level = config[:log_level]
|
|
122
|
+
args = [
|
|
123
|
+
"--config #{remote_path_join(config[:root_path], "client.rb")}",
|
|
124
|
+
"--log_level #{level}",
|
|
125
|
+
"--force-formatter",
|
|
126
|
+
"--no-color"
|
|
127
|
+
]
|
|
128
|
+
add_optional_chef_client_args!(args)
|
|
129
|
+
|
|
130
|
+
args
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Generates a string of shell environment variables needed for the
|
|
134
|
+
# chef-client-zero.rb shim script to properly function.
|
|
135
|
+
#
|
|
136
|
+
# @return [String] a shell script string
|
|
137
|
+
# @api private
|
|
138
|
+
def chef_client_zero_env
|
|
139
|
+
root = config[:root_path]
|
|
140
|
+
gem_home = gem_path = remote_path_join(root, "chef-client-zero-gems")
|
|
141
|
+
gem_cache = remote_path_join(gem_home, "cache")
|
|
142
|
+
|
|
143
|
+
[
|
|
144
|
+
shell_env_var("CHEF_REPO_PATH", root),
|
|
145
|
+
shell_env_var("GEM_HOME", gem_home),
|
|
146
|
+
shell_env_var("GEM_PATH", gem_path),
|
|
147
|
+
shell_env_var("GEM_CACHE", gem_cache)
|
|
148
|
+
].join("\n").concat("\n")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Returns the command that will run chef client in local mode (a.k.a.
|
|
152
|
+
# chef zero mode).
|
|
153
|
+
#
|
|
154
|
+
# @return [String] the command string
|
|
155
|
+
# @api private
|
|
156
|
+
def local_mode_command
|
|
157
|
+
"#{sudo(config[:chef_client_path])} --local-mode".
|
|
158
|
+
tap { |str| str.insert(0, "& ") if powershell_shell? }
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Determines whether or not local mode (a.k.a chef zero mode) is
|
|
162
|
+
# supported in the version of Chef as determined by inspecting the
|
|
163
|
+
# require_chef_omnibus config variable.
|
|
164
|
+
#
|
|
165
|
+
# The only way this method returns false is if require_chef_omnibus has
|
|
166
|
+
# an explicit version set to less than 11.8.0, when chef zero mode was
|
|
167
|
+
# introduced. Otherwise a modern Chef installation is assumed.
|
|
168
|
+
#
|
|
169
|
+
# @return [true,false] whether or not the desired version of Chef
|
|
170
|
+
# supports local mode
|
|
171
|
+
# @api private
|
|
172
|
+
def modern?
|
|
173
|
+
version = config[:require_chef_omnibus]
|
|
174
|
+
|
|
175
|
+
case version
|
|
176
|
+
when nil, false, true, 11, "11", "latest"
|
|
177
|
+
true
|
|
178
|
+
else
|
|
179
|
+
if Gem::Version.correct?(version)
|
|
180
|
+
Gem::Version.new(version) >= Gem::Version.new("11.8.0") ? true : false
|
|
181
|
+
else
|
|
182
|
+
# Build versions of chef, for example
|
|
183
|
+
# 12.5.0-current.0+20150721082808.git.14.c91b337-1
|
|
184
|
+
true
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Writes a chef-client local-mode shim script to the sandbox directory
|
|
190
|
+
# only if the desired version of Chef is old enough. The version of Chef
|
|
191
|
+
# is determined using the `config[:require_chef_omnibus]` value.
|
|
192
|
+
#
|
|
193
|
+
# @api private
|
|
194
|
+
def prepare_chef_client_zero_rb
|
|
195
|
+
return if modern?
|
|
196
|
+
|
|
197
|
+
info("Preparing chef-client-zero.rb")
|
|
198
|
+
debug("Using a vendored chef-client-zero.rb")
|
|
199
|
+
|
|
200
|
+
source = File.join(File.dirname(__FILE__),
|
|
201
|
+
%w[.. .. .. support chef-client-zero.rb])
|
|
202
|
+
FileUtils.cp(source, File.join(sandbox_path, "chef-client-zero.rb"))
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Writes a client.rb configuration file to the sandbox directory.
|
|
206
|
+
#
|
|
207
|
+
# @api private
|
|
208
|
+
def prepare_client_rb
|
|
209
|
+
data = default_config_rb.merge(config[:client_rb])
|
|
210
|
+
|
|
211
|
+
info("Preparing client.rb")
|
|
212
|
+
debug("Creating client.rb from #{data.inspect}")
|
|
213
|
+
|
|
214
|
+
File.open(File.join(sandbox_path, "client.rb"), "wb") do |file|
|
|
215
|
+
file.write(format_config_file(data))
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Writes a fake (but valid) validation.pem into the sandbox directory.
|
|
220
|
+
#
|
|
221
|
+
# @api private
|
|
222
|
+
def prepare_validation_pem
|
|
223
|
+
info("Preparing validation.pem")
|
|
224
|
+
debug("Using a dummy validation.pem")
|
|
225
|
+
|
|
226
|
+
source = File.join(File.dirname(__FILE__),
|
|
227
|
+
%w[.. .. .. support dummy-validation.pem])
|
|
228
|
+
FileUtils.cp(source, File.join(sandbox_path, "validation.pem"))
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Returns the command that will run a backwards compatible shim script
|
|
232
|
+
# that approximates local mode in a modern chef-client run.
|
|
233
|
+
#
|
|
234
|
+
# @return [String] the command string
|
|
235
|
+
# @api private
|
|
236
|
+
def shim_command
|
|
237
|
+
ruby = remote_path_join(config[:ruby_bindir], "ruby").
|
|
238
|
+
tap { |path| path.concat(".exe") if windows_os? }
|
|
239
|
+
shim = remote_path_join(config[:root_path], "chef-client-zero.rb")
|
|
240
|
+
|
|
241
|
+
"#{chef_client_zero_env}\n#{sudo(ruby)} #{shim}"
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|