test-kitchen 1.14.1 → 1.14.2
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/Berksfile +1 -1
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -1
- data/Guardfile +5 -5
- data/Rakefile +5 -5
- data/bin/kitchen +1 -1
- data/features/step_definitions/gem_steps.rb +6 -6
- data/features/support/env.rb +6 -7
- data/lib/kitchen.rb +5 -7
- data/lib/kitchen/base64_stream.rb +2 -8
- data/lib/kitchen/cli.rb +76 -80
- data/lib/kitchen/collection.rb +0 -2
- data/lib/kitchen/color.rb +7 -9
- data/lib/kitchen/command.rb +0 -4
- data/lib/kitchen/command/action.rb +0 -3
- data/lib/kitchen/command/console.rb +4 -7
- data/lib/kitchen/command/diagnose.rb +7 -14
- data/lib/kitchen/command/driver_discover.rb +1 -4
- data/lib/kitchen/command/exec.rb +0 -3
- data/lib/kitchen/command/list.rb +9 -12
- data/lib/kitchen/command/login.rb +0 -3
- data/lib/kitchen/command/package.rb +0 -3
- data/lib/kitchen/command/sink.rb +6 -9
- data/lib/kitchen/command/test.rb +1 -4
- data/lib/kitchen/config.rb +25 -27
- data/lib/kitchen/configurable.rb +26 -31
- data/lib/kitchen/data_munger.rb +34 -36
- data/lib/kitchen/diagnostic.rb +5 -7
- data/lib/kitchen/driver.rb +3 -5
- data/lib/kitchen/driver/base.rb +0 -3
- data/lib/kitchen/driver/dummy.rb +0 -3
- data/lib/kitchen/driver/proxy.rb +0 -3
- data/lib/kitchen/driver/ssh_base.rb +13 -16
- data/lib/kitchen/errors.rb +11 -16
- data/lib/kitchen/generator/driver_create.rb +18 -21
- data/lib/kitchen/generator/init.rb +21 -26
- data/lib/kitchen/instance.rb +19 -23
- data/lib/kitchen/lazy_hash.rb +1 -2
- data/lib/kitchen/loader/yaml.rb +22 -25
- data/lib/kitchen/logger.rb +9 -14
- data/lib/kitchen/logging.rb +0 -3
- data/lib/kitchen/login_command.rb +0 -2
- data/lib/kitchen/metadata_chopper.rb +0 -2
- data/lib/kitchen/platform.rb +1 -3
- data/lib/kitchen/provisioner.rb +3 -5
- data/lib/kitchen/provisioner/base.rb +2 -5
- data/lib/kitchen/provisioner/chef/berkshelf.rb +1 -5
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +24 -29
- data/lib/kitchen/provisioner/chef/librarian.rb +2 -6
- data/lib/kitchen/provisioner/chef/policyfile.rb +4 -8
- data/lib/kitchen/provisioner/chef_apply.rb +14 -17
- data/lib/kitchen/provisioner/chef_base.rb +43 -46
- data/lib/kitchen/provisioner/chef_solo.rb +10 -13
- data/lib/kitchen/provisioner/chef_zero.rb +22 -29
- data/lib/kitchen/provisioner/dummy.rb +0 -3
- data/lib/kitchen/provisioner/shell.rb +6 -9
- data/lib/kitchen/rake_tasks.rb +4 -6
- data/lib/kitchen/shell_out.rb +3 -5
- data/lib/kitchen/ssh.rb +16 -22
- data/lib/kitchen/state_file.rb +3 -5
- data/lib/kitchen/suite.rb +0 -2
- data/lib/kitchen/thor_tasks.rb +2 -4
- data/lib/kitchen/transport.rb +3 -5
- data/lib/kitchen/transport/base.rb +1 -7
- data/lib/kitchen/transport/dummy.rb +0 -4
- data/lib/kitchen/transport/ssh.rb +41 -47
- data/lib/kitchen/transport/winrm.rb +41 -40
- data/lib/kitchen/util.rb +1 -3
- data/lib/kitchen/verifier.rb +3 -5
- data/lib/kitchen/verifier/base.rb +2 -5
- data/lib/kitchen/verifier/busser.rb +24 -24
- data/lib/kitchen/verifier/dummy.rb +0 -3
- data/lib/kitchen/verifier/shell.rb +1 -3
- data/lib/kitchen/version.rb +1 -1
- data/lib/vendor/hash_recursive_merge.rb +0 -2
- data/spec/kitchen/base64_stream_spec.rb +3 -6
- data/spec/kitchen/cli_spec.rb +0 -2
- data/spec/kitchen/collection_spec.rb +4 -8
- data/spec/kitchen/color_spec.rb +0 -3
- data/spec/kitchen/config_spec.rb +91 -106
- data/spec/kitchen/configurable_spec.rb +44 -76
- data/spec/kitchen/data_munger_spec.rb +1178 -1247
- data/spec/kitchen/diagnostic_spec.rb +37 -38
- data/spec/kitchen/driver/base_spec.rb +7 -14
- data/spec/kitchen/driver/dummy_spec.rb +1 -7
- data/spec/kitchen/driver/proxy_spec.rb +2 -7
- data/spec/kitchen/driver/ssh_base_spec.rb +128 -149
- data/spec/kitchen/driver_spec.rb +7 -13
- data/spec/kitchen/errors_spec.rb +50 -60
- data/spec/kitchen/instance_spec.rb +217 -294
- data/spec/kitchen/lazy_hash_spec.rb +14 -18
- data/spec/kitchen/loader/yaml_spec.rb +201 -227
- data/spec/kitchen/logger_spec.rb +7 -15
- data/spec/kitchen/logging_spec.rb +1 -4
- data/spec/kitchen/login_command_spec.rb +3 -4
- data/spec/kitchen/metadata_chopper_spec.rb +0 -3
- data/spec/kitchen/platform_spec.rb +31 -32
- data/spec/kitchen/provisioner/base_spec.rb +22 -41
- data/spec/kitchen/provisioner/chef/policyfile_spec.rb +15 -15
- data/spec/kitchen/provisioner/chef_apply_spec.rb +8 -13
- data/spec/kitchen/provisioner/chef_base_spec.rb +150 -182
- data/spec/kitchen/provisioner/chef_solo_spec.rb +58 -72
- data/spec/kitchen/provisioner/chef_zero_spec.rb +99 -125
- data/spec/kitchen/provisioner/dummy_spec.rb +8 -11
- data/spec/kitchen/provisioner/shell_spec.rb +86 -103
- data/spec/kitchen/provisioner_spec.rb +5 -11
- data/spec/kitchen/shell_out_spec.rb +15 -19
- data/spec/kitchen/ssh_spec.rb +16 -35
- data/spec/kitchen/state_file_spec.rb +6 -11
- data/spec/kitchen/suite_spec.rb +5 -6
- data/spec/kitchen/transport/base_spec.rb +6 -14
- data/spec/kitchen/transport/ssh_spec.rb +39 -64
- data/spec/kitchen/transport/winrm_spec.rb +99 -127
- data/spec/kitchen/transport_spec.rb +7 -13
- data/spec/kitchen/util_spec.rb +17 -26
- data/spec/kitchen/verifier/base_spec.rb +24 -40
- data/spec/kitchen/verifier/busser_spec.rb +38 -68
- data/spec/kitchen/verifier/dummy_spec.rb +8 -11
- data/spec/kitchen/verifier/shell_spec.rb +14 -17
- data/spec/kitchen/verifier_spec.rb +7 -13
- data/spec/kitchen_spec.rb +4 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/powershell_max_size_spec.rb +1 -2
- data/support/chef-client-zero.rb +3 -4
- data/test-kitchen.gemspec +4 -6
- metadata +9 -9
data/lib/kitchen/configurable.rb
CHANGED
|
@@ -21,14 +21,12 @@ require "thor/util"
|
|
|
21
21
|
require "kitchen/lazy_hash"
|
|
22
22
|
|
|
23
23
|
module Kitchen
|
|
24
|
-
|
|
25
24
|
# A mixin for providing configuration-related behavior such as default
|
|
26
25
|
# config (static, computed, inherited), required config, local path
|
|
27
26
|
# expansion, etc.
|
|
28
27
|
#
|
|
29
28
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
30
29
|
module Configurable
|
|
31
|
-
|
|
32
30
|
def self.included(base)
|
|
33
31
|
base.extend(ClassMethods)
|
|
34
32
|
end
|
|
@@ -46,9 +44,7 @@ module Kitchen
|
|
|
46
44
|
# @return [self] itself, for use in chaining
|
|
47
45
|
# @raise [ClientError] if instance parameter is nil
|
|
48
46
|
def finalize_config!(instance)
|
|
49
|
-
if instance.nil?
|
|
50
|
-
raise ClientError, "Instance must be provided to #{self}"
|
|
51
|
-
end
|
|
47
|
+
raise ClientError, "Instance must be provided to #{self}" if instance.nil?
|
|
52
48
|
|
|
53
49
|
@instance = instance
|
|
54
50
|
expand_paths!
|
|
@@ -102,7 +98,7 @@ module Kitchen
|
|
|
102
98
|
[
|
|
103
99
|
File.join(base, instance.suite.name, path),
|
|
104
100
|
File.join(base, path),
|
|
105
|
-
File.join(Dir.pwd, path)
|
|
101
|
+
File.join(Dir.pwd, path),
|
|
106
102
|
].find do |candidate|
|
|
107
103
|
type == :directory ? File.directory?(candidate) : File.file?(candidate)
|
|
108
104
|
end
|
|
@@ -119,7 +115,7 @@ module Kitchen
|
|
|
119
115
|
#
|
|
120
116
|
# @return [Hash] a diagnostic hash
|
|
121
117
|
def diagnose
|
|
122
|
-
result =
|
|
118
|
+
result = {}
|
|
123
119
|
config_keys.sort.each { |k| result[k] = config[k] }
|
|
124
120
|
result
|
|
125
121
|
end
|
|
@@ -130,7 +126,7 @@ module Kitchen
|
|
|
130
126
|
#
|
|
131
127
|
# @return [Hash] a diagnostic hash
|
|
132
128
|
def diagnose_plugin
|
|
133
|
-
result =
|
|
129
|
+
result = {}
|
|
134
130
|
result[:name] = name
|
|
135
131
|
result.merge!(self.class.diagnose)
|
|
136
132
|
result
|
|
@@ -153,7 +149,7 @@ module Kitchen
|
|
|
153
149
|
# @return [String] joined path for instance's os_type
|
|
154
150
|
def remote_path_join(*parts)
|
|
155
151
|
path = File.join(*parts)
|
|
156
|
-
windows_os? ? path.
|
|
152
|
+
windows_os? ? path.tr("/", '\\') : path.tr('\\', "/")
|
|
157
153
|
end
|
|
158
154
|
|
|
159
155
|
# @return [TrueClass,FalseClass] true if `:os_type` is `"unix"` (or
|
|
@@ -210,10 +206,10 @@ module Kitchen
|
|
|
210
206
|
next if !should_expand || config[key].nil? || config[key] == false
|
|
211
207
|
|
|
212
208
|
config[key] = if config[key].is_a?(Array)
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
209
|
+
config[key].map { |path| File.expand_path(path, root_path) }
|
|
210
|
+
else
|
|
211
|
+
File.expand_path(config[key], root_path)
|
|
212
|
+
end
|
|
217
213
|
end
|
|
218
214
|
end
|
|
219
215
|
|
|
@@ -256,7 +252,7 @@ module Kitchen
|
|
|
256
252
|
[
|
|
257
253
|
"$env:PATH = try {",
|
|
258
254
|
"[System.Environment]::GetEnvironmentVariable('PATH','Machine')",
|
|
259
|
-
"} catch { $env:PATH }\n\n"
|
|
255
|
+
"} catch { $env:PATH }\n\n",
|
|
260
256
|
].join("\n")
|
|
261
257
|
end
|
|
262
258
|
|
|
@@ -329,8 +325,8 @@ module Kitchen
|
|
|
329
325
|
if !config.key?(protocol) || config[protocol].nil?
|
|
330
326
|
export_proxy(set_env, protocol)
|
|
331
327
|
elsif proxy_config_setting_present?(protocol)
|
|
332
|
-
set_env << shell_env_var(
|
|
333
|
-
set_env << shell_env_var(
|
|
328
|
+
set_env << shell_env_var(protocol.downcase.to_s, config[protocol])
|
|
329
|
+
set_env << shell_env_var(protocol.upcase.to_s, config[protocol])
|
|
334
330
|
end
|
|
335
331
|
end
|
|
336
332
|
end
|
|
@@ -356,7 +352,7 @@ module Kitchen
|
|
|
356
352
|
|
|
357
353
|
def proxy_from_environment?
|
|
358
354
|
proxy_setting_keys.any? do |protocol|
|
|
359
|
-
!ENV[
|
|
355
|
+
!ENV[protocol.downcase.to_s].nil? || !ENV[protocol.upcase.to_s].nil?
|
|
360
356
|
end
|
|
361
357
|
end
|
|
362
358
|
|
|
@@ -370,14 +366,13 @@ module Kitchen
|
|
|
370
366
|
# @param code [String] the type of proxy to export, one of 'http', 'https' or 'ftp'
|
|
371
367
|
# @api private
|
|
372
368
|
def export_proxy(env, type)
|
|
373
|
-
env << shell_env_var(
|
|
374
|
-
env << shell_env_var(
|
|
375
|
-
ENV[
|
|
369
|
+
env << shell_env_var(type.to_s, ENV[type.to_s]) if ENV[type.to_s]
|
|
370
|
+
env << shell_env_var(type.upcase.to_s, ENV[type.upcase.to_s]) if
|
|
371
|
+
ENV[type.upcase.to_s]
|
|
376
372
|
end
|
|
377
373
|
|
|
378
374
|
# Class methods which will be mixed in on inclusion of Configurable module.
|
|
379
375
|
module ClassMethods
|
|
380
|
-
|
|
381
376
|
# Sets the loaded version of this plugin, usually corresponding to the
|
|
382
377
|
# RubyGems version of the plugin's library. If the plugin does not set
|
|
383
378
|
# this value, then `nil` will be used and reported.
|
|
@@ -407,9 +402,9 @@ module Kitchen
|
|
|
407
402
|
# @return [Hash] a diagnostic hash
|
|
408
403
|
def diagnose
|
|
409
404
|
{
|
|
410
|
-
:
|
|
411
|
-
:
|
|
412
|
-
:
|
|
405
|
+
class: name,
|
|
406
|
+
version: @plugin_version,
|
|
407
|
+
api_version: @api_version,
|
|
413
408
|
}
|
|
414
409
|
end
|
|
415
410
|
|
|
@@ -489,7 +484,7 @@ module Kitchen
|
|
|
489
484
|
# @yieldparam value [Object] the current value of the attribute
|
|
490
485
|
# @yieldparam object [Object] a reference to the instantiated object
|
|
491
486
|
def required_config(attr, &block)
|
|
492
|
-
|
|
487
|
+
unless block_given?
|
|
493
488
|
klass = self
|
|
494
489
|
block = lambda do |_, value, thing|
|
|
495
490
|
if value.nil? || value.to_s.empty?
|
|
@@ -505,7 +500,7 @@ module Kitchen
|
|
|
505
500
|
# been merged with any superclass defaults
|
|
506
501
|
# @api private
|
|
507
502
|
def defaults
|
|
508
|
-
@defaults ||=
|
|
503
|
+
@defaults ||= {}.merge(super_defaults)
|
|
509
504
|
end
|
|
510
505
|
|
|
511
506
|
# @return [Hash] a hash of defaults from the included class' superclass
|
|
@@ -515,7 +510,7 @@ module Kitchen
|
|
|
515
510
|
if superclass.respond_to?(:defaults)
|
|
516
511
|
superclass.defaults
|
|
517
512
|
else
|
|
518
|
-
|
|
513
|
+
{}
|
|
519
514
|
end
|
|
520
515
|
end
|
|
521
516
|
|
|
@@ -524,7 +519,7 @@ module Kitchen
|
|
|
524
519
|
# which has been merged with any superclass expanded paths
|
|
525
520
|
# @api private
|
|
526
521
|
def expanded_paths
|
|
527
|
-
@expanded_paths ||=
|
|
522
|
+
@expanded_paths ||= {}.merge(super_expanded_paths)
|
|
528
523
|
end
|
|
529
524
|
|
|
530
525
|
# @return [Hash] a hash of expanded paths from the included class'
|
|
@@ -534,7 +529,7 @@ module Kitchen
|
|
|
534
529
|
if superclass.respond_to?(:expanded_paths)
|
|
535
530
|
superclass.expanded_paths
|
|
536
531
|
else
|
|
537
|
-
|
|
532
|
+
{}
|
|
538
533
|
end
|
|
539
534
|
end
|
|
540
535
|
|
|
@@ -542,7 +537,7 @@ module Kitchen
|
|
|
542
537
|
# which has been merged with any superclass valudations
|
|
543
538
|
# @api private
|
|
544
539
|
def validations
|
|
545
|
-
@validations ||=
|
|
540
|
+
@validations ||= {}.merge(super_validations)
|
|
546
541
|
end
|
|
547
542
|
|
|
548
543
|
# @return [Hash] a hash of validations from the included class'
|
|
@@ -552,7 +547,7 @@ module Kitchen
|
|
|
552
547
|
if superclass.respond_to?(:validations)
|
|
553
548
|
superclass.validations
|
|
554
549
|
else
|
|
555
|
-
|
|
550
|
+
{}
|
|
556
551
|
end
|
|
557
552
|
end
|
|
558
553
|
end
|
data/lib/kitchen/data_munger.rb
CHANGED
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
require "vendor/hash_recursive_merge"
|
|
20
20
|
|
|
21
21
|
module Kitchen
|
|
22
|
-
|
|
23
22
|
# Class to handle recursive merging of configuration between platforms,
|
|
24
23
|
# suites, and common data.
|
|
25
24
|
#
|
|
@@ -32,7 +31,6 @@ module Kitchen
|
|
|
32
31
|
#
|
|
33
32
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
34
33
|
class DataMunger
|
|
35
|
-
|
|
36
34
|
# Constructs a new DataMunger object.
|
|
37
35
|
#
|
|
38
36
|
# @param data [Hash] the incoming user data hash
|
|
@@ -135,9 +133,9 @@ module Kitchen
|
|
|
135
133
|
|
|
136
134
|
def combine_arrays!(root, key, *namespaces)
|
|
137
135
|
if root.key?(key)
|
|
138
|
-
root[key] = namespaces
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
root[key] = namespaces
|
|
137
|
+
.map { |namespace| root.fetch(key).fetch(namespace, []) }.flatten
|
|
138
|
+
.compact
|
|
141
139
|
end
|
|
142
140
|
end
|
|
143
141
|
|
|
@@ -219,11 +217,11 @@ module Kitchen
|
|
|
219
217
|
def convert_legacy_busser_format_at!(root)
|
|
220
218
|
if root.key?(:busser)
|
|
221
219
|
bdata = root.delete(:busser)
|
|
222
|
-
bdata = { :
|
|
220
|
+
bdata = { version: bdata } if bdata.is_a?(String)
|
|
223
221
|
bdata[:name] = "busser" if bdata[:name].nil?
|
|
224
222
|
|
|
225
|
-
vdata = root.fetch(:verifier,
|
|
226
|
-
vdata = { :
|
|
223
|
+
vdata = root.fetch(:verifier, {})
|
|
224
|
+
vdata = { name: vdata } if vdata.is_a?(String)
|
|
227
225
|
root[:verifier] = bdata.rmerge(vdata)
|
|
228
226
|
end
|
|
229
227
|
end
|
|
@@ -275,10 +273,10 @@ module Kitchen
|
|
|
275
273
|
# @api private
|
|
276
274
|
def convert_legacy_chef_paths_format!
|
|
277
275
|
data.fetch(:suites, []).each do |suite|
|
|
278
|
-
%w
|
|
276
|
+
%w{
|
|
279
277
|
data data_bags encrypted_data_bag_secret_key
|
|
280
278
|
environments nodes roles
|
|
281
|
-
|
|
279
|
+
}.each do |key|
|
|
282
280
|
move_chef_data_to_provisioner_at!(suite, "#{key}_path".to_sym)
|
|
283
281
|
end
|
|
284
282
|
end
|
|
@@ -364,15 +362,15 @@ module Kitchen
|
|
|
364
362
|
# @api private
|
|
365
363
|
def convert_legacy_driver_format_at!(root)
|
|
366
364
|
if root.key?(:driver_config)
|
|
367
|
-
ddata = root.fetch(:driver,
|
|
368
|
-
ddata = { :
|
|
365
|
+
ddata = root.fetch(:driver, {})
|
|
366
|
+
ddata = { name: ddata } if ddata.is_a?(String)
|
|
369
367
|
root[:driver] = root.delete(:driver_config).rmerge(ddata)
|
|
370
368
|
end
|
|
371
369
|
|
|
372
370
|
if root.key?(:driver_plugin)
|
|
373
|
-
ddata = root.fetch(:driver,
|
|
374
|
-
ddata = { :
|
|
375
|
-
root[:driver] = { :
|
|
371
|
+
ddata = root.fetch(:driver, {})
|
|
372
|
+
ddata = { name: ddata } if ddata.is_a?(String)
|
|
373
|
+
root[:driver] = { name: root.delete(:driver_plugin) }.rmerge(ddata)
|
|
376
374
|
end
|
|
377
375
|
end
|
|
378
376
|
|
|
@@ -485,17 +483,17 @@ module Kitchen
|
|
|
485
483
|
# longer are Drivers responsible for this.
|
|
486
484
|
# @api private
|
|
487
485
|
def convert_legacy_driver_http_proxy_format_at!(root)
|
|
488
|
-
ddata = root.fetch(:driver,
|
|
486
|
+
ddata = root.fetch(:driver, {})
|
|
489
487
|
|
|
490
488
|
[:http_proxy, :https_proxy].each do |key|
|
|
491
489
|
next unless ddata.is_a?(Hash) && ddata.key?(key)
|
|
492
490
|
|
|
493
|
-
pdata = root.fetch(:provisioner,
|
|
494
|
-
pdata = { :
|
|
491
|
+
pdata = root.fetch(:provisioner, {})
|
|
492
|
+
pdata = { name: pdata } if pdata.is_a?(String)
|
|
495
493
|
root[:provisioner] = { key => ddata.fetch(key) }.rmerge(pdata)
|
|
496
494
|
|
|
497
|
-
vdata = root.fetch(:verifier,
|
|
498
|
-
vdata = { :
|
|
495
|
+
vdata = root.fetch(:verifier, {})
|
|
496
|
+
vdata = { name: vdata } if vdata.is_a?(String)
|
|
499
497
|
root[:verifier] = { key => ddata.fetch(key) }.rmerge(vdata)
|
|
500
498
|
end
|
|
501
499
|
end
|
|
@@ -581,11 +579,11 @@ module Kitchen
|
|
|
581
579
|
# @api private
|
|
582
580
|
def convert_legacy_require_chef_omnibus_format_at!(root)
|
|
583
581
|
key = :require_chef_omnibus
|
|
584
|
-
ddata = root.fetch(:driver,
|
|
582
|
+
ddata = root.fetch(:driver, {})
|
|
585
583
|
|
|
586
584
|
if ddata.is_a?(Hash) && ddata.key?(key)
|
|
587
|
-
pdata = root.fetch(:provisioner,
|
|
588
|
-
pdata = { :
|
|
585
|
+
pdata = root.fetch(:provisioner, {})
|
|
586
|
+
pdata = { name: pdata } if pdata.is_a?(String)
|
|
589
587
|
root[:provisioner] =
|
|
590
588
|
{ key => root.fetch(:driver).delete(key) }.rmerge(pdata)
|
|
591
589
|
end
|
|
@@ -699,9 +697,9 @@ module Kitchen
|
|
|
699
697
|
# @api private
|
|
700
698
|
def move_chef_data_to_provisioner_at!(root, key)
|
|
701
699
|
if root.key?(key)
|
|
702
|
-
pdata = root.fetch(:provisioner,
|
|
703
|
-
pdata = { :
|
|
704
|
-
|
|
700
|
+
pdata = root.fetch(:provisioner, {})
|
|
701
|
+
pdata = { name: pdata } if pdata.is_a?(String)
|
|
702
|
+
unless root.fetch(key, nil).nil?
|
|
705
703
|
root[:provisioner] = pdata.rmerge(key => root.delete(key))
|
|
706
704
|
end
|
|
707
705
|
end
|
|
@@ -755,8 +753,8 @@ module Kitchen
|
|
|
755
753
|
# new Hash otherwise
|
|
756
754
|
# @api private
|
|
757
755
|
def normalized_common_data(key, default_key)
|
|
758
|
-
cdata = data.fetch(key,
|
|
759
|
-
cdata = cdata.nil? ?
|
|
756
|
+
cdata = data.fetch(key, {})
|
|
757
|
+
cdata = cdata.nil? ? {} : cdata.dup
|
|
760
758
|
cdata = { default_key => cdata } if cdata.is_a?(String)
|
|
761
759
|
cdata
|
|
762
760
|
end
|
|
@@ -799,7 +797,7 @@ module Kitchen
|
|
|
799
797
|
# new Hash otherwise
|
|
800
798
|
# @api private
|
|
801
799
|
def normalized_default_data(key, default_key, suite, platform)
|
|
802
|
-
ddata = kitchen_config.fetch(:defaults,
|
|
800
|
+
ddata = kitchen_config.fetch(:defaults, {}).fetch(key, {}).dup
|
|
803
801
|
ddata = { default_key => ddata.call(suite, platform) } if ddata.is_a?(Proc)
|
|
804
802
|
ddata = { default_key => ddata } if ddata.is_a?(String)
|
|
805
803
|
ddata
|
|
@@ -853,8 +851,8 @@ module Kitchen
|
|
|
853
851
|
# new Hash otherwise
|
|
854
852
|
# @api private
|
|
855
853
|
def normalized_platform_data(key, default_key, platform)
|
|
856
|
-
pdata = platform_data_for(platform).fetch(key,
|
|
857
|
-
pdata = pdata.nil? ?
|
|
854
|
+
pdata = platform_data_for(platform).fetch(key, {})
|
|
855
|
+
pdata = pdata.nil? ? {} : pdata.dup
|
|
858
856
|
pdata = { default_key => pdata } if pdata.is_a?(String)
|
|
859
857
|
namespace_array!(pdata, :run_list, :platform)
|
|
860
858
|
pdata
|
|
@@ -908,8 +906,8 @@ module Kitchen
|
|
|
908
906
|
# new Hash otherwise
|
|
909
907
|
# @api private
|
|
910
908
|
def normalized_suite_data(key, default_key, suite)
|
|
911
|
-
sdata = suite_data_for(suite).fetch(key,
|
|
912
|
-
sdata = sdata.nil? ?
|
|
909
|
+
sdata = suite_data_for(suite).fetch(key, {})
|
|
910
|
+
sdata = sdata.nil? ? {} : sdata.dup
|
|
913
911
|
sdata = { default_key => sdata } if sdata.is_a?(String)
|
|
914
912
|
namespace_array!(sdata, :run_list, :suite)
|
|
915
913
|
sdata
|
|
@@ -923,7 +921,7 @@ module Kitchen
|
|
|
923
921
|
# Hash if not found
|
|
924
922
|
# @api private
|
|
925
923
|
def platform_data_for(name)
|
|
926
|
-
data.fetch(:platforms,
|
|
924
|
+
data.fetch(:platforms, {}).find(-> { Hash.new }) do |platform|
|
|
927
925
|
platform.fetch(:name, nil) == name
|
|
928
926
|
end
|
|
929
927
|
end
|
|
@@ -939,7 +937,7 @@ module Kitchen
|
|
|
939
937
|
# @param key [Symbol] the key to search for
|
|
940
938
|
# @api private
|
|
941
939
|
def set_kitchen_config_at!(root, key)
|
|
942
|
-
kdata = data.fetch(:kitchen,
|
|
940
|
+
kdata = data.fetch(:kitchen, {})
|
|
943
941
|
|
|
944
942
|
root.delete(key) if root.key?(key)
|
|
945
943
|
root[key] = kitchen_config.fetch(key) if kitchen_config.key?(key)
|
|
@@ -954,7 +952,7 @@ module Kitchen
|
|
|
954
952
|
# Hash if not found
|
|
955
953
|
# @api private
|
|
956
954
|
def suite_data_for(name)
|
|
957
|
-
data.fetch(:suites,
|
|
955
|
+
data.fetch(:suites, {}).find(-> { Hash.new }) do |suite|
|
|
958
956
|
suite.fetch(:name, nil) == name
|
|
959
957
|
end
|
|
960
958
|
end
|
data/lib/kitchen/diagnostic.rb
CHANGED
|
@@ -20,13 +20,11 @@ require "kitchen/util"
|
|
|
20
20
|
require "kitchen/version"
|
|
21
21
|
|
|
22
22
|
module Kitchen
|
|
23
|
-
|
|
24
23
|
# Combines and compiles diagnostic information about a Test Kitchen
|
|
25
24
|
# configuration suitable for support and troubleshooting.
|
|
26
25
|
#
|
|
27
26
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
27
|
class Diagnostic
|
|
29
|
-
|
|
30
28
|
# Constructs a new Diagnostic object with an optional loader and optional
|
|
31
29
|
# instances array.
|
|
32
30
|
#
|
|
@@ -41,7 +39,7 @@ module Kitchen
|
|
|
41
39
|
@loader = options.fetch(:loader, nil)
|
|
42
40
|
@instances = options.fetch(:instances, [])
|
|
43
41
|
@plugins = options.fetch(:plugins, false)
|
|
44
|
-
@result =
|
|
42
|
+
@result = {}
|
|
45
43
|
end
|
|
46
44
|
|
|
47
45
|
# Returns a Hash with stringified keys containing diagnostic information.
|
|
@@ -98,12 +96,12 @@ module Kitchen
|
|
|
98
96
|
return unless @plugins
|
|
99
97
|
|
|
100
98
|
if error_hash?(instances)
|
|
101
|
-
result[:plugins] = { :
|
|
99
|
+
result[:plugins] = { error: instances[:error] }
|
|
102
100
|
elsif instances.empty?
|
|
103
|
-
result[:plugins] =
|
|
101
|
+
result[:plugins] = {}
|
|
104
102
|
else
|
|
105
103
|
plugins = {
|
|
106
|
-
:
|
|
104
|
+
driver: [], provisioner: [], transport: [], verifier: []
|
|
107
105
|
}
|
|
108
106
|
instances.map(&:diagnose_plugins).each do |plugin_hash|
|
|
109
107
|
plugin_hash.each { |type, plugin| plugins[type] << plugin }
|
|
@@ -120,7 +118,7 @@ module Kitchen
|
|
|
120
118
|
#
|
|
121
119
|
# @api private
|
|
122
120
|
def prepare_instances
|
|
123
|
-
result[:instances] =
|
|
121
|
+
result[:instances] = {}
|
|
124
122
|
if error_hash?(instances)
|
|
125
123
|
result[:instances][:error] = instances[:error]
|
|
126
124
|
else
|
data/lib/kitchen/driver.rb
CHANGED
|
@@ -19,13 +19,11 @@
|
|
|
19
19
|
require "thor/util"
|
|
20
20
|
|
|
21
21
|
module Kitchen
|
|
22
|
-
|
|
23
22
|
# A driver is responsible for carrying out the lifecycle activities of an
|
|
24
23
|
# instance, such as creating and destroying an instance.
|
|
25
24
|
#
|
|
26
25
|
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
27
26
|
module Driver
|
|
28
|
-
|
|
29
27
|
# Default driver plugin to use
|
|
30
28
|
DEFAULT_PLUGIN = "dummy".freeze
|
|
31
29
|
|
|
@@ -48,9 +46,9 @@ module Kitchen
|
|
|
48
46
|
raise
|
|
49
47
|
rescue LoadError, NameError
|
|
50
48
|
raise ClientError,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
"Could not load the '#{plugin}' driver from the load path." \
|
|
50
|
+
" Please ensure that your driver is installed as a gem or included" \
|
|
51
|
+
" in your Gemfile if using Bundler."
|
|
54
52
|
end
|
|
55
53
|
end
|
|
56
54
|
end
|