test-kitchen 1.4.0.beta.2 → 1.4.0.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/features/kitchen_diagnose_command.feature +32 -0
  4. data/lib/kitchen/cli.rb +3 -0
  5. data/lib/kitchen/command/diagnose.rb +6 -1
  6. data/lib/kitchen/configurable.rb +48 -1
  7. data/lib/kitchen/diagnostic.rb +29 -0
  8. data/lib/kitchen/driver/base.rb +25 -0
  9. data/lib/kitchen/driver/dummy.rb +4 -0
  10. data/lib/kitchen/driver/proxy.rb +3 -0
  11. data/lib/kitchen/instance.rb +17 -0
  12. data/lib/kitchen/provisioner/base.rb +30 -1
  13. data/lib/kitchen/provisioner/chef_base.rb +7 -3
  14. data/lib/kitchen/provisioner/chef_solo.rb +4 -0
  15. data/lib/kitchen/provisioner/chef_zero.rb +5 -1
  16. data/lib/kitchen/provisioner/dummy.rb +4 -0
  17. data/lib/kitchen/provisioner/shell.rb +5 -0
  18. data/lib/kitchen/shell_out.rb +6 -2
  19. data/lib/kitchen/transport/base.rb +25 -0
  20. data/lib/kitchen/transport/dummy.rb +4 -0
  21. data/lib/kitchen/transport/ssh.rb +22 -1
  22. data/lib/kitchen/transport/winrm.rb +61 -90
  23. data/lib/kitchen/verifier/base.rb +30 -1
  24. data/lib/kitchen/verifier/busser.rb +4 -0
  25. data/lib/kitchen/verifier/dummy.rb +4 -0
  26. data/lib/kitchen/version.rb +1 -1
  27. data/spec/kitchen/configurable_spec.rb +35 -0
  28. data/spec/kitchen/diagnostic_spec.rb +53 -3
  29. data/spec/kitchen/driver/dummy_spec.rb +8 -0
  30. data/spec/kitchen/driver/proxy_spec.rb +4 -0
  31. data/spec/kitchen/driver/ssh_base_spec.rb +4 -0
  32. data/spec/kitchen/instance_spec.rb +75 -0
  33. data/spec/kitchen/provisioner/base_spec.rb +32 -6
  34. data/spec/kitchen/provisioner/chef_base_spec.rb +3 -2
  35. data/spec/kitchen/provisioner/chef_solo_spec.rb +10 -2
  36. data/spec/kitchen/provisioner/chef_zero_spec.rb +24 -2
  37. data/spec/kitchen/provisioner/dummy_spec.rb +8 -0
  38. data/spec/kitchen/provisioner/shell_spec.rb +10 -0
  39. data/spec/kitchen/shell_out_spec.rb +7 -0
  40. data/spec/kitchen/transport/ssh_spec.rb +90 -1
  41. data/spec/kitchen/transport/winrm_spec.rb +91 -11
  42. data/spec/kitchen/verifier/base_spec.rb +32 -6
  43. data/spec/kitchen/verifier/busser_spec.rb +8 -0
  44. data/spec/kitchen/verifier/dummy_spec.rb +8 -0
  45. data/support/chef_base_install_command.sh +183 -100
  46. data/test-kitchen.gemspec +1 -2
  47. metadata +11 -48
  48. data/lib/kitchen/transport/winrm/command_executor.rb +0 -188
  49. data/lib/kitchen/transport/winrm/file_transporter.rb +0 -454
  50. data/lib/kitchen/transport/winrm/logging.rb +0 -50
  51. data/lib/kitchen/transport/winrm/template.rb +0 -74
  52. data/lib/kitchen/transport/winrm/tmp_zip.rb +0 -187
  53. data/spec/kitchen/transport/winrm/command_executor_spec.rb +0 -400
  54. data/spec/kitchen/transport/winrm/file_transporter_spec.rb +0 -876
  55. data/spec/kitchen/transport/winrm/logging_spec.rb +0 -92
  56. data/spec/kitchen/transport/winrm/template_spec.rb +0 -51
  57. data/spec/kitchen/transport/winrm/tmp_zip_spec.rb +0 -132
  58. data/support/check_files.ps1.erb +0 -48
  59. data/support/decode_files.ps1.erb +0 -62
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9849b2009d2b085667f5ec14e164878bcd272579
4
- data.tar.gz: 2b8a47abba8c594d1a4365f21b335778b70a95dc
3
+ metadata.gz: 39ee6b34f700deb8d41ee3f4afd2ce7e42b4dd32
4
+ data.tar.gz: 7d31a8ecb34472780a7c946be2bd9ff25725ba6e
5
5
  SHA512:
6
- metadata.gz: 410c8df130d1b1ff99110b24ea196d665ec13a9a971ebfd05da44057f2166dd34d3761031c27519682d18ab8d49bb4bbc512cd379d0648305e12bfdbd1e99262
7
- data.tar.gz: bcc27fddd397449694927037eafc5966757a462843afdf574338b860bfbf180bec21cca9da208cbfe83d2106d17da73c636c4d9e824e70c4204db86a7c30b19a
6
+ metadata.gz: f118ebfd3d1b09b230bf91714086ed26b97611ec8e141d61f58727aaf4163ef29c09b3f6d6bcc9dd8f263c17483d2fff7dbbcf1a3b453387d42ac0c76a90bf2d
7
+ data.tar.gz: 0cbdfdb1514b8340b4476ec9060a1eaacb3ca7f24924e4d56f87b9af0c38eece989e427f2deae0d6209c73bef709fd3ee7bcfd2c735a7475ec7d337be2cb705c
@@ -1,3 +1,29 @@
1
+ ## 1.4.0.rc.1 / 2015-03-29
2
+
3
+ ### Potentially breaking changes
4
+
5
+ * Pull request [#672][]: Extract WinRM-dependant code from Transport::Winrm into the winrm-transport gem, meaning that WinRM support is now a soft dependency of Test Kitchen, similar to Berkshelf and Librarian-Chef. This means the first time a Winrm Transport is requested, a `kitchen` command will crash with a UserError message instructing the user to install the winrm-transport gem. Existing projects which do not use the Winrm Transport will be unaffected and have no extra gem dependenices to manage. ([@fnichol][])
6
+
7
+ ### Bug fixes
8
+
9
+ * Issue [#656][], pull request 669: Move ObjectSpace finalizer logic into CommandExtractor to close the last opened remote shell on shutdown for Winrm Transport. ([@fnichol][])
10
+ * Issue [#611][], pull request [#673][]: Ensure that secret key is deleted before converge for chef_zero and chef_solo Provisioners. ([@fnichol][])
11
+ * Issue [#389][], pull request [#674][]: Expand path for `:ssh_key` if provided in kitchen.yml for Ssh Transport. ([@fnichol][])
12
+ * Pull request [#653][]: Consider `:require_chef_omnibus = 11` to be a modern version for Chef Provisioners. ([@fnichol][])
13
+
14
+ ### New features
15
+
16
+ * Add [API versioning](d8f1a7db9e506c44f321462e1fba0b1e24994070) metadata to all plugin types. ([@fnichol][])
17
+ * Pull request [#667][], pull request [#668][]: Add plugin diagnostics, exposed via `kitchen diagnose`. ([@fnichol][])
18
+ * Pull request [#675][], issue [#424][]: Add default `:compression` & `:compression_level` configuration attributes to Ssh Transport.
19
+ * Pull request [#651][], issue [#592][], issue [#629][], issue [#307][]: Add :sudo_command to Provisioners, Verifiers, & ShellOut. ([@fnichol][])
20
+
21
+ ### Improvements
22
+
23
+ * Pull request [#658][], issue [#654][]: Updated for sh compatibility based on install.sh code which supports more platforms includig Solaris. ([@scotthain][], [@curiositycasualty][], [@fnichol][])
24
+ * Pull request [#652][], pull request [#666][], issue [#556][]: Support symbol values in solo.rb & client.rb for chef_zero and chef_solo Provisioners. ([@fnichol][])
25
+
26
+
1
27
  ## 1.4.0.beta.2 / 2015-03-25
2
28
 
3
29
  ### Potentially breaking changes
@@ -571,6 +597,7 @@ The initial release.
571
597
  [#304]: https://github.com/test-kitchen/test-kitchen/issues/304
572
598
  [#305]: https://github.com/test-kitchen/test-kitchen/issues/305
573
599
  [#306]: https://github.com/test-kitchen/test-kitchen/issues/306
600
+ [#307]: https://github.com/test-kitchen/test-kitchen/issues/307
574
601
  [#309]: https://github.com/test-kitchen/test-kitchen/issues/309
575
602
  [#310]: https://github.com/test-kitchen/test-kitchen/issues/310
576
603
  [#313]: https://github.com/test-kitchen/test-kitchen/issues/313
@@ -587,9 +614,11 @@ The initial release.
587
614
  [#373]: https://github.com/test-kitchen/test-kitchen/issues/373
588
615
  [#375]: https://github.com/test-kitchen/test-kitchen/issues/375
589
616
  [#381]: https://github.com/test-kitchen/test-kitchen/issues/381
617
+ [#389]: https://github.com/test-kitchen/test-kitchen/issues/389
590
618
  [#397]: https://github.com/test-kitchen/test-kitchen/issues/397
591
619
  [#399]: https://github.com/test-kitchen/test-kitchen/issues/399
592
620
  [#416]: https://github.com/test-kitchen/test-kitchen/issues/416
621
+ [#424]: https://github.com/test-kitchen/test-kitchen/issues/424
593
622
  [#427]: https://github.com/test-kitchen/test-kitchen/issues/427
594
623
  [#429]: https://github.com/test-kitchen/test-kitchen/issues/429
595
624
  [#431]: https://github.com/test-kitchen/test-kitchen/issues/431
@@ -617,6 +646,7 @@ The initial release.
617
646
  [#549]: https://github.com/test-kitchen/test-kitchen/issues/549
618
647
  [#554]: https://github.com/test-kitchen/test-kitchen/issues/554
619
648
  [#555]: https://github.com/test-kitchen/test-kitchen/issues/555
649
+ [#556]: https://github.com/test-kitchen/test-kitchen/issues/556
620
650
  [#557]: https://github.com/test-kitchen/test-kitchen/issues/557
621
651
  [#558]: https://github.com/test-kitchen/test-kitchen/issues/558
622
652
  [#567]: https://github.com/test-kitchen/test-kitchen/issues/567
@@ -624,10 +654,26 @@ The initial release.
624
654
  [#580]: https://github.com/test-kitchen/test-kitchen/issues/580
625
655
  [#581]: https://github.com/test-kitchen/test-kitchen/issues/581
626
656
  [#588]: https://github.com/test-kitchen/test-kitchen/issues/588
657
+ [#592]: https://github.com/test-kitchen/test-kitchen/issues/592
627
658
  [#600]: https://github.com/test-kitchen/test-kitchen/issues/600
659
+ [#611]: https://github.com/test-kitchen/test-kitchen/issues/611
660
+ [#629]: https://github.com/test-kitchen/test-kitchen/issues/629
628
661
  [#633]: https://github.com/test-kitchen/test-kitchen/issues/633
629
662
  [#648]: https://github.com/test-kitchen/test-kitchen/issues/648
630
663
  [#649]: https://github.com/test-kitchen/test-kitchen/issues/649
664
+ [#651]: https://github.com/test-kitchen/test-kitchen/issues/651
665
+ [#652]: https://github.com/test-kitchen/test-kitchen/issues/652
666
+ [#653]: https://github.com/test-kitchen/test-kitchen/issues/653
667
+ [#654]: https://github.com/test-kitchen/test-kitchen/issues/654
668
+ [#656]: https://github.com/test-kitchen/test-kitchen/issues/656
669
+ [#658]: https://github.com/test-kitchen/test-kitchen/issues/658
670
+ [#666]: https://github.com/test-kitchen/test-kitchen/issues/666
671
+ [#667]: https://github.com/test-kitchen/test-kitchen/issues/667
672
+ [#668]: https://github.com/test-kitchen/test-kitchen/issues/668
673
+ [#672]: https://github.com/test-kitchen/test-kitchen/issues/672
674
+ [#673]: https://github.com/test-kitchen/test-kitchen/issues/673
675
+ [#674]: https://github.com/test-kitchen/test-kitchen/issues/674
676
+ [#675]: https://github.com/test-kitchen/test-kitchen/issues/675
631
677
  [@ChrisLundquist]: https://github.com/ChrisLundquist
632
678
  [@MarkGibbons]: https://github.com/MarkGibbons
633
679
  [@adamhjk]: https://github.com/adamhjk
@@ -13,6 +13,12 @@ Feature: Running a diagnosis command
13
13
  provisioner:
14
14
  name: dummy
15
15
 
16
+ transport:
17
+ name: dummy
18
+
19
+ verifier:
20
+ name: dummy
21
+
16
22
  platforms:
17
23
  - name: cool
18
24
  - name: beans
@@ -22,9 +28,20 @@ Feature: Running a diagnosis command
22
28
  - name: server
23
29
  """
24
30
 
31
+ @spawn
32
+ Scenario: Displaying help
33
+ When I run `kitchen help diagnose`
34
+ Then the output should contain:
35
+ """
36
+ Usage:
37
+ kitchen diagnose
38
+ """
39
+ And the exit status should be 0
40
+
25
41
  @spawn
26
42
  Scenario: Showing all instances
27
43
  When I run `kitchen diagnose`
44
+ Then the output should contain "timestamp: "
28
45
  Then the output should contain "kitchen_version: "
29
46
  Then the output should contain " client-cool:"
30
47
  Then the output should contain " client-beans:"
@@ -44,6 +61,16 @@ Feature: Running a diagnosis command
44
61
  """
45
62
  And the exit status should be 0
46
63
 
64
+ @spawn
65
+ Scenario: Showing all instances with plugin configuration
66
+ When I run `kitchen diagnose --plugins`
67
+ Then the output should contain "plugins:"
68
+ Then the output should contain " class: Kitchen::Driver::Dummy"
69
+ Then the output should contain " class: Kitchen::Provisioner::Dummy"
70
+ Then the output should contain " class: Kitchen::Transport::Dummy"
71
+ Then the output should contain " class: Kitchen::Verifier::Dummy"
72
+ And the exit status should be 0
73
+
47
74
  @spawn
48
75
  Scenario: Coping with loading failure
49
76
  Given a file named ".kitchen.local.yml" with:
@@ -61,4 +88,9 @@ Feature: Running a diagnosis command
61
88
  instances:
62
89
  error:
63
90
  """
91
+ And the output should contain:
92
+ """
93
+ plugins:
94
+ error:
95
+ """
64
96
  And the exit status should be 0
@@ -112,6 +112,9 @@ module Kitchen
112
112
  method_option :loader,
113
113
  :type => :boolean,
114
114
  :desc => "Include data loader diagnostics"
115
+ method_option :plugins,
116
+ :type => :boolean,
117
+ :desc => "Include plugin diagnostics"
115
118
  method_option :instances,
116
119
  :type => :boolean,
117
120
  :default => true,
@@ -37,11 +37,16 @@ module Kitchen
37
37
  loader = record_failure { load_loader }
38
38
 
39
39
  puts Kitchen::Diagnostic.new(
40
- :loader => loader, :instances => instances).read.to_yaml
40
+ :loader => loader, :instances => instances, :plugins => plugins?
41
+ ).read.to_yaml
41
42
  end
42
43
 
43
44
  private
44
45
 
46
+ def plugins?
47
+ options[:all] || options[:plugins]
48
+ end
49
+
45
50
  # Loads and returns instances if they are requested.
46
51
  #
47
52
  # @return [Array<Instance>] an array of instances or an empty array
@@ -124,6 +124,18 @@ module Kitchen
124
124
  result
125
125
  end
126
126
 
127
+ # Returns a Hash of configuration and other useful diagnostic information
128
+ # associated with the plugin itself (such as loaded version, class name,
129
+ # etc.).
130
+ #
131
+ # @return [Hash] a diagnostic hash
132
+ def diagnose_plugin
133
+ result = Hash.new
134
+ result[:name] = name
135
+ result.merge!(self.class.diagnose)
136
+ result
137
+ end
138
+
127
139
  # Returns the name of this plugin, suitable for display in a CLI.
128
140
  #
129
141
  # @return [String] name of this plugin
@@ -195,7 +207,7 @@ module Kitchen
195
207
  expanded_paths = LazyHash.new(self.class.expanded_paths, self).to_hash
196
208
 
197
209
  expanded_paths.each do |key, should_expand|
198
- next if !should_expand || config[key].nil?
210
+ next if !should_expand || config[key].nil? || config[key] == false
199
211
 
200
212
  config[key] = if config[key].is_a?(Array)
201
213
  config[key].map { |path| File.expand_path(path, root_path) }
@@ -303,6 +315,41 @@ module Kitchen
303
315
  # Class methods which will be mixed in on inclusion of Configurable module.
304
316
  module ClassMethods
305
317
 
318
+ # Sets the loaded version of this plugin, usually corresponding to the
319
+ # RubyGems version of the plugin's library. If the plugin does not set
320
+ # this value, then `nil` will be used and reported.
321
+ #
322
+ # @example setting a version used by RubyGems
323
+ #
324
+ # require "kitchen/driver/vagrant_version"
325
+ #
326
+ # module Kitchen
327
+ # module Driver
328
+ # class Vagrant < Kitchen::Driver::Base
329
+ #
330
+ # plugin_version Kitchen::Driver::VAGRANT_VERSION
331
+ #
332
+ # end
333
+ # end
334
+ # end
335
+ #
336
+ # @param version [String] a version string
337
+ def plugin_version(version) # rubocop:disable Style/TrivialAccessors
338
+ @plugin_version = version
339
+ end
340
+
341
+ # Returns a Hash of configuration and other useful diagnostic
342
+ # information.
343
+ #
344
+ # @return [Hash] a diagnostic hash
345
+ def diagnose
346
+ {
347
+ :class => name,
348
+ :version => @plugin_version,
349
+ :api_version => @api_version
350
+ }
351
+ end
352
+
306
353
  # Sets a sane default value for a configuration attribute. These values
307
354
  # can be overridden by provided configuration or in a subclass with
308
355
  # another default_config declaration.
@@ -35,9 +35,12 @@ module Kitchen
35
35
  # to `#diagnose` or an error Hash
36
36
  # @option options [Array<#diagnose>,Hash] :instances an Array of instances
37
37
  # that respond to `#diagnose` or an error Hash
38
+ # @option options [true,false] :plugins whether or not plugins should be
39
+ # returned
38
40
  def initialize(options = {})
39
41
  @loader = options.fetch(:loader, nil)
40
42
  @instances = options.fetch(:instances, [])
43
+ @plugins = options.fetch(:plugins, false)
41
44
  @result = Hash.new
42
45
  end
43
46
 
@@ -46,6 +49,7 @@ module Kitchen
46
49
  # @return [Hash] a configuration Hash
47
50
  def read
48
51
  prepare_common
52
+ prepare_plugins
49
53
  prepare_loader
50
54
  prepare_instances
51
55
 
@@ -87,6 +91,31 @@ module Kitchen
87
91
  end
88
92
  end
89
93
 
94
+ # Adds plugin information to the result Hash.
95
+ #
96
+ # @api private
97
+ def prepare_plugins
98
+ return unless @plugins
99
+
100
+ if error_hash?(instances)
101
+ result[:plugins] = { :error => instances[:error] }
102
+ elsif instances.empty?
103
+ result[:plugins] = Hash.new
104
+ else
105
+ plugins = {
106
+ :driver => [], :provisioner => [], :transport => [], :verifier => []
107
+ }
108
+ instances.map(&:diagnose_plugins).each do |plugin_hash|
109
+ plugin_hash.each { |type, plugin| plugins[type] << plugin }
110
+ end
111
+ plugins.each do |type, list|
112
+ plugins[type] =
113
+ Hash[list.uniq.map { |hash| [hash.delete(:name), hash] }]
114
+ end
115
+ result[:plugins] = plugins
116
+ end
117
+ end
118
+
90
119
  # Adds instance information to the result Hash.
91
120
  #
92
121
  # @api private
@@ -89,6 +89,31 @@ module Kitchen
89
89
  @serial_actions += methods
90
90
  end
91
91
 
92
+ # Sets the API version for this driver. If the driver does not set this
93
+ # value, then `nil` will be used and reported.
94
+ #
95
+ # Sets the API version for this driver
96
+ #
97
+ # @example setting an API version
98
+ #
99
+ # module Kitchen
100
+ # module Driver
101
+ # class NewDriver < Kitchen::Driver::Base
102
+ #
103
+ # kitchen_driver_api_version 2
104
+ #
105
+ # end
106
+ # end
107
+ # end
108
+ #
109
+ # @param version [Integer,String] a version number
110
+ #
111
+ # rubocop:disable Style/TrivialAccessors
112
+ def self.kitchen_driver_api_version(version)
113
+ @api_version = version
114
+ end
115
+ # rubocop:enable Style/TrivialAccessors
116
+
92
117
  private
93
118
 
94
119
  # Intercepts any bare #puts calls in subclasses and issues an INFO log
@@ -30,6 +30,10 @@ module Kitchen
30
30
  # @author Fletcher Nichol <fnichol@nichol.ca>
31
31
  class Dummy < Kitchen::Driver::Base
32
32
 
33
+ kitchen_driver_api_version 2
34
+
35
+ plugin_version Kitchen::VERSION
36
+
33
37
  default_config :sleep, 0
34
38
  default_config :random_failure, false
35
39
 
@@ -19,6 +19,7 @@
19
19
  #
20
20
 
21
21
  require "kitchen"
22
+ require "kitchen/version"
22
23
 
23
24
  module Kitchen
24
25
 
@@ -33,6 +34,8 @@ module Kitchen
33
34
  # @author Seth Chisamore <schisamo@opscode.com>
34
35
  class Proxy < Kitchen::Driver::SSHBase
35
36
 
37
+ plugin_version Kitchen::VERSION
38
+
36
39
  required_config :host
37
40
  required_config :reset_command
38
41
 
@@ -243,6 +243,23 @@ module Kitchen
243
243
  result
244
244
  end
245
245
 
246
+ # Returns a Hash of configuration and other useful diagnostic information
247
+ # associated with plugins (such as loaded version, class name, etc.).
248
+ #
249
+ # @return [Hash] a diagnostic hash
250
+ def diagnose_plugins
251
+ result = Hash.new
252
+ [:driver, :provisioner, :verifier, :transport].each do |sym|
253
+ obj = send(sym)
254
+ result[sym] = if obj.respond_to?(:diagnose_plugin)
255
+ obj.diagnose_plugin
256
+ else
257
+ :unknown
258
+ end
259
+ end
260
+ result
261
+ end
262
+
246
263
  # Returns the last successfully completed action state of the instance.
247
264
  #
248
265
  # @return [String] a named action which was last successfully completed
@@ -40,6 +40,10 @@ module Kitchen
40
40
  provisioner.windows_os? ? nil : true
41
41
  end
42
42
 
43
+ default_config :sudo_command do |provisioner|
44
+ provisioner.windows_os? ? nil : "sudo -E"
45
+ end
46
+
43
47
  expand_path_for :test_base_path
44
48
 
45
49
  # Constructs a new provisioner by providing a configuration hash.
@@ -153,6 +157,31 @@ module Kitchen
153
157
  FileUtils.rmtree(sandbox_path)
154
158
  end
155
159
 
160
+ # Sets the API version for this provisioner. If the provisioner does not
161
+ # set this value, then `nil` will be used and reported.
162
+ #
163
+ # Sets the API version for this provisioner
164
+ #
165
+ # @example setting an API version
166
+ #
167
+ # module Kitchen
168
+ # module Provisioner
169
+ # class NewProvisioner < Kitchen::Provisioner::Base
170
+ #
171
+ # kitchen_provisioner_api_version 2
172
+ #
173
+ # end
174
+ # end
175
+ # end
176
+ #
177
+ # @param version [Integer,String] a version number
178
+ #
179
+ # rubocop:disable Style/TrivialAccessors
180
+ def self.kitchen_provisioner_api_version(version)
181
+ @api_version = version
182
+ end
183
+ # rubocop:enable Style/TrivialAccessors
184
+
156
185
  private
157
186
 
158
187
  # Builds a complete command given a variables String preamble and a file
@@ -179,7 +208,7 @@ module Kitchen
179
208
  # @return [String] the command, conditionaly prefixed with sudo
180
209
  # @api private
181
210
  def sudo(script)
182
- config[:sudo] ? "sudo -E #{script}" : script
211
+ config[:sudo] ? "#{config[:sudo_command]} #{script}" : script
183
212
  end
184
213
  end
185
214
  end
@@ -118,8 +118,10 @@ module Kitchen
118
118
 
119
119
  # (see Base#init_command)
120
120
  def init_command
121
- dirs = %w[cookbooks data data_bags environments roles clients].
122
- sort.map { |dir| remote_path_join(config[:root_path], dir) }
121
+ dirs = %w[
122
+ cookbooks data data_bags environments roles clients
123
+ encrypted_data_bag_secret
124
+ ].sort.map { |dir| remote_path_join(config[:root_path], dir) }
123
125
 
124
126
  vars = if powershell_shell?
125
127
  init_command_vars_for_powershell(dirs)
@@ -212,7 +214,9 @@ module Kitchen
212
214
  # @return [String] a string representation
213
215
  # @api private
214
216
  def format_value(obj)
215
- if obj.is_a?(String)
217
+ if obj.is_a?(String) && obj =~ /^:/
218
+ obj
219
+ elsif obj.is_a?(String)
216
220
  %{"#{obj.gsub(/\\/, "\\\\\\\\")}"}
217
221
  elsif obj.is_a?(Array)
218
222
  %{[#{obj.map { |i| format_value(i) }.join(", ")}]}