test-kitchen 1.6.0 → 1.7.0

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