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/transport.rb
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2014, Salim Afiune
|
|
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 transport is responsible for the communication with an instance,
|
|
24
|
-
# that is remote comands and other actions such as file transfer,
|
|
25
|
-
# login, etc.
|
|
26
|
-
#
|
|
27
|
-
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
28
|
-
module Transport
|
|
29
|
-
|
|
30
|
-
# Default transport to use
|
|
31
|
-
DEFAULT_PLUGIN = "ssh".freeze
|
|
32
|
-
|
|
33
|
-
# Returns an instance of a transport given a plugin type string.
|
|
34
|
-
#
|
|
35
|
-
# @param plugin [String] a transport plugin type, to be constantized
|
|
36
|
-
# @param config [Hash] a configuration hash to initialize the transport
|
|
37
|
-
# @return [Transport::Base] a transport instance
|
|
38
|
-
# @raise [ClientError] if a transport instance could not be created
|
|
39
|
-
def self.for_plugin(plugin, config)
|
|
40
|
-
first_load = require("kitchen/transport/#{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 LoadError, NameError
|
|
48
|
-
raise ClientError,
|
|
49
|
-
"Could not load the '#{plugin}' transport from the load path." \
|
|
50
|
-
" Please ensure that your transport is installed as a gem or" \
|
|
51
|
-
" included in your Gemfile if using Bundler."
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2014, Salim Afiune
|
|
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 transport is responsible for the communication with an instance,
|
|
24
|
+
# that is remote comands and other actions such as file transfer,
|
|
25
|
+
# login, etc.
|
|
26
|
+
#
|
|
27
|
+
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
28
|
+
module Transport
|
|
29
|
+
|
|
30
|
+
# Default transport to use
|
|
31
|
+
DEFAULT_PLUGIN = "ssh".freeze
|
|
32
|
+
|
|
33
|
+
# Returns an instance of a transport given a plugin type string.
|
|
34
|
+
#
|
|
35
|
+
# @param plugin [String] a transport plugin type, to be constantized
|
|
36
|
+
# @param config [Hash] a configuration hash to initialize the transport
|
|
37
|
+
# @return [Transport::Base] a transport instance
|
|
38
|
+
# @raise [ClientError] if a transport instance could not be created
|
|
39
|
+
def self.for_plugin(plugin, config)
|
|
40
|
+
first_load = require("kitchen/transport/#{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 LoadError, NameError
|
|
48
|
+
raise ClientError,
|
|
49
|
+
"Could not load the '#{plugin}' transport from the load path." \
|
|
50
|
+
" Please ensure that your transport is installed as a gem or" \
|
|
51
|
+
" included in your Gemfile if using Bundler."
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
|
|
4
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
5
|
-
#
|
|
6
|
-
# Copyright (C) 2014, Salim Afiune
|
|
7
|
-
#
|
|
8
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
-
# you may not use this file except in compliance with the License.
|
|
10
|
-
# You may obtain a copy of the License at
|
|
11
|
-
#
|
|
12
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
-
#
|
|
14
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
-
# See the License for the specific language governing permissions and
|
|
18
|
-
# limitations under the License.
|
|
19
|
-
|
|
20
|
-
require "kitchen/errors"
|
|
21
|
-
require "kitchen/lazy_hash"
|
|
22
|
-
require "kitchen/login_command"
|
|
23
|
-
|
|
24
|
-
module Kitchen
|
|
25
|
-
|
|
26
|
-
module Transport
|
|
27
|
-
|
|
28
|
-
# Wrapped exception for any internally raised Transport errors.
|
|
29
|
-
#
|
|
30
|
-
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
31
|
-
class TransportFailed < TransientFailure; end
|
|
32
|
-
|
|
33
|
-
# Base class for a transport.
|
|
34
|
-
#
|
|
35
|
-
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
36
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
37
|
-
class Base
|
|
38
|
-
|
|
39
|
-
include Configurable
|
|
40
|
-
include Logging
|
|
41
|
-
|
|
42
|
-
# Create a new transport by providing a configuration hash.
|
|
43
|
-
#
|
|
44
|
-
# @param config [Hash] initial provided configuration
|
|
45
|
-
def initialize(config = {})
|
|
46
|
-
init_config(config)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# Creates a new Connection, configured by a merging of configuration
|
|
50
|
-
# and state data. Depending on the implementation, the Connection could
|
|
51
|
-
# be saved or cached to speed up multiple calls, given the same state
|
|
52
|
-
# hash as input.
|
|
53
|
-
#
|
|
54
|
-
# @param state [Hash] mutable instance state
|
|
55
|
-
# @return [Connection] a connection for this transport
|
|
56
|
-
# @raise [TransportFailed] if a connection could not be returned
|
|
57
|
-
def connection(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
58
|
-
raise ClientError, "#{self.class}#connection must be implemented"
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Closes the connection, if it is still active.
|
|
62
|
-
#
|
|
63
|
-
# @return [void]
|
|
64
|
-
def cleanup!
|
|
65
|
-
# This method may be left unimplemented if that is applicable
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# A Connection instance can be generated and re-generated, given new
|
|
69
|
-
# connection details such as connection port, hostname, credentials, etc.
|
|
70
|
-
# This object is responsible for carrying out the actions on the remote
|
|
71
|
-
# host such as executing commands, transferring files, etc.
|
|
72
|
-
#
|
|
73
|
-
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
74
|
-
class Connection
|
|
75
|
-
|
|
76
|
-
include Logging
|
|
77
|
-
|
|
78
|
-
# Create a new Connection instance.
|
|
79
|
-
#
|
|
80
|
-
# @param options [Hash] connection options
|
|
81
|
-
# @yield [self] yields itself for block-style invocation
|
|
82
|
-
def initialize(options = {})
|
|
83
|
-
init_options(options)
|
|
84
|
-
|
|
85
|
-
if block_given?
|
|
86
|
-
yield self
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# Closes the session connection, if it is still active.
|
|
91
|
-
def close
|
|
92
|
-
# this method may be left unimplemented if that is applicable
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Execute a command on the remote host.
|
|
96
|
-
#
|
|
97
|
-
# @param command [String] command string to execute
|
|
98
|
-
# @raise [TransportFailed] if the command does not exit successfully,
|
|
99
|
-
# which may vary by implementation
|
|
100
|
-
def execute(command) # rubocop:disable Lint/UnusedMethodArgument
|
|
101
|
-
raise ClientError, "#{self.class}#execute must be implemented"
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Builds a LoginCommand which can be used to open an interactive
|
|
105
|
-
# session on the remote host.
|
|
106
|
-
#
|
|
107
|
-
# @return [LoginCommand] an object containing the array of command line
|
|
108
|
-
# tokens and exec options to be used in a fork/exec
|
|
109
|
-
# @raise [ActionFailed] if the action could not be completed
|
|
110
|
-
def login_command
|
|
111
|
-
raise ActionFailed, "Remote login not supported in #{self.class}."
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Uploads local files or directories to remote host.
|
|
115
|
-
#
|
|
116
|
-
# @param locals [Array<String>] paths to local files or directories
|
|
117
|
-
# @param remote [String] path to remote destination
|
|
118
|
-
# @raise [TransportFailed] if the files could not all be uploaded
|
|
119
|
-
# successfully, which may vary by implementation
|
|
120
|
-
def upload(locals, remote) # rubocop:disable Lint/UnusedMethodArgument
|
|
121
|
-
raise ClientError, "#{self.class}#upload must be implemented"
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Block and return only when the remote host is prepared and ready to
|
|
125
|
-
# execute command and upload files. The semantics and details will
|
|
126
|
-
# vary by implementation, but a round trip through the hosted
|
|
127
|
-
# service is preferred to simply waiting on a socket to become
|
|
128
|
-
# available.
|
|
129
|
-
def wait_until_ready
|
|
130
|
-
# this method may be left unimplemented if that is applicable
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
private
|
|
134
|
-
|
|
135
|
-
# @return [Kitchen::Logger] a logger
|
|
136
|
-
# @api private
|
|
137
|
-
attr_reader :logger
|
|
138
|
-
|
|
139
|
-
# @return [Hash] connection options
|
|
140
|
-
# @api private
|
|
141
|
-
attr_reader :options
|
|
142
|
-
|
|
143
|
-
# Initialize incoming options for use by the object.
|
|
144
|
-
#
|
|
145
|
-
# @param options [Hash] configuration options
|
|
146
|
-
def init_options(options)
|
|
147
|
-
@options = options.dup
|
|
148
|
-
@logger = @options.delete(:logger) || Kitchen.logger
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Sets the API version for this transport. If the transport does not set
|
|
153
|
-
# this value, then `nil` will be used and reported.
|
|
154
|
-
#
|
|
155
|
-
# Sets the API version for this transport
|
|
156
|
-
#
|
|
157
|
-
# @example setting an API version
|
|
158
|
-
#
|
|
159
|
-
# module Kitchen
|
|
160
|
-
# module Transport
|
|
161
|
-
# class NewTransport < Kitchen::Transport::Base
|
|
162
|
-
#
|
|
163
|
-
# kitchen_transport_api_version 2
|
|
164
|
-
#
|
|
165
|
-
# end
|
|
166
|
-
# end
|
|
167
|
-
# end
|
|
168
|
-
#
|
|
169
|
-
# @param version [Integer,String] a version number
|
|
170
|
-
#
|
|
171
|
-
def self.kitchen_transport_api_version(version)
|
|
172
|
-
@api_version = version
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Salim Afiune (<salim@afiunemaya.com.mx>)
|
|
4
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
5
|
+
#
|
|
6
|
+
# Copyright (C) 2014, Salim Afiune
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
|
|
20
|
+
require "kitchen/errors"
|
|
21
|
+
require "kitchen/lazy_hash"
|
|
22
|
+
require "kitchen/login_command"
|
|
23
|
+
|
|
24
|
+
module Kitchen
|
|
25
|
+
|
|
26
|
+
module Transport
|
|
27
|
+
|
|
28
|
+
# Wrapped exception for any internally raised Transport errors.
|
|
29
|
+
#
|
|
30
|
+
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
31
|
+
class TransportFailed < TransientFailure; end
|
|
32
|
+
|
|
33
|
+
# Base class for a transport.
|
|
34
|
+
#
|
|
35
|
+
# @author Salim Afiune <salim@afiunemaya.com.mx>
|
|
36
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
37
|
+
class Base
|
|
38
|
+
|
|
39
|
+
include Configurable
|
|
40
|
+
include Logging
|
|
41
|
+
|
|
42
|
+
# Create a new transport by providing a configuration hash.
|
|
43
|
+
#
|
|
44
|
+
# @param config [Hash] initial provided configuration
|
|
45
|
+
def initialize(config = {})
|
|
46
|
+
init_config(config)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Creates a new Connection, configured by a merging of configuration
|
|
50
|
+
# and state data. Depending on the implementation, the Connection could
|
|
51
|
+
# be saved or cached to speed up multiple calls, given the same state
|
|
52
|
+
# hash as input.
|
|
53
|
+
#
|
|
54
|
+
# @param state [Hash] mutable instance state
|
|
55
|
+
# @return [Connection] a connection for this transport
|
|
56
|
+
# @raise [TransportFailed] if a connection could not be returned
|
|
57
|
+
def connection(state) # rubocop:disable Lint/UnusedMethodArgument
|
|
58
|
+
raise ClientError, "#{self.class}#connection must be implemented"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Closes the connection, if it is still active.
|
|
62
|
+
#
|
|
63
|
+
# @return [void]
|
|
64
|
+
def cleanup!
|
|
65
|
+
# This method may be left unimplemented if that is applicable
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# A Connection instance can be generated and re-generated, given new
|
|
69
|
+
# connection details such as connection port, hostname, credentials, etc.
|
|
70
|
+
# This object is responsible for carrying out the actions on the remote
|
|
71
|
+
# host such as executing commands, transferring files, etc.
|
|
72
|
+
#
|
|
73
|
+
# @author Fletcher Nichol <fnichol@nichol.ca>
|
|
74
|
+
class Connection
|
|
75
|
+
|
|
76
|
+
include Logging
|
|
77
|
+
|
|
78
|
+
# Create a new Connection instance.
|
|
79
|
+
#
|
|
80
|
+
# @param options [Hash] connection options
|
|
81
|
+
# @yield [self] yields itself for block-style invocation
|
|
82
|
+
def initialize(options = {})
|
|
83
|
+
init_options(options)
|
|
84
|
+
|
|
85
|
+
if block_given?
|
|
86
|
+
yield self
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Closes the session connection, if it is still active.
|
|
91
|
+
def close
|
|
92
|
+
# this method may be left unimplemented if that is applicable
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Execute a command on the remote host.
|
|
96
|
+
#
|
|
97
|
+
# @param command [String] command string to execute
|
|
98
|
+
# @raise [TransportFailed] if the command does not exit successfully,
|
|
99
|
+
# which may vary by implementation
|
|
100
|
+
def execute(command) # rubocop:disable Lint/UnusedMethodArgument
|
|
101
|
+
raise ClientError, "#{self.class}#execute must be implemented"
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Builds a LoginCommand which can be used to open an interactive
|
|
105
|
+
# session on the remote host.
|
|
106
|
+
#
|
|
107
|
+
# @return [LoginCommand] an object containing the array of command line
|
|
108
|
+
# tokens and exec options to be used in a fork/exec
|
|
109
|
+
# @raise [ActionFailed] if the action could not be completed
|
|
110
|
+
def login_command
|
|
111
|
+
raise ActionFailed, "Remote login not supported in #{self.class}."
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Uploads local files or directories to remote host.
|
|
115
|
+
#
|
|
116
|
+
# @param locals [Array<String>] paths to local files or directories
|
|
117
|
+
# @param remote [String] path to remote destination
|
|
118
|
+
# @raise [TransportFailed] if the files could not all be uploaded
|
|
119
|
+
# successfully, which may vary by implementation
|
|
120
|
+
def upload(locals, remote) # rubocop:disable Lint/UnusedMethodArgument
|
|
121
|
+
raise ClientError, "#{self.class}#upload must be implemented"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Block and return only when the remote host is prepared and ready to
|
|
125
|
+
# execute command and upload files. The semantics and details will
|
|
126
|
+
# vary by implementation, but a round trip through the hosted
|
|
127
|
+
# service is preferred to simply waiting on a socket to become
|
|
128
|
+
# available.
|
|
129
|
+
def wait_until_ready
|
|
130
|
+
# this method may be left unimplemented if that is applicable
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
private
|
|
134
|
+
|
|
135
|
+
# @return [Kitchen::Logger] a logger
|
|
136
|
+
# @api private
|
|
137
|
+
attr_reader :logger
|
|
138
|
+
|
|
139
|
+
# @return [Hash] connection options
|
|
140
|
+
# @api private
|
|
141
|
+
attr_reader :options
|
|
142
|
+
|
|
143
|
+
# Initialize incoming options for use by the object.
|
|
144
|
+
#
|
|
145
|
+
# @param options [Hash] configuration options
|
|
146
|
+
def init_options(options)
|
|
147
|
+
@options = options.dup
|
|
148
|
+
@logger = @options.delete(:logger) || Kitchen.logger
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Sets the API version for this transport. If the transport does not set
|
|
153
|
+
# this value, then `nil` will be used and reported.
|
|
154
|
+
#
|
|
155
|
+
# Sets the API version for this transport
|
|
156
|
+
#
|
|
157
|
+
# @example setting an API version
|
|
158
|
+
#
|
|
159
|
+
# module Kitchen
|
|
160
|
+
# module Transport
|
|
161
|
+
# class NewTransport < Kitchen::Transport::Base
|
|
162
|
+
#
|
|
163
|
+
# kitchen_transport_api_version 2
|
|
164
|
+
#
|
|
165
|
+
# end
|
|
166
|
+
# end
|
|
167
|
+
# end
|
|
168
|
+
#
|
|
169
|
+
# @param version [Integer,String] a version number
|
|
170
|
+
#
|
|
171
|
+
def self.kitchen_transport_api_version(version)
|
|
172
|
+
@api_version = version
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|