test-kitchen 1.7.0 → 1.7.1.dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cane +8 -8
- data/.gitattributes +3 -0
- data/.github/ISSUE_TEMPLATE.md +55 -55
- data/.gitignore +28 -28
- data/.kitchen.ci.yml +23 -23
- data/.kitchen.proxy.yml +27 -27
- data/.rubocop.yml +3 -3
- data/.travis.yml +70 -70
- data/.yardopts +3 -3
- data/Berksfile +3 -3
- data/CHANGELOG.md +1090 -1083
- data/CONTRIBUTING.md +14 -14
- data/Gemfile +19 -19
- data/Gemfile.proxy_tests +4 -4
- data/Guardfile +42 -42
- data/LICENSE +15 -15
- data/MAINTAINERS.md +23 -23
- data/README.md +135 -135
- data/Rakefile +61 -61
- data/appveyor.yml +44 -44
- data/features/kitchen_action_commands.feature +164 -164
- data/features/kitchen_command.feature +16 -16
- data/features/kitchen_console_command.feature +34 -34
- data/features/kitchen_defaults.feature +38 -38
- data/features/kitchen_diagnose_command.feature +96 -96
- data/features/kitchen_driver_create_command.feature +64 -64
- data/features/kitchen_driver_discover_command.feature +25 -25
- data/features/kitchen_help_command.feature +16 -16
- data/features/kitchen_init_command.feature +274 -274
- data/features/kitchen_list_command.feature +104 -104
- data/features/kitchen_login_command.feature +62 -62
- data/features/kitchen_sink_command.feature +30 -30
- data/features/kitchen_test_command.feature +88 -88
- data/features/step_definitions/gem_steps.rb +36 -36
- data/features/step_definitions/git_steps.rb +5 -5
- data/features/step_definitions/output_steps.rb +5 -5
- data/features/support/env.rb +75 -75
- data/lib/kitchen.rb +150 -150
- data/lib/kitchen/base64_stream.rb +55 -55
- data/lib/kitchen/cli.rb +419 -419
- data/lib/kitchen/collection.rb +55 -55
- data/lib/kitchen/color.rb +65 -65
- data/lib/kitchen/command.rb +185 -185
- data/lib/kitchen/command/action.rb +45 -45
- data/lib/kitchen/command/console.rb +58 -58
- data/lib/kitchen/command/diagnose.rb +92 -92
- data/lib/kitchen/command/driver_discover.rb +105 -105
- data/lib/kitchen/command/exec.rb +41 -41
- data/lib/kitchen/command/list.rb +119 -119
- data/lib/kitchen/command/login.rb +43 -43
- data/lib/kitchen/command/sink.rb +54 -54
- data/lib/kitchen/command/test.rb +51 -51
- data/lib/kitchen/config.rb +322 -322
- data/lib/kitchen/configurable.rb +529 -529
- data/lib/kitchen/data_munger.rb +959 -959
- data/lib/kitchen/diagnostic.rb +141 -141
- data/lib/kitchen/driver.rb +56 -56
- data/lib/kitchen/driver/base.rb +134 -134
- data/lib/kitchen/driver/dummy.rb +108 -108
- data/lib/kitchen/driver/proxy.rb +72 -72
- data/lib/kitchen/driver/ssh_base.rb +357 -357
- data/lib/kitchen/errors.rb +229 -229
- data/lib/kitchen/generator/driver_create.rb +177 -177
- data/lib/kitchen/generator/init.rb +296 -296
- data/lib/kitchen/instance.rb +662 -662
- data/lib/kitchen/lazy_hash.rb +142 -142
- data/lib/kitchen/loader/yaml.rb +349 -349
- data/lib/kitchen/logger.rb +423 -423
- data/lib/kitchen/logging.rb +56 -56
- data/lib/kitchen/login_command.rb +52 -52
- data/lib/kitchen/metadata_chopper.rb +52 -52
- data/lib/kitchen/platform.rb +67 -67
- data/lib/kitchen/provisioner.rb +54 -54
- data/lib/kitchen/provisioner/base.rb +236 -236
- data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
- data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
- data/lib/kitchen/provisioner/chef_apply.rb +124 -124
- data/lib/kitchen/provisioner/chef_base.rb +341 -341
- data/lib/kitchen/provisioner/chef_solo.rb +88 -88
- data/lib/kitchen/provisioner/chef_zero.rb +245 -245
- data/lib/kitchen/provisioner/dummy.rb +79 -79
- data/lib/kitchen/provisioner/shell.rb +138 -138
- data/lib/kitchen/rake_tasks.rb +63 -63
- data/lib/kitchen/shell_out.rb +93 -93
- data/lib/kitchen/ssh.rb +276 -276
- data/lib/kitchen/state_file.rb +120 -120
- data/lib/kitchen/suite.rb +51 -51
- data/lib/kitchen/thor_tasks.rb +66 -66
- data/lib/kitchen/transport.rb +54 -54
- data/lib/kitchen/transport/base.rb +176 -176
- data/lib/kitchen/transport/dummy.rb +79 -79
- data/lib/kitchen/transport/ssh.rb +364 -364
- data/lib/kitchen/transport/winrm.rb +486 -486
- data/lib/kitchen/util.rb +147 -147
- data/lib/kitchen/verifier.rb +55 -55
- data/lib/kitchen/verifier/base.rb +235 -235
- data/lib/kitchen/verifier/busser.rb +277 -277
- data/lib/kitchen/verifier/dummy.rb +79 -79
- data/lib/kitchen/verifier/shell.rb +101 -101
- data/lib/kitchen/version.rb +21 -21
- data/lib/vendor/hash_recursive_merge.rb +82 -82
- data/spec/kitchen/base64_stream_spec.rb +77 -77
- data/spec/kitchen/cli_spec.rb +56 -56
- data/spec/kitchen/collection_spec.rb +80 -80
- data/spec/kitchen/color_spec.rb +54 -54
- data/spec/kitchen/config_spec.rb +408 -408
- data/spec/kitchen/configurable_spec.rb +1095 -1095
- data/spec/kitchen/data_munger_spec.rb +2694 -2694
- data/spec/kitchen/diagnostic_spec.rb +129 -129
- data/spec/kitchen/driver/base_spec.rb +121 -121
- data/spec/kitchen/driver/dummy_spec.rb +199 -199
- data/spec/kitchen/driver/proxy_spec.rb +138 -138
- data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
- data/spec/kitchen/driver_spec.rb +112 -112
- data/spec/kitchen/errors_spec.rb +309 -309
- data/spec/kitchen/instance_spec.rb +1419 -1419
- data/spec/kitchen/lazy_hash_spec.rb +117 -117
- data/spec/kitchen/loader/yaml_spec.rb +774 -774
- data/spec/kitchen/logger_spec.rb +429 -429
- data/spec/kitchen/logging_spec.rb +59 -59
- data/spec/kitchen/login_command_spec.rb +68 -68
- data/spec/kitchen/metadata_chopper_spec.rb +82 -82
- data/spec/kitchen/platform_spec.rb +89 -89
- data/spec/kitchen/provisioner/base_spec.rb +386 -386
- data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
- data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1161
- data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
- data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
- data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
- data/spec/kitchen/provisioner/shell_spec.rb +566 -566
- data/spec/kitchen/provisioner_spec.rb +107 -107
- data/spec/kitchen/shell_out_spec.rb +150 -150
- data/spec/kitchen/ssh_spec.rb +693 -693
- data/spec/kitchen/state_file_spec.rb +129 -129
- data/spec/kitchen/suite_spec.rb +62 -62
- data/spec/kitchen/transport/base_spec.rb +89 -89
- data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
- data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
- data/spec/kitchen/transport_spec.rb +112 -112
- data/spec/kitchen/util_spec.rb +165 -165
- data/spec/kitchen/verifier/base_spec.rb +362 -362
- data/spec/kitchen/verifier/busser_spec.rb +610 -610
- data/spec/kitchen/verifier/dummy_spec.rb +99 -99
- data/spec/kitchen/verifier/shell_spec.rb +160 -160
- data/spec/kitchen/verifier_spec.rb +120 -120
- data/spec/kitchen_spec.rb +114 -114
- data/spec/spec_helper.rb +85 -85
- data/spec/support/powershell_max_size_spec.rb +40 -40
- data/support/busser_install_command.ps1 +14 -14
- data/support/busser_install_command.sh +14 -14
- data/support/chef-client-zero.rb +77 -77
- data/support/chef_base_init_command.ps1 +18 -18
- data/support/chef_base_init_command.sh +2 -2
- data/support/chef_base_install_command.ps1 +85 -85
- data/support/chef_base_install_command.sh +229 -229
- data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
- data/support/chef_zero_prepare_command_legacy.sh +10 -10
- data/support/download_helpers.sh +109 -109
- data/support/dummy-validation.pem +27 -27
- data/templates/driver/CHANGELOG.md.erb +3 -3
- data/templates/driver/Gemfile.erb +3 -3
- data/templates/driver/README.md.erb +64 -64
- data/templates/driver/Rakefile.erb +21 -21
- data/templates/driver/driver.rb.erb +23 -23
- data/templates/driver/gemspec.erb +29 -29
- data/templates/driver/gitignore.erb +17 -17
- data/templates/driver/license_apachev2.erb +15 -15
- data/templates/driver/license_lgplv3.erb +16 -16
- data/templates/driver/license_mit.erb +22 -22
- data/templates/driver/license_reserved.erb +5 -5
- data/templates/driver/tailor.erb +4 -4
- data/templates/driver/travis.yml.erb +11 -11
- data/templates/driver/version.rb.erb +12 -12
- data/templates/init/chefignore.erb +1 -1
- data/templates/init/kitchen.yml.erb +18 -18
- data/test-kitchen.gemspec +62 -62
- data/test/integration/default/default_spec.rb +3 -3
- data/testing_windows.md +37 -37
- metadata +5 -4
data/lib/kitchen/diagnostic.rb
CHANGED
|
@@ -1,141 +1,141 @@
|
|
|
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/util"
|
|
20
|
-
require "kitchen/version"
|
|
21
|
-
|
|
22
|
-
module Kitchen
|
|
23
|
-
|
|
24
|
-
# Combines and compiles diagnostic information about a Test Kitchen
|
|
25
|
-
# configuration suitable for support and troubleshooting.
|
|
26
|
-
#
|
|
27
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
-
class Diagnostic
|
|
29
|
-
|
|
30
|
-
# Constructs a new Diagnostic object with an optional loader and optional
|
|
31
|
-
# instances array.
|
|
32
|
-
#
|
|
33
|
-
# @param options [Hash] optional configuration
|
|
34
|
-
# @option options [#diagnose,Hash] :loader a loader instance that responds
|
|
35
|
-
# to `#diagnose` or an error Hash
|
|
36
|
-
# @option options [Array<#diagnose>,Hash] :instances an Array of instances
|
|
37
|
-
# that respond to `#diagnose` or an error Hash
|
|
38
|
-
# @option options [true,false] :plugins whether or not plugins should be
|
|
39
|
-
# returned
|
|
40
|
-
def initialize(options = {})
|
|
41
|
-
@loader = options.fetch(:loader, nil)
|
|
42
|
-
@instances = options.fetch(:instances, [])
|
|
43
|
-
@plugins = options.fetch(:plugins, false)
|
|
44
|
-
@result = Hash.new
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# Returns a Hash with stringified keys containing diagnostic information.
|
|
48
|
-
#
|
|
49
|
-
# @return [Hash] a configuration Hash
|
|
50
|
-
def read
|
|
51
|
-
prepare_common
|
|
52
|
-
prepare_plugins
|
|
53
|
-
prepare_loader
|
|
54
|
-
prepare_instances
|
|
55
|
-
|
|
56
|
-
Util.stringified_hash(result)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
# @return [Hash] a result hash
|
|
62
|
-
# @api private
|
|
63
|
-
attr_reader :result
|
|
64
|
-
|
|
65
|
-
# @return [#diagnose,Hash] a loader instance that responds to `#diagnose`
|
|
66
|
-
# or an error Hash
|
|
67
|
-
# @api private
|
|
68
|
-
attr_reader :loader
|
|
69
|
-
|
|
70
|
-
# @return [Array<#diagnose>,Hash] an Array of instances that respond to
|
|
71
|
-
# `#diagnose` or an error Hash
|
|
72
|
-
# @api private
|
|
73
|
-
attr_reader :instances
|
|
74
|
-
|
|
75
|
-
# Adds common information to the result Hash.
|
|
76
|
-
#
|
|
77
|
-
# @api private
|
|
78
|
-
def prepare_common
|
|
79
|
-
result[:timestamp] = Time.now.gmtime.to_s
|
|
80
|
-
result[:kitchen_version] = Kitchen::VERSION
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# Adds loader information to the result Hash.
|
|
84
|
-
#
|
|
85
|
-
# @api private
|
|
86
|
-
def prepare_loader
|
|
87
|
-
if error_hash?(loader)
|
|
88
|
-
result[:loader] = loader
|
|
89
|
-
else
|
|
90
|
-
result[:loader] = loader.diagnose if loader
|
|
91
|
-
end
|
|
92
|
-
end
|
|
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
|
-
|
|
119
|
-
# Adds instance information to the result Hash.
|
|
120
|
-
#
|
|
121
|
-
# @api private
|
|
122
|
-
def prepare_instances
|
|
123
|
-
result[:instances] = Hash.new
|
|
124
|
-
if error_hash?(instances)
|
|
125
|
-
result[:instances][:error] = instances[:error]
|
|
126
|
-
else
|
|
127
|
-
Array(instances).each { |i| result[:instances][i.name] = i.diagnose }
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Determins whether or not the object is an error hash. An error hash is
|
|
132
|
-
# defined as a Hash containing an `:error` key.
|
|
133
|
-
#
|
|
134
|
-
# @param obj [Object] an object
|
|
135
|
-
# @return [true,false] whether or not the object is an error hash
|
|
136
|
-
# @api private
|
|
137
|
-
def error_hash?(obj)
|
|
138
|
-
obj.is_a?(Hash) && obj.key?(:error)
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
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/util"
|
|
20
|
+
require "kitchen/version"
|
|
21
|
+
|
|
22
|
+
module Kitchen
|
|
23
|
+
|
|
24
|
+
# Combines and compiles diagnostic information about a Test Kitchen
|
|
25
|
+
# configuration suitable for support and troubleshooting.
|
|
26
|
+
#
|
|
27
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
+
class Diagnostic
|
|
29
|
+
|
|
30
|
+
# Constructs a new Diagnostic object with an optional loader and optional
|
|
31
|
+
# instances array.
|
|
32
|
+
#
|
|
33
|
+
# @param options [Hash] optional configuration
|
|
34
|
+
# @option options [#diagnose,Hash] :loader a loader instance that responds
|
|
35
|
+
# to `#diagnose` or an error Hash
|
|
36
|
+
# @option options [Array<#diagnose>,Hash] :instances an Array of instances
|
|
37
|
+
# that respond to `#diagnose` or an error Hash
|
|
38
|
+
# @option options [true,false] :plugins whether or not plugins should be
|
|
39
|
+
# returned
|
|
40
|
+
def initialize(options = {})
|
|
41
|
+
@loader = options.fetch(:loader, nil)
|
|
42
|
+
@instances = options.fetch(:instances, [])
|
|
43
|
+
@plugins = options.fetch(:plugins, false)
|
|
44
|
+
@result = Hash.new
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Returns a Hash with stringified keys containing diagnostic information.
|
|
48
|
+
#
|
|
49
|
+
# @return [Hash] a configuration Hash
|
|
50
|
+
def read
|
|
51
|
+
prepare_common
|
|
52
|
+
prepare_plugins
|
|
53
|
+
prepare_loader
|
|
54
|
+
prepare_instances
|
|
55
|
+
|
|
56
|
+
Util.stringified_hash(result)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# @return [Hash] a result hash
|
|
62
|
+
# @api private
|
|
63
|
+
attr_reader :result
|
|
64
|
+
|
|
65
|
+
# @return [#diagnose,Hash] a loader instance that responds to `#diagnose`
|
|
66
|
+
# or an error Hash
|
|
67
|
+
# @api private
|
|
68
|
+
attr_reader :loader
|
|
69
|
+
|
|
70
|
+
# @return [Array<#diagnose>,Hash] an Array of instances that respond to
|
|
71
|
+
# `#diagnose` or an error Hash
|
|
72
|
+
# @api private
|
|
73
|
+
attr_reader :instances
|
|
74
|
+
|
|
75
|
+
# Adds common information to the result Hash.
|
|
76
|
+
#
|
|
77
|
+
# @api private
|
|
78
|
+
def prepare_common
|
|
79
|
+
result[:timestamp] = Time.now.gmtime.to_s
|
|
80
|
+
result[:kitchen_version] = Kitchen::VERSION
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Adds loader information to the result Hash.
|
|
84
|
+
#
|
|
85
|
+
# @api private
|
|
86
|
+
def prepare_loader
|
|
87
|
+
if error_hash?(loader)
|
|
88
|
+
result[:loader] = loader
|
|
89
|
+
else
|
|
90
|
+
result[:loader] = loader.diagnose if loader
|
|
91
|
+
end
|
|
92
|
+
end
|
|
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
|
+
|
|
119
|
+
# Adds instance information to the result Hash.
|
|
120
|
+
#
|
|
121
|
+
# @api private
|
|
122
|
+
def prepare_instances
|
|
123
|
+
result[:instances] = Hash.new
|
|
124
|
+
if error_hash?(instances)
|
|
125
|
+
result[:instances][:error] = instances[:error]
|
|
126
|
+
else
|
|
127
|
+
Array(instances).each { |i| result[:instances][i.name] = i.diagnose }
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Determins whether or not the object is an error hash. An error hash is
|
|
132
|
+
# defined as a Hash containing an `:error` key.
|
|
133
|
+
#
|
|
134
|
+
# @param obj [Object] an object
|
|
135
|
+
# @return [true,false] whether or not the object is an error hash
|
|
136
|
+
# @api private
|
|
137
|
+
def error_hash?(obj)
|
|
138
|
+
obj.is_a?(Hash) && obj.key?(:error)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
data/lib/kitchen/driver.rb
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2012, 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 "thor/util"
|
|
20
|
-
|
|
21
|
-
module Kitchen
|
|
22
|
-
|
|
23
|
-
# A driver is responsible for carrying out the lifecycle activities of an
|
|
24
|
-
# instance, such as creating and destroying an instance.
|
|
25
|
-
#
|
|
26
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
27
|
-
module Driver
|
|
28
|
-
|
|
29
|
-
# Default driver plugin to use
|
|
30
|
-
DEFAULT_PLUGIN = "dummy".freeze
|
|
31
|
-
|
|
32
|
-
# Returns an instance of a driver given a plugin type string.
|
|
33
|
-
#
|
|
34
|
-
# @param plugin [String] a driver plugin type, which will be constantized
|
|
35
|
-
# @param config [Hash] a configuration hash to initialize the driver
|
|
36
|
-
# @return [Driver::Base] a driver instance
|
|
37
|
-
# @raise [ClientError] if a driver instance could not be created
|
|
38
|
-
# @raise [UserError] if the driver's dependencies could not be met
|
|
39
|
-
def self.for_plugin(plugin, config)
|
|
40
|
-
first_load = require("kitchen/driver/#{plugin}")
|
|
41
|
-
|
|
42
|
-
str_const = Thor::Util.camel_case(plugin)
|
|
43
|
-
klass = const_get(str_const)
|
|
44
|
-
object = klass.new(config)
|
|
45
|
-
object.verify_dependencies if first_load
|
|
46
|
-
object
|
|
47
|
-
rescue UserError
|
|
48
|
-
raise
|
|
49
|
-
rescue LoadError, NameError
|
|
50
|
-
raise ClientError,
|
|
51
|
-
"Could not load the '#{plugin}' driver from the load path." \
|
|
52
|
-
" Please ensure that your driver is installed as a gem or included" \
|
|
53
|
-
" in your Gemfile if using Bundler."
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2012, 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 "thor/util"
|
|
20
|
+
|
|
21
|
+
module Kitchen
|
|
22
|
+
|
|
23
|
+
# A driver is responsible for carrying out the lifecycle activities of an
|
|
24
|
+
# instance, such as creating and destroying an instance.
|
|
25
|
+
#
|
|
26
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
27
|
+
module Driver
|
|
28
|
+
|
|
29
|
+
# Default driver plugin to use
|
|
30
|
+
DEFAULT_PLUGIN = "dummy".freeze
|
|
31
|
+
|
|
32
|
+
# Returns an instance of a driver given a plugin type string.
|
|
33
|
+
#
|
|
34
|
+
# @param plugin [String] a driver plugin type, which will be constantized
|
|
35
|
+
# @param config [Hash] a configuration hash to initialize the driver
|
|
36
|
+
# @return [Driver::Base] a driver instance
|
|
37
|
+
# @raise [ClientError] if a driver instance could not be created
|
|
38
|
+
# @raise [UserError] if the driver's dependencies could not be met
|
|
39
|
+
def self.for_plugin(plugin, config)
|
|
40
|
+
first_load = require("kitchen/driver/#{plugin}")
|
|
41
|
+
|
|
42
|
+
str_const = Thor::Util.camel_case(plugin)
|
|
43
|
+
klass = const_get(str_const)
|
|
44
|
+
object = klass.new(config)
|
|
45
|
+
object.verify_dependencies if first_load
|
|
46
|
+
object
|
|
47
|
+
rescue UserError
|
|
48
|
+
raise
|
|
49
|
+
rescue LoadError, NameError
|
|
50
|
+
raise ClientError,
|
|
51
|
+
"Could not load the '#{plugin}' driver from the load path." \
|
|
52
|
+
" Please ensure that your driver is installed as a gem or included" \
|
|
53
|
+
" in your Gemfile if using Bundler."
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/kitchen/driver/base.rb
CHANGED
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2012, 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/lazy_hash"
|
|
20
|
-
|
|
21
|
-
module Kitchen
|
|
22
|
-
|
|
23
|
-
module Driver
|
|
24
|
-
|
|
25
|
-
# Base class for a driver.
|
|
26
|
-
#
|
|
27
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
-
class Base
|
|
29
|
-
|
|
30
|
-
include Configurable
|
|
31
|
-
include Logging
|
|
32
|
-
|
|
33
|
-
# Creates a new Driver object using the provided configuration data
|
|
34
|
-
# which will be merged with any default configuration.
|
|
35
|
-
#
|
|
36
|
-
# @param config [Hash] provided driver configuration
|
|
37
|
-
def initialize(config = {})
|
|
38
|
-
init_config(config)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# Creates an instance.
|
|
42
|
-
#
|
|
43
|
-
# @param state [Hash] mutable instance and driver state
|
|
44
|
-
# @raise [ActionFailed] if the action could not be completed
|
|
45
|
-
def create(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Destroys an instance.
|
|
49
|
-
#
|
|
50
|
-
# @param state [Hash] mutable instance and driver state
|
|
51
|
-
# @raise [ActionFailed] if the action could not be completed
|
|
52
|
-
def destroy(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
class << self
|
|
56
|
-
# @return [Array<Symbol>] an array of action method names that cannot
|
|
57
|
-
# be run concurrently and must be run in serial via a shared mutex
|
|
58
|
-
attr_reader :serial_actions
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Registers certain driver actions that cannot be safely run concurrently
|
|
62
|
-
# in threads across multiple instances. Typically this might be used
|
|
63
|
-
# for create or destroy actions that use an underlying resource that
|
|
64
|
-
# cannot be used at the same time.
|
|
65
|
-
#
|
|
66
|
-
# A shared mutex for this driver object will be used to synchronize all
|
|
67
|
-
# registered methods.
|
|
68
|
-
#
|
|
69
|
-
# @example a single action method that cannot be run concurrently
|
|
70
|
-
#
|
|
71
|
-
# no_parallel_for :create
|
|
72
|
-
#
|
|
73
|
-
# @example multiple action methods that cannot be run concurrently
|
|
74
|
-
#
|
|
75
|
-
# no_parallel_for :create, :destroy
|
|
76
|
-
#
|
|
77
|
-
# @param methods [Array<Symbol>] one or more actions as symbols
|
|
78
|
-
# @raise [ClientError] if any method is not a valid action method name
|
|
79
|
-
def self.no_parallel_for(*methods)
|
|
80
|
-
action_methods = [:create, :setup, :verify, :destroy]
|
|
81
|
-
|
|
82
|
-
Array(methods).each do |meth|
|
|
83
|
-
next if action_methods.include?(meth)
|
|
84
|
-
|
|
85
|
-
raise ClientError, "##{meth} is not a valid no_parallel_for method"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
@serial_actions ||= []
|
|
89
|
-
@serial_actions += methods
|
|
90
|
-
end
|
|
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
|
-
def self.kitchen_driver_api_version(version)
|
|
112
|
-
@api_version = version
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
private
|
|
116
|
-
|
|
117
|
-
# Intercepts any bare #puts calls in subclasses and issues an INFO log
|
|
118
|
-
# event instead.
|
|
119
|
-
#
|
|
120
|
-
# @param msg [String] message string
|
|
121
|
-
def puts(msg)
|
|
122
|
-
info(msg)
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
# Intercepts any bare #print calls in subclasses and issues an INFO log
|
|
126
|
-
# event instead.
|
|
127
|
-
#
|
|
128
|
-
# @param msg [String] message string
|
|
129
|
-
def print(msg)
|
|
130
|
-
info(msg)
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2012, 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/lazy_hash"
|
|
20
|
+
|
|
21
|
+
module Kitchen
|
|
22
|
+
|
|
23
|
+
module Driver
|
|
24
|
+
|
|
25
|
+
# Base class for a driver.
|
|
26
|
+
#
|
|
27
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
28
|
+
class Base
|
|
29
|
+
|
|
30
|
+
include Configurable
|
|
31
|
+
include Logging
|
|
32
|
+
|
|
33
|
+
# Creates a new Driver object using the provided configuration data
|
|
34
|
+
# which will be merged with any default configuration.
|
|
35
|
+
#
|
|
36
|
+
# @param config [Hash] provided driver configuration
|
|
37
|
+
def initialize(config = {})
|
|
38
|
+
init_config(config)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Creates an instance.
|
|
42
|
+
#
|
|
43
|
+
# @param state [Hash] mutable instance and driver state
|
|
44
|
+
# @raise [ActionFailed] if the action could not be completed
|
|
45
|
+
def create(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Destroys an instance.
|
|
49
|
+
#
|
|
50
|
+
# @param state [Hash] mutable instance and driver state
|
|
51
|
+
# @raise [ActionFailed] if the action could not be completed
|
|
52
|
+
def destroy(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class << self
|
|
56
|
+
# @return [Array<Symbol>] an array of action method names that cannot
|
|
57
|
+
# be run concurrently and must be run in serial via a shared mutex
|
|
58
|
+
attr_reader :serial_actions
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Registers certain driver actions that cannot be safely run concurrently
|
|
62
|
+
# in threads across multiple instances. Typically this might be used
|
|
63
|
+
# for create or destroy actions that use an underlying resource that
|
|
64
|
+
# cannot be used at the same time.
|
|
65
|
+
#
|
|
66
|
+
# A shared mutex for this driver object will be used to synchronize all
|
|
67
|
+
# registered methods.
|
|
68
|
+
#
|
|
69
|
+
# @example a single action method that cannot be run concurrently
|
|
70
|
+
#
|
|
71
|
+
# no_parallel_for :create
|
|
72
|
+
#
|
|
73
|
+
# @example multiple action methods that cannot be run concurrently
|
|
74
|
+
#
|
|
75
|
+
# no_parallel_for :create, :destroy
|
|
76
|
+
#
|
|
77
|
+
# @param methods [Array<Symbol>] one or more actions as symbols
|
|
78
|
+
# @raise [ClientError] if any method is not a valid action method name
|
|
79
|
+
def self.no_parallel_for(*methods)
|
|
80
|
+
action_methods = [:create, :setup, :verify, :destroy]
|
|
81
|
+
|
|
82
|
+
Array(methods).each do |meth|
|
|
83
|
+
next if action_methods.include?(meth)
|
|
84
|
+
|
|
85
|
+
raise ClientError, "##{meth} is not a valid no_parallel_for method"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
@serial_actions ||= []
|
|
89
|
+
@serial_actions += methods
|
|
90
|
+
end
|
|
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
|
+
def self.kitchen_driver_api_version(version)
|
|
112
|
+
@api_version = version
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
# Intercepts any bare #puts calls in subclasses and issues an INFO log
|
|
118
|
+
# event instead.
|
|
119
|
+
#
|
|
120
|
+
# @param msg [String] message string
|
|
121
|
+
def puts(msg)
|
|
122
|
+
info(msg)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Intercepts any bare #print calls in subclasses and issues an INFO log
|
|
126
|
+
# event instead.
|
|
127
|
+
#
|
|
128
|
+
# @param msg [String] message string
|
|
129
|
+
def print(msg)
|
|
130
|
+
info(msg)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|