train 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +71 -0
  3. data/CHANGELOG.md +308 -0
  4. data/Gemfile +30 -0
  5. data/LICENSE +201 -0
  6. data/README.md +156 -0
  7. data/Rakefile +148 -0
  8. data/lib/train.rb +117 -0
  9. data/lib/train/errors.rb +23 -0
  10. data/lib/train/extras.rb +17 -0
  11. data/lib/train/extras/command_wrapper.rb +148 -0
  12. data/lib/train/extras/file_aix.rb +20 -0
  13. data/lib/train/extras/file_common.rb +161 -0
  14. data/lib/train/extras/file_linux.rb +16 -0
  15. data/lib/train/extras/file_unix.rb +79 -0
  16. data/lib/train/extras/file_windows.rb +91 -0
  17. data/lib/train/extras/linux_lsb.rb +60 -0
  18. data/lib/train/extras/os_common.rb +136 -0
  19. data/lib/train/extras/os_detect_darwin.rb +32 -0
  20. data/lib/train/extras/os_detect_linux.rb +148 -0
  21. data/lib/train/extras/os_detect_unix.rb +99 -0
  22. data/lib/train/extras/os_detect_windows.rb +57 -0
  23. data/lib/train/extras/stat.rb +133 -0
  24. data/lib/train/options.rb +80 -0
  25. data/lib/train/plugins.rb +40 -0
  26. data/lib/train/plugins/base_connection.rb +86 -0
  27. data/lib/train/plugins/transport.rb +49 -0
  28. data/lib/train/transports/docker.rb +103 -0
  29. data/lib/train/transports/local.rb +52 -0
  30. data/lib/train/transports/local_file.rb +90 -0
  31. data/lib/train/transports/local_os.rb +51 -0
  32. data/lib/train/transports/mock.rb +147 -0
  33. data/lib/train/transports/ssh.rb +163 -0
  34. data/lib/train/transports/ssh_connection.rb +225 -0
  35. data/lib/train/transports/winrm.rb +184 -0
  36. data/lib/train/transports/winrm_connection.rb +194 -0
  37. data/lib/train/version.rb +7 -0
  38. data/test/integration/.kitchen.yml +43 -0
  39. data/test/integration/Berksfile +3 -0
  40. data/test/integration/bootstrap.sh +17 -0
  41. data/test/integration/chefignore +1 -0
  42. data/test/integration/cookbooks/test/metadata.rb +1 -0
  43. data/test/integration/cookbooks/test/recipes/default.rb +100 -0
  44. data/test/integration/cookbooks/test/recipes/prep_files.rb +47 -0
  45. data/test/integration/docker_run.rb +153 -0
  46. data/test/integration/docker_test.rb +24 -0
  47. data/test/integration/docker_test_container.rb +24 -0
  48. data/test/integration/helper.rb +61 -0
  49. data/test/integration/sudo/customcommand.rb +15 -0
  50. data/test/integration/sudo/nopasswd.rb +16 -0
  51. data/test/integration/sudo/passwd.rb +21 -0
  52. data/test/integration/sudo/reqtty.rb +17 -0
  53. data/test/integration/sudo/run_as.rb +12 -0
  54. data/test/integration/test-travis-1.yaml +13 -0
  55. data/test/integration/test-travis-2.yaml +13 -0
  56. data/test/integration/test_local.rb +19 -0
  57. data/test/integration/test_ssh.rb +39 -0
  58. data/test/integration/tests/path_block_device_test.rb +74 -0
  59. data/test/integration/tests/path_character_device_test.rb +74 -0
  60. data/test/integration/tests/path_file_test.rb +79 -0
  61. data/test/integration/tests/path_folder_test.rb +90 -0
  62. data/test/integration/tests/path_missing_test.rb +77 -0
  63. data/test/integration/tests/path_pipe_test.rb +78 -0
  64. data/test/integration/tests/path_symlink_test.rb +95 -0
  65. data/test/integration/tests/run_command_test.rb +28 -0
  66. data/test/unit/extras/command_wrapper_test.rb +78 -0
  67. data/test/unit/extras/file_common_test.rb +180 -0
  68. data/test/unit/extras/linux_file_test.rb +167 -0
  69. data/test/unit/extras/os_common_test.rb +269 -0
  70. data/test/unit/extras/os_detect_linux_test.rb +189 -0
  71. data/test/unit/extras/os_detect_windows_test.rb +99 -0
  72. data/test/unit/extras/stat_test.rb +148 -0
  73. data/test/unit/extras/windows_file_test.rb +44 -0
  74. data/test/unit/helper.rb +7 -0
  75. data/test/unit/plugins/connection_test.rb +44 -0
  76. data/test/unit/plugins/transport_test.rb +111 -0
  77. data/test/unit/plugins_test.rb +22 -0
  78. data/test/unit/train_test.rb +156 -0
  79. data/test/unit/transports/local_file_test.rb +184 -0
  80. data/test/unit/transports/local_test.rb +87 -0
  81. data/test/unit/transports/mock_test.rb +87 -0
  82. data/test/unit/transports/ssh_test.rb +109 -0
  83. data/test/unit/version_test.rb +8 -0
  84. data/test/windows/local_test.rb +46 -0
  85. data/test/windows/winrm_test.rb +52 -0
  86. data/train.gemspec +38 -0
  87. metadata +295 -0
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+ require 'train/transports/mock'
4
+ require 'digest/sha2'
5
+
6
+ describe 'mock transport' do
7
+ let(:transport) { Train::Transports::Mock.new(verbose: true) }
8
+ let(:connection) { transport.connection }
9
+
10
+ it 'can be instantiated' do
11
+ transport.wont_be_nil
12
+ end
13
+
14
+ it 'can create a connection' do
15
+ connection.wont_be_nil
16
+ end
17
+
18
+ describe 'when running a mocked command' do
19
+ let(:mock_cmd) { }
20
+
21
+ it 'has a simple mock command creator' do
22
+ out = rand
23
+ cls = Train::Transports::Mock::Connection::Command
24
+ res = cls.new(out, '', 0)
25
+ connection.mock_command('test', out).must_equal res
26
+ end
27
+
28
+ it 'handles nil commands' do
29
+ connection.run_command(nil).stdout.must_equal('')
30
+ end
31
+
32
+ it 'can mock up nil commands' do
33
+ out = rand
34
+ connection.mock_command('', rand) # don't pull this result! always mock the input
35
+ connection.mock_command(nil, out) # pull this result
36
+ connection.run_command(nil).stdout.must_equal(out)
37
+ end
38
+
39
+ it 'gets results for stdout' do
40
+ out = rand
41
+ cmd = rand
42
+ connection.mock_command(cmd, out)
43
+ connection.run_command(cmd).stdout.must_equal(out)
44
+ end
45
+
46
+ it 'gets results for stderr' do
47
+ err = rand
48
+ cmd = rand
49
+ connection.mock_command(cmd, nil, err)
50
+ connection.run_command(cmd).stderr.must_equal(err)
51
+ end
52
+
53
+ it 'gets results for exit_status' do
54
+ code = rand
55
+ cmd = rand
56
+ connection.mock_command(cmd, nil, nil, code)
57
+ connection.run_command(cmd).exit_status.must_equal(code)
58
+ end
59
+
60
+ it 'can mock a command via its SHA2 sum' do
61
+ out = rand.to_s
62
+ cmd = rand.to_s
63
+ shacmd = Digest::SHA256.hexdigest cmd
64
+ connection.mock_command(shacmd, out)
65
+ connection.run_command(cmd).stdout.must_equal(out)
66
+ end
67
+ end
68
+
69
+ describe 'when accessing a mocked os' do
70
+ it 'has the default mock os faily set to unknown' do
71
+ connection.os[:family].must_equal 'unknown'
72
+ end
73
+
74
+ it 'sets the OS to the mocked value' do
75
+ connection.mock_os({ family: 'centos' })
76
+ connection.os.linux?.must_equal true
77
+ connection.os.redhat?.must_equal true
78
+ connection.os[:family].must_equal 'centos'
79
+ end
80
+ end
81
+
82
+ describe 'when accessing a mocked file' do
83
+ it 'gets results for content' do
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+ require 'train/transports/ssh'
4
+
5
+ # overwrite os detection to simplify mock tests, otherwise run_command tries to
6
+ # determine the OS first and fails the tests
7
+ class Train::Transports::SSH::Connection
8
+ class OS < OSCommon
9
+ def initialize(backend)
10
+ super(backend, { family: 'train_mock_os' })
11
+ end
12
+
13
+ def detect_family
14
+ # no op, we do not need to detect the os
15
+ end
16
+ end
17
+ end
18
+
19
+ describe 'ssh transport' do
20
+ let(:cls) { Train::Transports::SSH }
21
+ let(:conf) {{
22
+ host: rand.to_s,
23
+ password: rand.to_s,
24
+ key_files: rand.to_s,
25
+ }}
26
+
27
+ describe 'default options' do
28
+ let(:ssh) { cls.new({ host: 'dummy' }) }
29
+
30
+ it 'can be instantiated (with valid config)' do
31
+ ssh.wont_be_nil
32
+ end
33
+
34
+ it 'configures the host' do
35
+ ssh.options[:host].must_equal 'dummy'
36
+ end
37
+
38
+ it 'has default port' do
39
+ ssh.options[:port].must_equal 22
40
+ end
41
+
42
+ it 'has default user' do
43
+ ssh.options[:user].must_equal 'root'
44
+ end
45
+ end
46
+
47
+ describe 'opening a connection' do
48
+ let(:ssh) { cls.new(conf) }
49
+ let(:connection) { ssh.connection }
50
+
51
+ it 'gets the connection' do
52
+ connection.must_be_kind_of Train::Transports::SSH::Connection
53
+ end
54
+
55
+ it 'must respond to wait_until_ready' do
56
+ connection.must_respond_to :wait_until_ready
57
+ end
58
+
59
+ it 'can be closed' do
60
+ connection.close.must_be_nil
61
+ end
62
+
63
+ it 'has a login command == ssh' do
64
+ connection.login_command.command.must_equal 'ssh'
65
+ end
66
+
67
+ it 'has login command arguments' do
68
+ connection.login_command.arguments.must_equal([
69
+ "-o", "UserKnownHostsFile=/dev/null",
70
+ "-o", "StrictHostKeyChecking=no",
71
+ "-o", "IdentitiesOnly=yes",
72
+ "-o", "LogLevel=VERBOSE",
73
+ "-o", "ForwardAgent=no",
74
+ "-i", conf[:key_files],
75
+ "-p", "22",
76
+ "root@#{conf[:host]}",
77
+ ])
78
+ end
79
+ end
80
+
81
+ describe 'failed configuration' do
82
+ it 'works with a minimum valid config' do
83
+ cls.new(conf).connection
84
+ end
85
+
86
+ it 'doesnt like host == nil' do
87
+ conf.delete(:host)
88
+ proc { cls.new(conf).connection }.must_raise Train::ClientError
89
+ end
90
+
91
+ it 'reverts to root on user == nil' do
92
+ conf[:user] = nil
93
+ cls.new(conf).connection.method(:options).call[:user] == 'root'
94
+ end
95
+
96
+ it 'doesnt like key and password == nil' do
97
+ conf.delete(:password)
98
+ conf.delete(:key_files)
99
+ proc { cls.new(conf).connection }.must_raise Train::ClientError
100
+ end
101
+
102
+ it 'wont connect if its not possible' do
103
+ conf[:host] = 'localhost'
104
+ conf[:port] = 1
105
+ conn = cls.new(conf).connection
106
+ proc { conn.run_command('uname') }.must_raise Train::Transports::SSHFailed
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+
4
+ describe Train do
5
+ it 'defines a version' do
6
+ Train::VERSION.must_be_instance_of String
7
+ end
8
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+ require 'mocha/setup'
8
+ require 'train'
9
+
10
+ describe 'windows local command' do
11
+ let(:conn) {
12
+ # get final config
13
+ target_config = Train.target_config({})
14
+ # initialize train
15
+ backend = Train.create('local', target_config)
16
+
17
+ # start or reuse a connection
18
+ conn = backend.connection
19
+ conn
20
+ }
21
+
22
+ it 'verify os' do
23
+ os = conn.os
24
+ os[:name].must_equal 'Windows Server 2012 R2 Datacenter'
25
+ os[:family].must_equal "windows"
26
+ os[:release].must_equal '6.3.9600'
27
+ os[:arch].must_equal '64-bit'
28
+ end
29
+
30
+ it 'run echo test' do
31
+ cmd = conn.run_command('Write-Output "test"')
32
+ cmd.stdout.must_equal "test\r\n"
33
+ cmd.stderr.must_equal ''
34
+ end
35
+
36
+ it 'use powershell piping' do
37
+ cmd = conn.run_command("New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name A -Value (Write-Output 'PropertyA') -PassThru | Add-Member -MemberType NoteProperty -Name B -Value (Write-Output 'PropertyB') -PassThru | ConvertTo-Json")
38
+ cmd.stdout.must_equal "{\r\n \"A\": \"PropertyA\",\r\n \"B\": \"PropertyB\"\r\n}\r\n"
39
+ cmd.stderr.must_equal ''
40
+ end
41
+
42
+ after do
43
+ # close the connection
44
+ conn.close
45
+ end
46
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ # author: Christoph Hartmann
3
+ # author: Dominik Richter
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+ require 'mocha/setup'
8
+ require 'train'
9
+
10
+ describe 'windows local command' do
11
+ let(:conn) {
12
+ # get final config
13
+ target_config = Train.target_config({
14
+ target: ENV['train_target'],
15
+ password: ENV['winrm_pass'],
16
+ ssl: ENV['train_ssl'],
17
+ self_signed: true,
18
+ })
19
+
20
+ # initialize train
21
+ backend = Train.create('winrm', target_config)
22
+
23
+ # start or reuse a connection
24
+ conn = backend.connection
25
+ conn
26
+ }
27
+
28
+ it 'verify os' do
29
+ os = conn.os
30
+ os[:name].must_equal 'Windows Server 2012 R2 Datacenter'
31
+ os[:family].must_equal 'windows'
32
+ os[:release].must_equal '6.3.9600'
33
+ os[:arch].must_equal '64-bit'
34
+ end
35
+
36
+ it 'run echo test' do
37
+ cmd = conn.run_command('Write-Output "test"')
38
+ cmd.stdout.must_equal "test\r\n"
39
+ cmd.stderr.must_equal ''
40
+ end
41
+
42
+ it 'use powershell piping' do
43
+ cmd = conn.run_command("New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name A -Value (Write-Output 'PropertyA') -PassThru | Add-Member -MemberType NoteProperty -Name B -Value (Write-Output 'PropertyB') -PassThru | ConvertTo-Json")
44
+ cmd.stdout.must_equal "{\r\n \"A\": \"PropertyA\",\r\n \"B\": \"PropertyB\"\r\n}\r\n"
45
+ cmd.stderr.must_equal ''
46
+ end
47
+
48
+ after do
49
+ # close the connection
50
+ conn.close
51
+ end
52
+ end
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'train/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'train'
8
+ spec.version = Train::VERSION
9
+ spec.authors = ['Dominik Richter']
10
+ spec.email = ['dominik.richter@gmail.com']
11
+ spec.summary = 'Transport interface to talk to different backends.'
12
+ spec.description = 'Transport interface to talk to different backends.'
13
+ spec.homepage = 'https://github.com/chef/train/'
14
+ spec.license = 'Apache-2.0'
15
+
16
+ spec.files = %w{
17
+ train.gemspec README.md Rakefile LICENSE Gemfile CHANGELOG.md .rubocop.yml
18
+ } + Dir.glob(
19
+ '{lib,test}/**/*', File::FNM_DOTMATCH
20
+ ).reject { |f| File.directory?(f) }
21
+
22
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
23
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_dependency 'json', '~> 1.8'
27
+ # chef-client < 12.4.1 require mixlib-shellout-2.0.1
28
+ spec.add_dependency 'mixlib-shellout', '~> 2.0'
29
+ # net-ssh 3.x drops Ruby 1.9 support, so this constraint could be raised when
30
+ # 1.9 support is no longer needed here or for Inspec
31
+ spec.add_dependency 'net-ssh', '>= 2.9', '< 4.0'
32
+ spec.add_dependency 'net-scp', '~> 1.2'
33
+ spec.add_dependency 'winrm', '~> 1.6'
34
+ spec.add_dependency 'winrm-fs', '~> 0.3'
35
+ spec.add_dependency 'docker-api', '~> 1.26'
36
+
37
+ spec.add_development_dependency 'mocha', '~> 1.1'
38
+ end
metadata ADDED
@@ -0,0 +1,295 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: train
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.12.1
5
+ platform: ruby
6
+ authors:
7
+ - Dominik Richter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mixlib-shellout
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: net-ssh
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '2.9'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '4.0'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '2.9'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: net-scp
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.2'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.2'
75
+ - !ruby/object:Gem::Dependency
76
+ name: winrm
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.6'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.6'
89
+ - !ruby/object:Gem::Dependency
90
+ name: winrm-fs
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.3'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.3'
103
+ - !ruby/object:Gem::Dependency
104
+ name: docker-api
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.26'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.26'
117
+ - !ruby/object:Gem::Dependency
118
+ name: mocha
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.1'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.1'
131
+ description: Transport interface to talk to different backends.
132
+ email:
133
+ - dominik.richter@gmail.com
134
+ executables: []
135
+ extensions: []
136
+ extra_rdoc_files: []
137
+ files:
138
+ - ".rubocop.yml"
139
+ - CHANGELOG.md
140
+ - Gemfile
141
+ - LICENSE
142
+ - README.md
143
+ - Rakefile
144
+ - lib/train.rb
145
+ - lib/train/errors.rb
146
+ - lib/train/extras.rb
147
+ - lib/train/extras/command_wrapper.rb
148
+ - lib/train/extras/file_aix.rb
149
+ - lib/train/extras/file_common.rb
150
+ - lib/train/extras/file_linux.rb
151
+ - lib/train/extras/file_unix.rb
152
+ - lib/train/extras/file_windows.rb
153
+ - lib/train/extras/linux_lsb.rb
154
+ - lib/train/extras/os_common.rb
155
+ - lib/train/extras/os_detect_darwin.rb
156
+ - lib/train/extras/os_detect_linux.rb
157
+ - lib/train/extras/os_detect_unix.rb
158
+ - lib/train/extras/os_detect_windows.rb
159
+ - lib/train/extras/stat.rb
160
+ - lib/train/options.rb
161
+ - lib/train/plugins.rb
162
+ - lib/train/plugins/base_connection.rb
163
+ - lib/train/plugins/transport.rb
164
+ - lib/train/transports/docker.rb
165
+ - lib/train/transports/local.rb
166
+ - lib/train/transports/local_file.rb
167
+ - lib/train/transports/local_os.rb
168
+ - lib/train/transports/mock.rb
169
+ - lib/train/transports/ssh.rb
170
+ - lib/train/transports/ssh_connection.rb
171
+ - lib/train/transports/winrm.rb
172
+ - lib/train/transports/winrm_connection.rb
173
+ - lib/train/version.rb
174
+ - test/integration/.kitchen.yml
175
+ - test/integration/Berksfile
176
+ - test/integration/bootstrap.sh
177
+ - test/integration/chefignore
178
+ - test/integration/cookbooks/test/metadata.rb
179
+ - test/integration/cookbooks/test/recipes/default.rb
180
+ - test/integration/cookbooks/test/recipes/prep_files.rb
181
+ - test/integration/docker_run.rb
182
+ - test/integration/docker_test.rb
183
+ - test/integration/docker_test_container.rb
184
+ - test/integration/helper.rb
185
+ - test/integration/sudo/customcommand.rb
186
+ - test/integration/sudo/nopasswd.rb
187
+ - test/integration/sudo/passwd.rb
188
+ - test/integration/sudo/reqtty.rb
189
+ - test/integration/sudo/run_as.rb
190
+ - test/integration/test-travis-1.yaml
191
+ - test/integration/test-travis-2.yaml
192
+ - test/integration/test_local.rb
193
+ - test/integration/test_ssh.rb
194
+ - test/integration/tests/path_block_device_test.rb
195
+ - test/integration/tests/path_character_device_test.rb
196
+ - test/integration/tests/path_file_test.rb
197
+ - test/integration/tests/path_folder_test.rb
198
+ - test/integration/tests/path_missing_test.rb
199
+ - test/integration/tests/path_pipe_test.rb
200
+ - test/integration/tests/path_symlink_test.rb
201
+ - test/integration/tests/run_command_test.rb
202
+ - test/unit/extras/command_wrapper_test.rb
203
+ - test/unit/extras/file_common_test.rb
204
+ - test/unit/extras/linux_file_test.rb
205
+ - test/unit/extras/os_common_test.rb
206
+ - test/unit/extras/os_detect_linux_test.rb
207
+ - test/unit/extras/os_detect_windows_test.rb
208
+ - test/unit/extras/stat_test.rb
209
+ - test/unit/extras/windows_file_test.rb
210
+ - test/unit/helper.rb
211
+ - test/unit/plugins/connection_test.rb
212
+ - test/unit/plugins/transport_test.rb
213
+ - test/unit/plugins_test.rb
214
+ - test/unit/train_test.rb
215
+ - test/unit/transports/local_file_test.rb
216
+ - test/unit/transports/local_test.rb
217
+ - test/unit/transports/mock_test.rb
218
+ - test/unit/transports/ssh_test.rb
219
+ - test/unit/version_test.rb
220
+ - test/windows/local_test.rb
221
+ - test/windows/winrm_test.rb
222
+ - train.gemspec
223
+ homepage: https://github.com/chef/train/
224
+ licenses:
225
+ - Apache-2.0
226
+ metadata: {}
227
+ post_install_message:
228
+ rdoc_options: []
229
+ require_paths:
230
+ - lib
231
+ required_ruby_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ required_rubygems_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ requirements: []
242
+ rubyforge_project:
243
+ rubygems_version: 2.4.6
244
+ signing_key:
245
+ specification_version: 4
246
+ summary: Transport interface to talk to different backends.
247
+ test_files:
248
+ - test/integration/.kitchen.yml
249
+ - test/integration/Berksfile
250
+ - test/integration/bootstrap.sh
251
+ - test/integration/chefignore
252
+ - test/integration/cookbooks/test/metadata.rb
253
+ - test/integration/cookbooks/test/recipes/default.rb
254
+ - test/integration/cookbooks/test/recipes/prep_files.rb
255
+ - test/integration/docker_run.rb
256
+ - test/integration/docker_test.rb
257
+ - test/integration/docker_test_container.rb
258
+ - test/integration/helper.rb
259
+ - test/integration/sudo/customcommand.rb
260
+ - test/integration/sudo/nopasswd.rb
261
+ - test/integration/sudo/passwd.rb
262
+ - test/integration/sudo/reqtty.rb
263
+ - test/integration/sudo/run_as.rb
264
+ - test/integration/test-travis-1.yaml
265
+ - test/integration/test-travis-2.yaml
266
+ - test/integration/test_local.rb
267
+ - test/integration/test_ssh.rb
268
+ - test/integration/tests/path_block_device_test.rb
269
+ - test/integration/tests/path_character_device_test.rb
270
+ - test/integration/tests/path_file_test.rb
271
+ - test/integration/tests/path_folder_test.rb
272
+ - test/integration/tests/path_missing_test.rb
273
+ - test/integration/tests/path_pipe_test.rb
274
+ - test/integration/tests/path_symlink_test.rb
275
+ - test/integration/tests/run_command_test.rb
276
+ - test/unit/extras/command_wrapper_test.rb
277
+ - test/unit/extras/file_common_test.rb
278
+ - test/unit/extras/linux_file_test.rb
279
+ - test/unit/extras/os_common_test.rb
280
+ - test/unit/extras/os_detect_linux_test.rb
281
+ - test/unit/extras/os_detect_windows_test.rb
282
+ - test/unit/extras/stat_test.rb
283
+ - test/unit/extras/windows_file_test.rb
284
+ - test/unit/helper.rb
285
+ - test/unit/plugins/connection_test.rb
286
+ - test/unit/plugins/transport_test.rb
287
+ - test/unit/plugins_test.rb
288
+ - test/unit/train_test.rb
289
+ - test/unit/transports/local_file_test.rb
290
+ - test/unit/transports/local_test.rb
291
+ - test/unit/transports/mock_test.rb
292
+ - test/unit/transports/ssh_test.rb
293
+ - test/unit/version_test.rb
294
+ - test/windows/local_test.rb
295
+ - test/windows/winrm_test.rb