kitchen-transport-train 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 133f962428df05c64cdd391b97494d38e8e63bef96ef3ee4df43927f66809516
4
+ data.tar.gz: 9071b6c0b96470fc32638422f3c2658e7a5dfe63c387269fd176fbf5717d3f7f
5
+ SHA512:
6
+ metadata.gz: 361d12c68100e3ffc4ca93cba6d8ae1ea9cc4a56aa77c09ae85bd8708dbe7bc8a05dabc0edf3785aa553ea22379c27c38c8c37397adba60c22446882e0e558d1
7
+ data.tar.gz: 84f44ff085c7784525da0b3b2a46d54d5672aca6607190698141874c3c21b1e664ef7ab7f9e5152122687968041b96b6aeaf0329d31e78bfec47d7c9e6e03dc4
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## Version 0.1.0
4
+
5
+ - Initial version
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # kitchen-transport-train
2
+
3
+ ## Summary
4
+
5
+ Kitchen transport to use any Train backend, which makes Test Kitchen much more modular with regards to target machines.
6
+
7
+ As Train OS Transports were inspired from Kitchen, they provide an almost identical API. This transport is basically an adapter to use Test Kitchen with all OS-style Train transports.
8
+
9
+ In contrast to normal Kitchen transports, this does not support the `kitchen login` command as Train is inherently non-interactive. An error will be displayed if you try to use this command.
10
+
11
+ ## Examples
12
+
13
+ Legacy configurations for easy SSH/WinRM connections are supported. This transport will automaticially detect Unix (`ssh` backend) and Windows (`winrm` backend) systems.
14
+
15
+ ```yaml
16
+ ---
17
+ transport:
18
+ name: train
19
+ backend: ssh # optional
20
+ ssh_key: ~/.ssh/testkitchen
21
+ ```
22
+
23
+ ```yaml
24
+ ---
25
+ transport:
26
+ name: train
27
+ backend: winrm # optional
28
+ ```
29
+
30
+ Train-oriented configuration can optionally specify the `backend` transport and then add the transport-specific configuration values:
31
+
32
+ ```yaml
33
+ ---
34
+ transport:
35
+ name: train
36
+ backend: ssh
37
+
38
+ # Use the selected Train transport options here 1:1
39
+ key_files: '...'
40
+ compression: true
41
+ ...
42
+ ```
43
+
44
+ ## Link to Train transport options
45
+
46
+ Options `user`, `host` and `password` (for kitchen-ec2 and Windows instances) are set automatically.
47
+
48
+ - [AWS Session Manager Transport](https://github.com/tecracer-chef/train-awsssm/blob/master/lib/train-awsssm/transport.rb#L8-L14)
49
+ - Docker Transport: no additional options
50
+ - [Serial/USB Transport](https://github.com/tecracer-chef/train-serial/blob/master/lib/train-serial/transport.rb#L8-L22)
51
+ - [SSH Transport](https://github.com/inspec/train/blob/0b9fd4556745d767c9dac2a83d5323e6b7025872/lib/train/transports/ssh.rb#L45-L74)
52
+ - [Telnet Transport](https://github.com/tecracer-chef/train-telnet/blob/master/lib/train-telnet/transport.rb#L8-L20)
53
+ - [WinRM Transport](https://github.com/inspec/train-winrm/blob/980190e44571787c7b60614257bd6dc2bd8a337d/lib/train-winrm/transport.rb#L52-L76)
@@ -0,0 +1,3 @@
1
+ module KitchenTransportTrain
2
+ VERSION = "0.1.0".freeze
3
+ end
@@ -0,0 +1,103 @@
1
+ require_relative "../../kitchen-transport-train/version"
2
+
3
+ require "forwardable" unless defined?(Forwardable)
4
+ require "kitchen/errors" unless defined?(Kitchen::UserError)
5
+ require "kitchen/transport/base" unless defined?(Kitchen::Transport::Base)
6
+ require "train" unless defined?(Train)
7
+
8
+ module Kitchen
9
+ module Transport
10
+ class ConnectionFailed < TransportFailed; end
11
+
12
+ class Train < Kitchen::Transport::Base
13
+
14
+ kitchen_transport_api_version 1
15
+
16
+ plugin_version KitchenTransportTrain::VERSION
17
+
18
+ def connection(state, &block)
19
+ options = connection_options(config.to_hash.merge(state))
20
+ options = adjust_options(options)
21
+
22
+ Kitchen::Transport::Train::Connection.new(options, &block)
23
+ end
24
+
25
+ class Connection < Kitchen::Transport::Base::Connection
26
+ # Forward everything to the Train connection, where adapters are not needed
27
+ extend Forwardable
28
+ def_delegators :@connection, :close, :upload, :download, :wait_until_ready
29
+
30
+ attr_reader :logger
31
+
32
+ def initialize(options = {})
33
+ @options = options
34
+ @logger = Kitchen.logger
35
+
36
+ @backend = ::Train.create(options[:backend], options)
37
+ @connection = @backend.connection
38
+
39
+ yield self if block_given?
40
+ end
41
+
42
+ def execute(command)
43
+ return if command.nil?
44
+
45
+ logger.debug("[Train/#{options[:backend]}] Execute (#{command})")
46
+
47
+ command_result = @connection.run_command(command)
48
+
49
+ if command_result.exit_status == 0
50
+ logger.info(command_result.stdout)
51
+ else
52
+ logger.error(command_result.stderr)
53
+
54
+ raise Transport::ConnectionFailed.new(
55
+ "Train/#{options[:backend]} exited (#{command_result.exit_status}) for command: [#{command}]",
56
+ command_result.exit_status
57
+ )
58
+ end
59
+ end
60
+
61
+ def login_command
62
+ raise ::Kitchen::UserError, "Interactive shells are not possible with the Train transport"
63
+ end
64
+ end
65
+
66
+ private
67
+
68
+ # Builds the hash of options needed by the Connection object on construction.
69
+ #
70
+ # @param data [Hash] merged configuration and mutable state data
71
+ # @return [Hash] hash of connection options
72
+ # @api private
73
+ def connection_options(data)
74
+ # `windows_os?` comes from Kitchen::Configurable, which is included in the Kitchen base transport
75
+ defaults = {
76
+ backend: windows_os? ? "winrm" : "ssh",
77
+ }
78
+
79
+ overrides = {
80
+ instance_name: instance.name,
81
+ kitchen_root: Dir.pwd,
82
+
83
+ # Kitchen to Train parameter conversion
84
+ host: data[:hostname],
85
+ user: data[:username],
86
+ }
87
+
88
+ defaults.merge(data).merge(overrides)
89
+ end
90
+
91
+ # Map Kitchen parameters to their Train equivalents for compatibility.
92
+ def adjust_options(data)
93
+ if data[:backend] == "ssh"
94
+ data[:key_files] = data[:ssh_key]
95
+ data.delete(:ssh_key)
96
+ end
97
+
98
+ data
99
+ end
100
+ end
101
+ end
102
+ end
103
+
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-transport-train
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Heinen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: train
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.5'
27
+ description: Use the Train transport ecosystem for all your Kitchen needs
28
+ email:
29
+ - theinen@tecracer.de
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - CHANGELOG.md
35
+ - README.md
36
+ - lib/kitchen-transport-train/version.rb
37
+ - lib/kitchen/transport/train.rb
38
+ homepage: https://github.com/tecracer-chef/kitchen-transport-train
39
+ licenses:
40
+ - Apache-2.0
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '2.6'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubygems_version: 3.0.3
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Kitchen transport for any Train backend
61
+ test_files: []