train 0.29.2 → 0.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -2
  3. data/lib/train.rb +1 -0
  4. data/lib/train/errors.rb +6 -0
  5. data/lib/train/extras.rb +0 -1
  6. data/lib/train/platforms.rb +82 -0
  7. data/lib/train/platforms/common.rb +34 -0
  8. data/lib/train/platforms/detect.rb +12 -0
  9. data/lib/train/platforms/detect/helpers/os_common.rb +56 -0
  10. data/lib/train/platforms/detect/helpers/os_linux.rb +75 -0
  11. data/lib/train/{extras/os_detect_windows.rb → platforms/detect/helpers/os_windows.rb} +3 -10
  12. data/lib/train/platforms/detect/scanner.rb +84 -0
  13. data/lib/train/platforms/detect/specifications/os.rb +480 -0
  14. data/lib/train/platforms/family.rb +26 -0
  15. data/lib/train/platforms/platform.rb +80 -0
  16. data/lib/train/plugins/base_connection.rb +75 -27
  17. data/lib/train/transports/docker.rb +17 -28
  18. data/lib/train/transports/local.rb +21 -22
  19. data/lib/train/transports/mock.rb +44 -30
  20. data/lib/train/transports/ssh_connection.rb +55 -67
  21. data/lib/train/transports/winrm_connection.rb +16 -26
  22. data/lib/train/version.rb +1 -1
  23. data/test/unit/file/remote/linux_test.rb +2 -2
  24. data/test/unit/platforms/detect/os_common_test.rb +85 -0
  25. data/test/unit/platforms/detect/os_linux_test.rb +124 -0
  26. data/test/unit/{extras/os_detect_windows_test.rb → platforms/detect/os_windows_test.rb} +5 -2
  27. data/test/unit/platforms/detect/scanner_test.rb +61 -0
  28. data/test/unit/platforms/family_test.rb +32 -0
  29. data/test/unit/platforms/os_detect_test.rb +175 -0
  30. data/test/unit/{extras/os_common_test.rb → platforms/platform_test.rb} +103 -18
  31. data/test/unit/platforms/platforms_test.rb +42 -0
  32. data/test/unit/plugins/connection_test.rb +106 -8
  33. data/test/unit/transports/local_test.rb +20 -15
  34. data/test/unit/transports/mock_test.rb +16 -6
  35. data/test/unit/transports/ssh_test.rb +17 -15
  36. metadata +28 -19
  37. data/lib/train/extras/linux_lsb.rb +0 -60
  38. data/lib/train/extras/os_common.rb +0 -151
  39. data/lib/train/extras/os_detect_arista_eos.rb +0 -34
  40. data/lib/train/extras/os_detect_darwin.rb +0 -40
  41. data/lib/train/extras/os_detect_esx.rb +0 -22
  42. data/lib/train/extras/os_detect_linux.rb +0 -164
  43. data/lib/train/extras/os_detect_openvms.rb +0 -29
  44. data/lib/train/extras/os_detect_unix.rb +0 -106
  45. data/lib/train/extras/uname.rb +0 -28
  46. data/lib/train/transports/local_os.rb +0 -51
  47. data/test/unit/extras/os_detect_linux_test.rb +0 -230
@@ -1,28 +0,0 @@
1
- # encoding: utf-8
2
- # author: Dominik Richter
3
- # author: Christoph Hartmann
4
- #
5
- # This is heavily based on:
6
- #
7
- # OHAI https://github.com/chef/ohai
8
- # by Adam Jacob, Chef Software Inc
9
- #
10
- module Train::Extras
11
- module Uname
12
- def uname_s
13
- @uname_s ||= backend.run_command('uname -s').stdout
14
- end
15
-
16
- def uname_r
17
- @uname_r ||= begin
18
- res = backend.run_command('uname -r').stdout
19
- res.strip! unless res.nil?
20
- res
21
- end
22
- end
23
-
24
- def uname_m
25
- @uname_m ||= backend.run_command('uname -m').stdout.chomp
26
- end
27
- end
28
- end
@@ -1,51 +0,0 @@
1
- # encoding: utf-8
2
- # author: Dominik Richter
3
- # author: Christoph Hartmann
4
- #
5
- # This is heavily based on:
6
- #
7
- # OHAI https://github.com/chef/ohai
8
- # by Adam Jacob, Chef Software Inc
9
- #
10
-
11
- require 'rbconfig'
12
-
13
- class Train::Transports::Local
14
- class OS < OSCommon
15
- def initialize(backend)
16
- super(backend, { family: detect_local_os })
17
- end
18
-
19
- private
20
-
21
- def detect_local_os
22
- case ::RbConfig::CONFIG['host_os']
23
- when /aix(.+)$/
24
- return 'aix'
25
- when /darwin(.+)$/
26
- return 'darwin'
27
- when /hpux(.+)$/
28
- return 'hpux'
29
- when /linux/
30
- return 'linux'
31
- when /freebsd(.+)$/
32
- return 'freebsd'
33
- when /openbsd(.+)$/
34
- return 'openbsd'
35
- when /netbsd(.*)$/
36
- return 'netbsd'
37
- when /solaris2/
38
- return 'solaris2'
39
- when /mswin|mingw32|windows/
40
- # After long discussion in IRC the "powers that be" have come to a consensus
41
- # that no Windows platform exists that was not based on the
42
- # Windows_NT kernel, so we herby decree that "windows" will refer to all
43
- # platforms built upon the Windows_NT kernel and have access to win32 or win64
44
- # subsystems.
45
- return 'windows'
46
- else
47
- return ::RbConfig::CONFIG['host_os']
48
- end
49
- end
50
- end
51
- end
@@ -1,230 +0,0 @@
1
- # encoding: utf-8
2
- require 'helper'
3
- require 'train/extras'
4
-
5
- class OsDetectLinuxTester
6
- attr_reader :platform
7
- include Train::Extras::DetectLinux
8
-
9
- def initialize
10
- @platform = {}
11
- end
12
- end
13
-
14
- describe 'os_detect_linux' do
15
- let(:detector) { OsDetectLinuxTester.new }
16
-
17
- describe '#detect_linux_arch' do
18
- it "sets the arch using uname" do
19
- be = mock("Backend")
20
- detector.stubs(:backend).returns(be)
21
- be.stubs(:run_command).with("uname -m").returns(mock("Output", stdout: "x86_64\n"))
22
- detector.detect_linux_arch
23
- detector.platform[:arch].must_equal("x86_64")
24
- end
25
- end
26
-
27
- describe '#detect_linux_via_config' do
28
-
29
- before do
30
- detector.stubs(:get_config)
31
- detector.stubs(:fetch_os_release)
32
- detector.stubs(:redhatish_version).returns('redhat-version')
33
- end
34
-
35
- describe '/etc/enterprise-release' do
36
- it 'sets the correct family/release for oracle' do
37
- detector.stubs(:get_config).with('/etc/enterprise-release').returns('data')
38
-
39
- detector.detect_linux_via_config.must_equal(true)
40
- detector.platform[:name].must_equal('oracle')
41
- detector.platform[:family].must_equal('redhat')
42
- detector.platform[:release].must_equal('redhat-version')
43
- end
44
- end
45
-
46
- describe "/etc/redhat-release" do
47
- describe "and /etc/os-release" do
48
- it "sets the correct family, name, and release on centos" do
49
- detector.stubs(:get_config).with("/etc/redhat-release").returns("CentOS Linux release 7.2.1511 (Core) \n")
50
- detector.stubs(:get_config).with("/etc/os-release").returns("NAME=\"CentOS Linux\"\nVERSION=\"7 (Core)\"\nID=\"centos\"\nID_LIKE=\"rhel fedora\"\n")
51
- detector.detect_linux_via_config.must_equal(true)
52
- detector.platform[:name].must_equal('centos')
53
- detector.platform[:family].must_equal('redhat')
54
- detector.platform[:release].must_equal('redhat-version')
55
- end
56
- end
57
- end
58
-
59
- describe '/etc/debian_version' do
60
-
61
- before { detector.stubs(:get_config).with('/etc/debian_version').returns('deb-version') }
62
-
63
- describe 'ubuntu' do
64
- it 'sets the correct family/release for ubuntu' do
65
- detector.stubs(:lsb).returns({ id: 'ubuntu', release: 'ubuntu-release' })
66
-
67
- detector.detect_linux_via_config.must_equal(true)
68
- detector.platform[:name].must_equal('ubuntu')
69
- detector.platform[:family].must_equal('debian')
70
- detector.platform[:release].must_equal('ubuntu-release')
71
- end
72
- end
73
-
74
- describe 'linuxmint' do
75
- it 'sets the correct family/release for ubuntu' do
76
- detector.stubs(:lsb).returns({ id: 'linuxmint', release: 'mint-release' })
77
-
78
- detector.detect_linux_via_config.must_equal(true)
79
- detector.platform[:name].must_equal('linuxmint')
80
- detector.platform[:family].must_equal('debian')
81
- detector.platform[:release].must_equal('mint-release')
82
- end
83
- end
84
-
85
- describe 'raspbian' do
86
- it 'sets the correct family/release for raspbian ' do
87
- detector.stubs(:lsb).returns({ id: 'something_else', release: 'some_release' })
88
- detector.expects(:unix_file?).with('/usr/bin/raspi-config').returns(true)
89
-
90
- detector.detect_linux_via_config.must_equal(true)
91
- detector.platform[:name].must_equal('raspbian')
92
- detector.platform[:family].must_equal('debian')
93
- detector.platform[:release].must_equal('deb-version')
94
- end
95
- end
96
-
97
- describe 'everything else' do
98
- it 'sets the correct family/release for debian ' do
99
- detector.stubs(:lsb).returns({ id: 'something_else', release: 'some_release' })
100
- detector.expects(:unix_file?).with('/usr/bin/raspi-config').returns(false)
101
-
102
- detector.detect_linux_via_config.must_equal(true)
103
- detector.platform[:name].must_equal('debian')
104
- detector.platform[:family].must_equal('debian')
105
- detector.platform[:release].must_equal('deb-version')
106
- end
107
- end
108
- end
109
-
110
- describe '/etc/coreos/update.conf' do
111
- it 'sets the correct family/release for coreos' do
112
- detector.stubs(:get_config).with('/etc/coreos/update.conf').returns('data')
113
- detector.stubs(:lsb).returns({ id: 'Container Linux by CoreOS', release: 'coreos-version' })
114
-
115
- detector.detect_linux_via_config.must_equal(true)
116
- detector.platform[:name].must_equal('coreos')
117
- detector.platform[:family].must_equal('coreos')
118
- detector.platform[:release].must_equal('coreos-version')
119
- end
120
- end
121
-
122
- describe '/etc/os-release' do
123
- describe 'when not on a wrlinux build' do
124
- it 'does not set a platform family/release' do
125
- detector.stubs(:fetch_os_release).returns({ 'ID_LIKE' => 'something_else' })
126
-
127
- detector.detect_linux_via_config.must_equal(false)
128
- detector.platform[:family].must_be_nil
129
- detector.platform[:release].must_be_nil
130
- end
131
- end
132
-
133
- describe 'when on a wrlinux build' do
134
- let(:data) do
135
- {
136
- 'ID_LIKE' => 'cisco-wrlinux',
137
- 'VERSION' => 'cisco123'
138
- }
139
- end
140
-
141
- it 'sets the correct family/release for wrlinux' do
142
- detector.stubs(:fetch_os_release).returns(data)
143
-
144
- detector.detect_linux_via_config.must_equal(true)
145
- detector.platform[:name].must_equal('wrlinux')
146
- detector.platform[:family].must_equal('redhat')
147
- detector.platform[:release].must_equal('cisco123')
148
- end
149
- end
150
- end
151
- end
152
-
153
- describe '#fetch_os_release' do
154
- describe 'when no os-release data is available' do
155
- it 'returns nil' do
156
- detector.expects(:get_config).with('/etc/os-release').returns(nil)
157
- detector.fetch_os_release.must_be_nil
158
- end
159
- end
160
-
161
- describe 'when os-release data exists with no CISCO_RELEASE_INFO' do
162
- let(:os_release) { { 'KEY1' => 'VALUE1' } }
163
-
164
- it 'returns a correct hash' do
165
- detector.expects(:get_config).with('/etc/os-release').returns('os-release data')
166
- detector.expects(:parse_os_release_info).with('os-release data').returns(os_release)
167
- detector.fetch_os_release['KEY1'].must_equal('VALUE1')
168
- end
169
- end
170
-
171
- describe 'when os-release data exists with CISCO_RELEASE_INFO' do
172
- let(:os_release) { { 'KEY1' => 'VALUE1', 'CISCO_RELEASE_INFO' => 'cisco_file' } }
173
- let(:cisco_release) { { 'KEY1' => 'NEWVALUE1', 'KEY2' => 'VALUE2' } }
174
-
175
- it 'returns a correct hash' do
176
- detector.expects(:get_config).with('/etc/os-release').returns('os-release data')
177
- detector.expects(:get_config).with('cisco_file').returns('cisco data')
178
- detector.expects(:parse_os_release_info).with('os-release data').returns(os_release)
179
- detector.expects(:parse_os_release_info).with('cisco data').returns(cisco_release)
180
-
181
- os_info = detector.fetch_os_release
182
- os_info['KEY1'].must_equal('NEWVALUE1')
183
- os_info['KEY2'].must_equal('VALUE2')
184
- end
185
- end
186
- end
187
-
188
- describe '#parse_os_release_info' do
189
- describe 'when nil is supplied' do
190
- it 'returns an empty hash' do
191
- detector.parse_os_release_info(nil).must_equal({})
192
- end
193
- end
194
-
195
- describe 'when unexpectedly-formatted data is supplied' do
196
- let(:data) do
197
- <<-EOL
198
- blah blah
199
- no good data here
200
- EOL
201
- end
202
-
203
- it 'returns an empty hash' do
204
- detector.parse_os_release_info(nil).must_equal({})
205
- end
206
- end
207
-
208
- describe 'when properly-formatted data is supplied' do
209
- let(:data) do
210
- <<-EOL
211
- KEY1=value1
212
- KEY2=
213
- KEY3=value3
214
- KEY4="value4 with spaces"
215
- KEY5="value5 with a = sign"
216
- EOL
217
- end
218
-
219
- it 'parses the data correctly' do
220
- parsed_data = detector.parse_os_release_info(data)
221
-
222
- parsed_data['KEY1'].must_equal('value1')
223
- parsed_data.key?('KEY2').must_equal(false)
224
- parsed_data['KEY3'].must_equal('value3')
225
- parsed_data['KEY4'].must_equal('value4 with spaces')
226
- parsed_data['KEY5'].must_equal('value5 with a = sign')
227
- end
228
- end
229
- end
230
- end