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.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +8 -8
  3. data/.gitattributes +3 -0
  4. data/.github/ISSUE_TEMPLATE.md +55 -55
  5. data/.gitignore +28 -28
  6. data/.kitchen.ci.yml +23 -23
  7. data/.kitchen.proxy.yml +27 -27
  8. data/.rubocop.yml +3 -3
  9. data/.travis.yml +70 -70
  10. data/.yardopts +3 -3
  11. data/Berksfile +3 -3
  12. data/CHANGELOG.md +1090 -1083
  13. data/CONTRIBUTING.md +14 -14
  14. data/Gemfile +19 -19
  15. data/Gemfile.proxy_tests +4 -4
  16. data/Guardfile +42 -42
  17. data/LICENSE +15 -15
  18. data/MAINTAINERS.md +23 -23
  19. data/README.md +135 -135
  20. data/Rakefile +61 -61
  21. data/appveyor.yml +44 -44
  22. data/features/kitchen_action_commands.feature +164 -164
  23. data/features/kitchen_command.feature +16 -16
  24. data/features/kitchen_console_command.feature +34 -34
  25. data/features/kitchen_defaults.feature +38 -38
  26. data/features/kitchen_diagnose_command.feature +96 -96
  27. data/features/kitchen_driver_create_command.feature +64 -64
  28. data/features/kitchen_driver_discover_command.feature +25 -25
  29. data/features/kitchen_help_command.feature +16 -16
  30. data/features/kitchen_init_command.feature +274 -274
  31. data/features/kitchen_list_command.feature +104 -104
  32. data/features/kitchen_login_command.feature +62 -62
  33. data/features/kitchen_sink_command.feature +30 -30
  34. data/features/kitchen_test_command.feature +88 -88
  35. data/features/step_definitions/gem_steps.rb +36 -36
  36. data/features/step_definitions/git_steps.rb +5 -5
  37. data/features/step_definitions/output_steps.rb +5 -5
  38. data/features/support/env.rb +75 -75
  39. data/lib/kitchen.rb +150 -150
  40. data/lib/kitchen/base64_stream.rb +55 -55
  41. data/lib/kitchen/cli.rb +419 -419
  42. data/lib/kitchen/collection.rb +55 -55
  43. data/lib/kitchen/color.rb +65 -65
  44. data/lib/kitchen/command.rb +185 -185
  45. data/lib/kitchen/command/action.rb +45 -45
  46. data/lib/kitchen/command/console.rb +58 -58
  47. data/lib/kitchen/command/diagnose.rb +92 -92
  48. data/lib/kitchen/command/driver_discover.rb +105 -105
  49. data/lib/kitchen/command/exec.rb +41 -41
  50. data/lib/kitchen/command/list.rb +119 -119
  51. data/lib/kitchen/command/login.rb +43 -43
  52. data/lib/kitchen/command/sink.rb +54 -54
  53. data/lib/kitchen/command/test.rb +51 -51
  54. data/lib/kitchen/config.rb +322 -322
  55. data/lib/kitchen/configurable.rb +529 -529
  56. data/lib/kitchen/data_munger.rb +959 -959
  57. data/lib/kitchen/diagnostic.rb +141 -141
  58. data/lib/kitchen/driver.rb +56 -56
  59. data/lib/kitchen/driver/base.rb +134 -134
  60. data/lib/kitchen/driver/dummy.rb +108 -108
  61. data/lib/kitchen/driver/proxy.rb +72 -72
  62. data/lib/kitchen/driver/ssh_base.rb +357 -357
  63. data/lib/kitchen/errors.rb +229 -229
  64. data/lib/kitchen/generator/driver_create.rb +177 -177
  65. data/lib/kitchen/generator/init.rb +296 -296
  66. data/lib/kitchen/instance.rb +662 -662
  67. data/lib/kitchen/lazy_hash.rb +142 -142
  68. data/lib/kitchen/loader/yaml.rb +349 -349
  69. data/lib/kitchen/logger.rb +423 -423
  70. data/lib/kitchen/logging.rb +56 -56
  71. data/lib/kitchen/login_command.rb +52 -52
  72. data/lib/kitchen/metadata_chopper.rb +52 -52
  73. data/lib/kitchen/platform.rb +67 -67
  74. data/lib/kitchen/provisioner.rb +54 -54
  75. data/lib/kitchen/provisioner/base.rb +236 -236
  76. data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
  77. data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
  78. data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
  79. data/lib/kitchen/provisioner/chef_apply.rb +124 -124
  80. data/lib/kitchen/provisioner/chef_base.rb +341 -341
  81. data/lib/kitchen/provisioner/chef_solo.rb +88 -88
  82. data/lib/kitchen/provisioner/chef_zero.rb +245 -245
  83. data/lib/kitchen/provisioner/dummy.rb +79 -79
  84. data/lib/kitchen/provisioner/shell.rb +138 -138
  85. data/lib/kitchen/rake_tasks.rb +63 -63
  86. data/lib/kitchen/shell_out.rb +93 -93
  87. data/lib/kitchen/ssh.rb +276 -276
  88. data/lib/kitchen/state_file.rb +120 -120
  89. data/lib/kitchen/suite.rb +51 -51
  90. data/lib/kitchen/thor_tasks.rb +66 -66
  91. data/lib/kitchen/transport.rb +54 -54
  92. data/lib/kitchen/transport/base.rb +176 -176
  93. data/lib/kitchen/transport/dummy.rb +79 -79
  94. data/lib/kitchen/transport/ssh.rb +364 -364
  95. data/lib/kitchen/transport/winrm.rb +486 -486
  96. data/lib/kitchen/util.rb +147 -147
  97. data/lib/kitchen/verifier.rb +55 -55
  98. data/lib/kitchen/verifier/base.rb +235 -235
  99. data/lib/kitchen/verifier/busser.rb +277 -277
  100. data/lib/kitchen/verifier/dummy.rb +79 -79
  101. data/lib/kitchen/verifier/shell.rb +101 -101
  102. data/lib/kitchen/version.rb +21 -21
  103. data/lib/vendor/hash_recursive_merge.rb +82 -82
  104. data/spec/kitchen/base64_stream_spec.rb +77 -77
  105. data/spec/kitchen/cli_spec.rb +56 -56
  106. data/spec/kitchen/collection_spec.rb +80 -80
  107. data/spec/kitchen/color_spec.rb +54 -54
  108. data/spec/kitchen/config_spec.rb +408 -408
  109. data/spec/kitchen/configurable_spec.rb +1095 -1095
  110. data/spec/kitchen/data_munger_spec.rb +2694 -2694
  111. data/spec/kitchen/diagnostic_spec.rb +129 -129
  112. data/spec/kitchen/driver/base_spec.rb +121 -121
  113. data/spec/kitchen/driver/dummy_spec.rb +199 -199
  114. data/spec/kitchen/driver/proxy_spec.rb +138 -138
  115. data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
  116. data/spec/kitchen/driver_spec.rb +112 -112
  117. data/spec/kitchen/errors_spec.rb +309 -309
  118. data/spec/kitchen/instance_spec.rb +1419 -1419
  119. data/spec/kitchen/lazy_hash_spec.rb +117 -117
  120. data/spec/kitchen/loader/yaml_spec.rb +774 -774
  121. data/spec/kitchen/logger_spec.rb +429 -429
  122. data/spec/kitchen/logging_spec.rb +59 -59
  123. data/spec/kitchen/login_command_spec.rb +68 -68
  124. data/spec/kitchen/metadata_chopper_spec.rb +82 -82
  125. data/spec/kitchen/platform_spec.rb +89 -89
  126. data/spec/kitchen/provisioner/base_spec.rb +386 -386
  127. data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
  128. data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1161
  129. data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
  130. data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
  131. data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
  132. data/spec/kitchen/provisioner/shell_spec.rb +566 -566
  133. data/spec/kitchen/provisioner_spec.rb +107 -107
  134. data/spec/kitchen/shell_out_spec.rb +150 -150
  135. data/spec/kitchen/ssh_spec.rb +693 -693
  136. data/spec/kitchen/state_file_spec.rb +129 -129
  137. data/spec/kitchen/suite_spec.rb +62 -62
  138. data/spec/kitchen/transport/base_spec.rb +89 -89
  139. data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
  140. data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
  141. data/spec/kitchen/transport_spec.rb +112 -112
  142. data/spec/kitchen/util_spec.rb +165 -165
  143. data/spec/kitchen/verifier/base_spec.rb +362 -362
  144. data/spec/kitchen/verifier/busser_spec.rb +610 -610
  145. data/spec/kitchen/verifier/dummy_spec.rb +99 -99
  146. data/spec/kitchen/verifier/shell_spec.rb +160 -160
  147. data/spec/kitchen/verifier_spec.rb +120 -120
  148. data/spec/kitchen_spec.rb +114 -114
  149. data/spec/spec_helper.rb +85 -85
  150. data/spec/support/powershell_max_size_spec.rb +40 -40
  151. data/support/busser_install_command.ps1 +14 -14
  152. data/support/busser_install_command.sh +14 -14
  153. data/support/chef-client-zero.rb +77 -77
  154. data/support/chef_base_init_command.ps1 +18 -18
  155. data/support/chef_base_init_command.sh +2 -2
  156. data/support/chef_base_install_command.ps1 +85 -85
  157. data/support/chef_base_install_command.sh +229 -229
  158. data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
  159. data/support/chef_zero_prepare_command_legacy.sh +10 -10
  160. data/support/download_helpers.sh +109 -109
  161. data/support/dummy-validation.pem +27 -27
  162. data/templates/driver/CHANGELOG.md.erb +3 -3
  163. data/templates/driver/Gemfile.erb +3 -3
  164. data/templates/driver/README.md.erb +64 -64
  165. data/templates/driver/Rakefile.erb +21 -21
  166. data/templates/driver/driver.rb.erb +23 -23
  167. data/templates/driver/gemspec.erb +29 -29
  168. data/templates/driver/gitignore.erb +17 -17
  169. data/templates/driver/license_apachev2.erb +15 -15
  170. data/templates/driver/license_lgplv3.erb +16 -16
  171. data/templates/driver/license_mit.erb +22 -22
  172. data/templates/driver/license_reserved.erb +5 -5
  173. data/templates/driver/tailor.erb +4 -4
  174. data/templates/driver/travis.yml.erb +11 -11
  175. data/templates/driver/version.rb.erb +12 -12
  176. data/templates/init/chefignore.erb +1 -1
  177. data/templates/init/kitchen.yml.erb +18 -18
  178. data/test-kitchen.gemspec +62 -62
  179. data/test/integration/default/default_spec.rb +3 -3
  180. data/testing_windows.md +37 -37
  181. 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