r-train 0.9.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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +45 -0
  4. data/.travis.yml +12 -0
  5. data/Gemfile +22 -0
  6. data/LICENSE +201 -0
  7. data/README.md +137 -0
  8. data/Rakefile +39 -0
  9. data/lib/train.rb +100 -0
  10. data/lib/train/errors.rb +23 -0
  11. data/lib/train/extras.rb +15 -0
  12. data/lib/train/extras/command_wrapper.rb +105 -0
  13. data/lib/train/extras/file_common.rb +131 -0
  14. data/lib/train/extras/linux_file.rb +74 -0
  15. data/lib/train/extras/linux_lsb.rb +60 -0
  16. data/lib/train/extras/os_common.rb +131 -0
  17. data/lib/train/extras/os_detect_darwin.rb +32 -0
  18. data/lib/train/extras/os_detect_linux.rb +126 -0
  19. data/lib/train/extras/os_detect_unix.rb +77 -0
  20. data/lib/train/extras/os_detect_windows.rb +73 -0
  21. data/lib/train/extras/stat.rb +92 -0
  22. data/lib/train/extras/windows_file.rb +85 -0
  23. data/lib/train/options.rb +80 -0
  24. data/lib/train/plugins.rb +40 -0
  25. data/lib/train/plugins/base_connection.rb +86 -0
  26. data/lib/train/plugins/transport.rb +49 -0
  27. data/lib/train/transports/docker.rb +102 -0
  28. data/lib/train/transports/local.rb +52 -0
  29. data/lib/train/transports/local_file.rb +77 -0
  30. data/lib/train/transports/local_os.rb +51 -0
  31. data/lib/train/transports/mock.rb +125 -0
  32. data/lib/train/transports/ssh.rb +163 -0
  33. data/lib/train/transports/ssh_connection.rb +216 -0
  34. data/lib/train/transports/winrm.rb +187 -0
  35. data/lib/train/transports/winrm_connection.rb +258 -0
  36. data/lib/train/version.rb +7 -0
  37. data/test/integration/.kitchen.yml +43 -0
  38. data/test/integration/Berksfile +3 -0
  39. data/test/integration/bootstrap.sh +17 -0
  40. data/test/integration/chefignore +1 -0
  41. data/test/integration/cookbooks/test/metadata.rb +1 -0
  42. data/test/integration/cookbooks/test/recipes/default.rb +101 -0
  43. data/test/integration/docker_run.rb +153 -0
  44. data/test/integration/docker_test.rb +24 -0
  45. data/test/integration/docker_test_container.rb +24 -0
  46. data/test/integration/helper.rb +58 -0
  47. data/test/integration/sudo/nopasswd.rb +16 -0
  48. data/test/integration/sudo/passwd.rb +21 -0
  49. data/test/integration/sudo/run_as.rb +12 -0
  50. data/test/integration/test-runner.yaml +24 -0
  51. data/test/integration/test_local.rb +19 -0
  52. data/test/integration/test_ssh.rb +24 -0
  53. data/test/integration/tests/path_block_device_test.rb +74 -0
  54. data/test/integration/tests/path_character_device_test.rb +74 -0
  55. data/test/integration/tests/path_file_test.rb +79 -0
  56. data/test/integration/tests/path_folder_test.rb +88 -0
  57. data/test/integration/tests/path_missing_test.rb +77 -0
  58. data/test/integration/tests/path_pipe_test.rb +78 -0
  59. data/test/integration/tests/path_symlink_test.rb +83 -0
  60. data/test/integration/tests/run_command_test.rb +28 -0
  61. data/test/unit/extras/command_wrapper_test.rb +41 -0
  62. data/test/unit/extras/file_common_test.rb +133 -0
  63. data/test/unit/extras/linux_file_test.rb +98 -0
  64. data/test/unit/extras/os_common_test.rb +258 -0
  65. data/test/unit/extras/stat_test.rb +105 -0
  66. data/test/unit/helper.rb +6 -0
  67. data/test/unit/plugins/connection_test.rb +44 -0
  68. data/test/unit/plugins/transport_test.rb +111 -0
  69. data/test/unit/plugins_test.rb +22 -0
  70. data/test/unit/train_test.rb +132 -0
  71. data/test/unit/transports/local_file_test.rb +112 -0
  72. data/test/unit/transports/local_test.rb +73 -0
  73. data/test/unit/transports/mock_test.rb +76 -0
  74. data/test/unit/transports/ssh_test.rb +95 -0
  75. data/test/unit/version_test.rb +8 -0
  76. data/train.gemspec +32 -0
  77. metadata +299 -0
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+ require 'train/transports/mock'
4
+ require 'train/extras'
5
+
6
+ describe 'file common' do
7
+ let(:cls) { Train::Extras::LinuxFile }
8
+ let(:backend) {
9
+ backend = Train::Transports::Mock.new.connection
10
+ backend.mock_os({ family: 'linux' })
11
+ backend
12
+ }
13
+
14
+ def mock_stat(path, out, err = '', code = 0)
15
+ backend.mock_command(
16
+ "stat path 2>/dev/null --printf '%s\n%f\n%U\n%u\n%G\n%g\n%X\n%Y\n%C'",
17
+ out, err, code,
18
+ )
19
+ end
20
+
21
+ it 'reads file contents' do
22
+ out = rand.to_s
23
+ backend.mock_command('cat path || echo -n', out)
24
+ cls.new(backend, 'path').content.must_equal out
25
+ end
26
+
27
+ it 'reads file contents' do
28
+ backend.mock_command('cat path || echo -n', '')
29
+ mock_stat('path', '', 'some error...', 1)
30
+ cls.new(backend, 'path').content.must_equal nil
31
+ end
32
+
33
+ it 'checks for file existance' do
34
+ backend.mock_command('test -e path', true)
35
+ cls.new(backend, 'path').exist?.must_equal true
36
+ end
37
+
38
+ it 'checks for file existance' do
39
+ backend.mock_command('test -e path', nil, nil, 1)
40
+ cls.new(backend, 'path').exist?.must_equal false
41
+ end
42
+
43
+ it 'retrieves the link path' do
44
+ out = rand.to_s
45
+ mock_stat('path', "13\na1ff\nz\n1001\nz\n1001\n1444573475\n1444573475\n?")
46
+ backend.mock_command('readlink path', out)
47
+ cls.new(backend, 'path').link_path.must_equal out
48
+ end
49
+
50
+ it 'retrieves the linked file' do
51
+ out = rand.to_s
52
+ mock_stat('path', "13\na1ff\nz\n1001\nz\n1001\n1444573475\n1444573475\n?")
53
+ backend.mock_command('readlink path', out)
54
+ f = backend.file(out)
55
+ cls.new(backend, 'path').link_target.must_equal f
56
+ end
57
+
58
+ it 'checks a mounted path' do
59
+ backend.mock_command("mount | grep -- ' on path'", rand.to_s)
60
+ cls.new(backend, 'path').mounted?.must_equal true
61
+ end
62
+
63
+ it 'has nil product version' do
64
+ cls.new(backend, 'path').product_version.must_be_nil
65
+ end
66
+
67
+ it 'has nil file version' do
68
+ cls.new(backend, 'path').file_version.must_be_nil
69
+ end
70
+
71
+ describe 'stat on a file' do
72
+ before { mock_stat('path', "13\na1ff\nz\n1001\nz\n1001\n1444573475\n1444573475\nlabels") }
73
+
74
+ it 'retrieves the file type' do
75
+ cls.new(backend, 'path').type.must_equal :symlink
76
+ end
77
+
78
+ it 'retrieves the file mode' do
79
+ cls.new(backend, 'path').mode.must_equal 00777
80
+ end
81
+
82
+ it 'retrieves the file owner' do
83
+ cls.new(backend, 'path').owner.must_equal 'z'
84
+ end
85
+
86
+ it 'retrieves the file mtime' do
87
+ cls.new(backend, 'path').mtime.must_equal 1444573475
88
+ end
89
+
90
+ it 'retrieves the file size' do
91
+ cls.new(backend, 'path').size.must_equal 13
92
+ end
93
+
94
+ it 'retrieves the file selinux_label' do
95
+ cls.new(backend, 'path').selinux_label.must_equal 'labels'
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,258 @@
1
+ # encoding: utf-8
2
+ # author: Dominik Richter
3
+ # author: Christoph Hartmann
4
+
5
+ require 'helper'
6
+ require 'train/extras'
7
+
8
+ describe 'os common plugin' do
9
+ let(:cls) {
10
+ Class.new(Train::Extras::OSCommon) do
11
+ def detect_family; end
12
+ end
13
+ }
14
+
15
+ def mock_platform(x)
16
+ cls.new(nil, { family: x })
17
+ end
18
+
19
+ it 'provides a method to access platform data' do
20
+ family = rand
21
+ os = mock_platform(family)
22
+ os[:family].must_equal family
23
+ end
24
+
25
+ it 'provides an accessor for the full hash' do
26
+ x = rand.to_s
27
+ os = mock_platform(x)
28
+ os.to_hash.must_equal({ family: x })
29
+ end
30
+
31
+ describe 'with platform set to redhat' do
32
+ let(:os) { mock_platform('redhat') }
33
+ it { os.redhat?.must_equal(true) }
34
+ it { os.debian?.must_equal(false) }
35
+ it { os.suse?.must_equal(false) }
36
+ it { os.linux?.must_equal(true) }
37
+ it { os.unix?.must_equal(true) }
38
+ end
39
+
40
+ describe 'with platform set to oracle' do
41
+ let(:os) { mock_platform('oracle') }
42
+ it { os.redhat?.must_equal(true) }
43
+ it { os.debian?.must_equal(false) }
44
+ it { os.suse?.must_equal(false) }
45
+ it { os.linux?.must_equal(true) }
46
+ it { os.unix?.must_equal(true) }
47
+ end
48
+
49
+ describe 'with platform set to centos' do
50
+ let(:os) { mock_platform('centos') }
51
+ it { os.redhat?.must_equal(true) }
52
+ it { os.debian?.must_equal(false) }
53
+ it { os.suse?.must_equal(false) }
54
+ it { os.linux?.must_equal(true) }
55
+ it { os.unix?.must_equal(true) }
56
+ end
57
+
58
+ describe 'with platform set to fedora' do
59
+ let(:os) { mock_platform('fedora') }
60
+ it { os.redhat?.must_equal(true) }
61
+ it { os.debian?.must_equal(false) }
62
+ it { os.suse?.must_equal(false) }
63
+ it { os.linux?.must_equal(true) }
64
+ it { os.unix?.must_equal(true) }
65
+ end
66
+
67
+ describe 'with platform set to debian' do
68
+ let(:os) { mock_platform('debian') }
69
+ it { os.redhat?.must_equal(false) }
70
+ it { os.debian?.must_equal(true) }
71
+ it { os.suse?.must_equal(false) }
72
+ it { os.linux?.must_equal(true) }
73
+ it { os.unix?.must_equal(true) }
74
+ end
75
+
76
+ describe 'with platform set to ubuntu' do
77
+ let(:os) { mock_platform('ubuntu') }
78
+ it { os.redhat?.must_equal(false) }
79
+ it { os.debian?.must_equal(true) }
80
+ it { os.suse?.must_equal(false) }
81
+ it { os.linux?.must_equal(true) }
82
+ it { os.unix?.must_equal(true) }
83
+ end
84
+
85
+ describe 'with platform set to linuxmint' do
86
+ let(:os) { mock_platform('linuxmint') }
87
+ it { os.redhat?.must_equal(false) }
88
+ it { os.debian?.must_equal(true) }
89
+ it { os.suse?.must_equal(false) }
90
+ it { os.linux?.must_equal(true) }
91
+ it { os.unix?.must_equal(true) }
92
+ end
93
+
94
+ describe 'with platform set to raspbian' do
95
+ let(:os) { mock_platform('raspbian') }
96
+ it { os.redhat?.must_equal(false) }
97
+ it { os.debian?.must_equal(true) }
98
+ it { os.suse?.must_equal(false) }
99
+ it { os.linux?.must_equal(true) }
100
+ it { os.unix?.must_equal(true) }
101
+ end
102
+
103
+ describe 'with platform set to suse' do
104
+ let(:os) { mock_platform('suse') }
105
+ it { os.redhat?.must_equal(false) }
106
+ it { os.debian?.must_equal(false) }
107
+ it { os.suse?.must_equal(true) }
108
+ it { os.linux?.must_equal(true) }
109
+ it { os.unix?.must_equal(true) }
110
+ end
111
+
112
+ describe 'with platform set to opensuse' do
113
+ let(:os) { mock_platform('opensuse') }
114
+ it { os.redhat?.must_equal(false) }
115
+ it { os.debian?.must_equal(false) }
116
+ it { os.suse?.must_equal(true) }
117
+ it { os.linux?.must_equal(true) }
118
+ it { os.unix?.must_equal(true) }
119
+ end
120
+
121
+ describe 'with platform set to alpine' do
122
+ let(:os) { mock_platform('alpine') }
123
+ it { os.redhat?.must_equal(false) }
124
+ it { os.debian?.must_equal(false) }
125
+ it { os.suse?.must_equal(false) }
126
+ it { os.linux?.must_equal(true) }
127
+ it { os.unix?.must_equal(true) }
128
+ end
129
+
130
+ describe 'with platform set to arch' do
131
+ let(:os) { mock_platform('arch') }
132
+ it { os.redhat?.must_equal(false) }
133
+ it { os.debian?.must_equal(false) }
134
+ it { os.suse?.must_equal(false) }
135
+ it { os.linux?.must_equal(true) }
136
+ it { os.unix?.must_equal(true) }
137
+ end
138
+
139
+ describe 'with platform set to coreos' do
140
+ let(:os) { mock_platform('coreos') }
141
+ it { os.redhat?.must_equal(false) }
142
+ it { os.debian?.must_equal(false) }
143
+ it { os.suse?.must_equal(false) }
144
+ it { os.linux?.must_equal(true) }
145
+ it { os.unix?.must_equal(true) }
146
+ end
147
+
148
+ describe 'with platform set to exherbo' do
149
+ let(:os) { mock_platform('exherbo') }
150
+ it { os.redhat?.must_equal(false) }
151
+ it { os.debian?.must_equal(false) }
152
+ it { os.suse?.must_equal(false) }
153
+ it { os.linux?.must_equal(true) }
154
+ it { os.unix?.must_equal(true) }
155
+ end
156
+
157
+ describe 'with platform set to gentoo' do
158
+ let(:os) { mock_platform('gentoo') }
159
+ it { os.redhat?.must_equal(false) }
160
+ it { os.debian?.must_equal(false) }
161
+ it { os.suse?.must_equal(false) }
162
+ it { os.linux?.must_equal(true) }
163
+ it { os.unix?.must_equal(true) }
164
+ end
165
+
166
+ describe 'with platform set to slackware' do
167
+ let(:os) { mock_platform('slackware') }
168
+ it { os.redhat?.must_equal(false) }
169
+ it { os.debian?.must_equal(false) }
170
+ it { os.suse?.must_equal(false) }
171
+ it { os.linux?.must_equal(true) }
172
+ it { os.unix?.must_equal(true) }
173
+ end
174
+
175
+ describe 'with platform set to linux' do
176
+ let(:os) { mock_platform('linux') }
177
+ it { os.linux?.must_equal(true) }
178
+ it { os.unix?.must_equal(true) }
179
+ end
180
+
181
+ describe 'with platform set to freebsd' do
182
+ let(:os) { mock_platform('freebsd') }
183
+ it { os.bsd?.must_equal(true) }
184
+ it { os.linux?.must_equal(false) }
185
+ it { os.unix?.must_equal(true) }
186
+ end
187
+
188
+ describe 'with platform set to netbsd' do
189
+ let(:os) { mock_platform('netbsd') }
190
+ it { os.bsd?.must_equal(true) }
191
+ it { os.linux?.must_equal(false) }
192
+ it { os.unix?.must_equal(true) }
193
+ end
194
+
195
+ describe 'with platform set to openbsd' do
196
+ let(:os) { mock_platform('openbsd') }
197
+ it { os.bsd?.must_equal(true) }
198
+ it { os.linux?.must_equal(false) }
199
+ it { os.unix?.must_equal(true) }
200
+ end
201
+
202
+ describe 'with platform set to darwin' do
203
+ let(:os) { mock_platform('darwin') }
204
+ it { os.bsd?.must_equal(true) }
205
+ it { os.linux?.must_equal(false) }
206
+ it { os.unix?.must_equal(true) }
207
+ end
208
+
209
+ describe 'with platform set to solaris' do
210
+ let(:os) { mock_platform('solaris') }
211
+ it { os.solaris?.must_equal(true) }
212
+ it { os.linux?.must_equal(false) }
213
+ it { os.unix?.must_equal(true) }
214
+ end
215
+
216
+ describe 'with platform set to smartos' do
217
+ let(:os) { mock_platform('smartos') }
218
+ it { os.solaris?.must_equal(true) }
219
+ it { os.linux?.must_equal(false) }
220
+ it { os.unix?.must_equal(true) }
221
+ end
222
+
223
+ describe 'with platform set to openindiana' do
224
+ let(:os) { mock_platform('openindiana') }
225
+ it { os.solaris?.must_equal(true) }
226
+ it { os.linux?.must_equal(false) }
227
+ it { os.unix?.must_equal(true) }
228
+ end
229
+
230
+ describe 'with platform set to opensolaris' do
231
+ let(:os) { mock_platform('opensolaris') }
232
+ it { os.solaris?.must_equal(true) }
233
+ it { os.linux?.must_equal(false) }
234
+ it { os.unix?.must_equal(true) }
235
+ end
236
+
237
+ describe 'with platform set to solaris2' do
238
+ let(:os) { mock_platform('solaris2') }
239
+ it { os.solaris?.must_equal(true) }
240
+ it { os.linux?.must_equal(false) }
241
+ it { os.unix?.must_equal(true) }
242
+ end
243
+
244
+ describe 'with platform set to nexentacore' do
245
+ let(:os) { mock_platform('nexentacore') }
246
+ it { os.solaris?.must_equal(true) }
247
+ it { os.linux?.must_equal(false) }
248
+ it { os.unix?.must_equal(true) }
249
+ end
250
+
251
+ describe 'with platform set to windows' do
252
+ let(:os) { mock_platform('windows') }
253
+ it { os.solaris?.must_equal(false) }
254
+ it { os.bsd?.must_equal(false) }
255
+ it { os.linux?.must_equal(false) }
256
+ it { os.unix?.must_equal(false) }
257
+ end
258
+ end
@@ -0,0 +1,105 @@
1
+ # encoding: utf-8
2
+ require 'helper'
3
+ require 'train/extras'
4
+
5
+ describe 'stat' do
6
+ let(:cls) { Train::Extras::Stat }
7
+
8
+ describe 'find_type' do
9
+ let (:random_mode) { (rand * 1000).to_i }
10
+
11
+ it 'detects :unknown types' do
12
+ cls.find_type(random_mode).must_equal :unknown
13
+ end
14
+
15
+ it 'detects sockets' do
16
+ cls.find_type(00140755).must_equal :socket
17
+ end
18
+
19
+ it 'detects sockets' do
20
+ cls.find_type(00120755).must_equal :symlink
21
+ end
22
+
23
+ it 'detects sockets' do
24
+ cls.find_type(00100755).must_equal :file
25
+ end
26
+
27
+ it 'detects sockets' do
28
+ cls.find_type(00060755).must_equal :block_device
29
+ end
30
+
31
+ it 'detects sockets' do
32
+ cls.find_type(00040755).must_equal :directory
33
+ end
34
+
35
+ it 'detects sockets' do
36
+ cls.find_type(00020755).must_equal :character_device
37
+ end
38
+
39
+ it 'detects sockets' do
40
+ cls.find_type(00010755).must_equal :pipe
41
+ end
42
+ end
43
+
44
+ describe 'linux stat' do
45
+ let(:backend) { Minitest::Mock.new }
46
+
47
+ it 'ignores wrong stat results' do
48
+ res = Minitest::Mock.new
49
+ res.expect :stdout, ''
50
+ backend.expect :run_command, res, [String]
51
+ cls.linux_stat('/path', backend).must_equal({})
52
+ end
53
+
54
+ it 'reads correct stat results' do
55
+ res = Minitest::Mock.new
56
+ res.expect :stdout, "360\n43ff\nroot\n0\nroot\n0\n1444520846\n1444522445\n?"
57
+ backend.expect :run_command, res, [String]
58
+ cls.linux_stat('/path', backend).must_equal({
59
+ type: :directory,
60
+ mode: 00777,
61
+ owner: 'root',
62
+ group: 'root',
63
+ mtime: 1444522445,
64
+ size: 360,
65
+ selinux_label: nil,
66
+ })
67
+ end
68
+ end
69
+
70
+ describe 'bsd stat' do
71
+ let(:backend) { Minitest::Mock.new }
72
+
73
+ it 'ignores failed stat results' do
74
+ res = Minitest::Mock.new
75
+ res.expect :stdout, '.....'
76
+ res.expect :exit_status, 1
77
+ backend.expect :run_command, res, [String]
78
+ cls.bsd_stat('/path', backend).must_equal({})
79
+ end
80
+
81
+ it 'ignores wrong stat results' do
82
+ res = Minitest::Mock.new
83
+ res.expect :stdout, ''
84
+ res.expect :exit_status, 0
85
+ backend.expect :run_command, res, [String]
86
+ cls.bsd_stat('/path', backend).must_equal({})
87
+ end
88
+
89
+ it 'reads correct stat results' do
90
+ res = Minitest::Mock.new
91
+ res.expect :stdout, "360\n41777\nroot\n0\nroot\n0\n1444520846\n1444522445"
92
+ res.expect :exit_status, 0
93
+ backend.expect :run_command, res, [String]
94
+ cls.bsd_stat('/path', backend).must_equal({
95
+ type: :directory,
96
+ mode: 00777,
97
+ owner: 'root',
98
+ group: 'root',
99
+ mtime: 1444522445,
100
+ size: 360,
101
+ selinux_label: nil,
102
+ })
103
+ end
104
+ end
105
+ end