train 1.4.21 → 1.4.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -8
- data/README.md +16 -1
- data/lib/train/platforms/detect/specifications/api.rb +2 -0
- data/lib/train/transports/vmware.rb +190 -0
- data/lib/train/version.rb +1 -1
- data/test/unit/transports/vmware_test.rb +165 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 455f5a9ff1827140f4f890be1b536a30261120db86836ee266b15eb418fe2900
|
4
|
+
data.tar.gz: e4d8c9dba2799532849ed9699cf11e813ec44669abc519f5e52de9ec9c5bd507
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8403b5941b3596a6aff77c830332e21f4b9a878eeb65b39c84fc598467060dae99b69c7968f9697379534d2fd5867b990343783a971658b257a21110ceeca044
|
7
|
+
data.tar.gz: 0dd9693a229a54b80c6bdaf9fe91f9d80ef3809bd2d860f5fa77ca7438f349df3d6951a0516057672651942251fa1eea432570774172b2b9afe3b49f100b973b
|
data/CHANGELOG.md
CHANGED
@@ -1,19 +1,25 @@
|
|
1
|
-
<!-- latest_release 1.4.
|
2
|
-
## [v1.4.
|
1
|
+
<!-- latest_release 1.4.22 -->
|
2
|
+
## [v1.4.22](https://github.com/inspec/train/tree/v1.4.22) (2018-07-12)
|
3
3
|
|
4
4
|
#### Merged Pull Requests
|
5
|
-
-
|
5
|
+
- Add VMware transport [#321](https://github.com/inspec/train/pull/321) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
|
6
6
|
<!-- latest_release -->
|
7
7
|
|
8
|
-
<!-- release_rollup since=1.4.
|
9
|
-
### Changes since 1.4.
|
8
|
+
<!-- release_rollup since=1.4.21 -->
|
9
|
+
### Changes since 1.4.21 release
|
10
10
|
|
11
11
|
#### Merged Pull Requests
|
12
|
-
-
|
13
|
-
- Remove the delivery cookbook [#317](https://github.com/inspec/train/pull/317) ([tas50](https://github.com/tas50)) <!-- 1.4.20 -->
|
12
|
+
- Add VMware transport [#321](https://github.com/inspec/train/pull/321) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.4.22 -->
|
14
13
|
<!-- release_rollup -->
|
15
14
|
|
16
15
|
<!-- latest_stable_release -->
|
16
|
+
## [v1.4.21](https://github.com/inspec/train/tree/v1.4.21) (2018-07-05)
|
17
|
+
|
18
|
+
#### Merged Pull Requests
|
19
|
+
- Remove the delivery cookbook [#317](https://github.com/inspec/train/pull/317) ([tas50](https://github.com/tas50))
|
20
|
+
- Modify `WindowsPipeRunner` stderr to use String [#320](https://github.com/inspec/train/pull/320) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
|
21
|
+
<!-- latest_stable_release -->
|
22
|
+
|
17
23
|
## [v1.4.19](https://github.com/inspec/train/tree/v1.4.19) (2018-06-29)
|
18
24
|
|
19
25
|
#### Merged Pull Requests
|
@@ -21,7 +27,6 @@
|
|
21
27
|
- Adding proper bastion support [#310](https://github.com/inspec/train/pull/310) ([frezbo](https://github.com/frezbo))
|
22
28
|
- Remove github_changelog_generator [#313](https://github.com/inspec/train/pull/313) ([tas50](https://github.com/tas50))
|
23
29
|
- Remove the deploy config from Travis [#315](https://github.com/inspec/train/pull/315) ([tas50](https://github.com/tas50))
|
24
|
-
<!-- latest_stable_release -->
|
25
30
|
|
26
31
|
## [v1.4.15](https://github.com/inspec/train/tree/v1.4.15) (2018-06-14)
|
27
32
|
|
data/README.md
CHANGED
@@ -22,6 +22,7 @@ Train supports:
|
|
22
22
|
* Mock (for testing and debugging)
|
23
23
|
* AWS as an API
|
24
24
|
* Azure as an API
|
25
|
+
* VMware via PowerCLI
|
25
26
|
|
26
27
|
# Examples
|
27
28
|
|
@@ -79,6 +80,20 @@ require 'train'
|
|
79
80
|
train = Train.create('aws')
|
80
81
|
```
|
81
82
|
|
83
|
+
**VMware**
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
require 'train'
|
87
|
+
Train.create('vmware', viserver: '10.0.0.10', user: 'demouser', password: 'securepassword')
|
88
|
+
```
|
89
|
+
|
90
|
+
You may also use environment variables by setting `VISERVER`, `VISERVER__USERNAME`, and `VISERVER_PASSWORD`
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
require 'train'
|
94
|
+
Train.create('vmware')
|
95
|
+
```
|
96
|
+
|
82
97
|
## Configuration
|
83
98
|
|
84
99
|
To get a list of available options for a plugin:
|
@@ -151,7 +166,7 @@ bundle exec ruby -I .\test\windows\ .\test\windows\local_test.rb
|
|
151
166
|
|
152
167
|
Train is heavily based on the work of:
|
153
168
|
|
154
|
-
* [test-kitchen](https://github.com/test-kitchen/test-kitchen)
|
169
|
+
* [test-kitchen](https://github.com/test-kitchen/test-kitchen)
|
155
170
|
|
156
171
|
by [Fletcher Nichol](fnichol@nichol.ca)
|
157
172
|
and [a great community of contributors](https://github.com/test-kitchen/test-kitchen/graphs/contributors)
|
@@ -11,6 +11,8 @@ module Train::Platforms::Detect::Specifications
|
|
11
11
|
plat.name('aws').in_family('cloud')
|
12
12
|
plat.name('azure').in_family('cloud')
|
13
13
|
plat.name('gcp').in_family('cloud')
|
14
|
+
plat.name('vmware').in_family('cloud')
|
15
|
+
|
14
16
|
plat.family('iaas').in_family('api')
|
15
17
|
plat.name('oneview').in_family('iaas')
|
16
18
|
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'train/plugins'
|
3
|
+
require 'open3'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'json'
|
6
|
+
require 'mkmf'
|
7
|
+
|
8
|
+
module Train::Transports
|
9
|
+
class VMware < Train.plugin(1)
|
10
|
+
name 'vmware'
|
11
|
+
option :viserver, default: ENV['VISERVER']
|
12
|
+
option :username, default: ENV['VISERVER_USERNAME']
|
13
|
+
option :password, default: ENV['VISERVER_PASSWORD']
|
14
|
+
option :insecure, default: false
|
15
|
+
|
16
|
+
def connection(_ = nil)
|
17
|
+
@connection ||= Connection.new(@options)
|
18
|
+
end
|
19
|
+
|
20
|
+
class Connection < BaseConnection # rubocop:disable ClassLength
|
21
|
+
POWERSHELL_PROMPT_REGEX = /PS\s.*> $/
|
22
|
+
|
23
|
+
def initialize(options)
|
24
|
+
super(options)
|
25
|
+
|
26
|
+
options[:viserver] = options[:viserver] || options[:host]
|
27
|
+
options[:username] = options[:username] || options[:user]
|
28
|
+
|
29
|
+
@username = options[:username]
|
30
|
+
@viserver = options[:viserver]
|
31
|
+
@session = nil
|
32
|
+
@stdout_buffer = ''
|
33
|
+
@stderr_buffer = ''
|
34
|
+
|
35
|
+
@powershell_binary = detect_powershell_binary
|
36
|
+
|
37
|
+
if @powershell_binary == :powershell
|
38
|
+
require 'train/transports/local'
|
39
|
+
@powershell = Train::Transports::Local::Connection.new(options)
|
40
|
+
end
|
41
|
+
|
42
|
+
if options[:insecure] == true
|
43
|
+
run_command_via_connection('Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Scope Session -Confirm:$False')
|
44
|
+
end
|
45
|
+
|
46
|
+
@platform_details = {
|
47
|
+
release: "vmware-powercli-#{powercli_version}",
|
48
|
+
}
|
49
|
+
|
50
|
+
connect
|
51
|
+
end
|
52
|
+
|
53
|
+
def connect
|
54
|
+
login_command = "Connect-VIServer #{options[:viserver]} -User #{options[:username]} -Password #{options[:password]} | Out-Null"
|
55
|
+
result = run_command_via_connection(login_command)
|
56
|
+
|
57
|
+
if result.exit_status != 0
|
58
|
+
message = "Unable to connect to VIServer at #{options[:viserver]}. "
|
59
|
+
case result.stderr
|
60
|
+
when /Invalid server certificate/
|
61
|
+
message += 'Certification verification failed. Please use `--insecure` or set `Set-PowerCLIConfiguration -InvalidCertificateAction Ignore` in PowerShell'
|
62
|
+
when /incorrect user name or password/
|
63
|
+
message += 'Incorrect username or password'
|
64
|
+
else
|
65
|
+
message += result.stderr.gsub(/-Password .*\s/, '-Password REDACTED')
|
66
|
+
end
|
67
|
+
|
68
|
+
raise message
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def local?
|
73
|
+
true
|
74
|
+
end
|
75
|
+
|
76
|
+
def platform
|
77
|
+
direct_platform('vmware', @platform_details)
|
78
|
+
end
|
79
|
+
|
80
|
+
def run_command_via_connection(cmd)
|
81
|
+
if @powershell_binary == :pwsh
|
82
|
+
result = parse_pwsh_output(cmd)
|
83
|
+
|
84
|
+
# Attach exit status to result
|
85
|
+
exit_status = parse_pwsh_output('echo $?').stdout.chomp
|
86
|
+
result.exit_status = exit_status == 'True' ? 0 : 1
|
87
|
+
|
88
|
+
result
|
89
|
+
else
|
90
|
+
@powershell.run_command(cmd)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def unique_identifier
|
95
|
+
uuid_command = '(Get-VMHost | Get-View).hardware.systeminfo.uuid'
|
96
|
+
run_command_via_connection(uuid_command).stdout.chomp
|
97
|
+
end
|
98
|
+
|
99
|
+
def uri
|
100
|
+
"vmware://#{@username}@#{@viserver}"
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def detect_powershell_binary
|
106
|
+
if find_executable0('pwsh')
|
107
|
+
:pwsh
|
108
|
+
elsif find_executable0('powershell')
|
109
|
+
:powershell
|
110
|
+
else
|
111
|
+
raise 'Cannot find PowerShell binary, is `pwsh` installed?'
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Read from stdout pipe until prompt is received
|
116
|
+
def flush_stdout(pipe)
|
117
|
+
while @stdout_buffer !~ POWERSHELL_PROMPT_REGEX
|
118
|
+
@stdout_buffer += pipe.read_nonblock(1)
|
119
|
+
end
|
120
|
+
@stdout_buffer
|
121
|
+
rescue IO::EAGAINWaitReadable
|
122
|
+
# We cannot know when the stdout pipe is finished so we keep reading
|
123
|
+
retry
|
124
|
+
ensure
|
125
|
+
@stdout_buffer = ''
|
126
|
+
end
|
127
|
+
|
128
|
+
# This must be called after `flush_stdout` to ensure buffer is full
|
129
|
+
def flush_stderr(pipe)
|
130
|
+
loop do
|
131
|
+
@stderr_buffer += pipe.read_nonblock(1)
|
132
|
+
end
|
133
|
+
rescue IO::EAGAINWaitReadable
|
134
|
+
# If `flush_stderr` is ran after reading stdout we know that all of
|
135
|
+
# stderr is in the pipe. Thus, we can return the buffer once the pipe
|
136
|
+
# is unreadable.
|
137
|
+
@stderr_buffer
|
138
|
+
ensure
|
139
|
+
@stderr_buffer = ''
|
140
|
+
end
|
141
|
+
|
142
|
+
def parse_pwsh_output(cmd)
|
143
|
+
session.stdin.puts(cmd)
|
144
|
+
|
145
|
+
stdout = flush_stdout(session.stdout)
|
146
|
+
|
147
|
+
# Remove stdin from stdout (including trailing newline)
|
148
|
+
stdout.slice!(0, cmd.length+1)
|
149
|
+
|
150
|
+
# Remove prompt from stdout
|
151
|
+
stdout.gsub!(POWERSHELL_PROMPT_REGEX, '')
|
152
|
+
|
153
|
+
# Grab stderr
|
154
|
+
stderr = flush_stderr(session.stderr)
|
155
|
+
|
156
|
+
CommandResult.new(
|
157
|
+
stdout,
|
158
|
+
stderr,
|
159
|
+
nil # exit_status is attached in `run_command_via_connection`
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
def powercli_version
|
164
|
+
version_command = '[string](Get-Module -Name VMware.PowerCLI -ListAvailable | Select -ExpandProperty Version)'
|
165
|
+
result = run_command_via_connection(version_command)
|
166
|
+
if result.stdout.empty? || result.exit_status != 0
|
167
|
+
raise 'Unable to determine PowerCLI Module version, is it installed?'
|
168
|
+
end
|
169
|
+
|
170
|
+
result.stdout.chomp
|
171
|
+
end
|
172
|
+
|
173
|
+
def session
|
174
|
+
return @session unless @session.nil?
|
175
|
+
|
176
|
+
stdin, stdout, stderr = Open3.popen3('pwsh')
|
177
|
+
|
178
|
+
# Remove leading prompt and intro text
|
179
|
+
flush_stdout(stdout)
|
180
|
+
|
181
|
+
@session = OpenStruct.new
|
182
|
+
@session.stdin = stdin
|
183
|
+
@session.stdout = stdout
|
184
|
+
@session.stderr = stderr
|
185
|
+
|
186
|
+
@session
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
data/lib/train/version.rb
CHANGED
@@ -0,0 +1,165 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
describe 'Train::Transports::VMware::Connection' do
|
5
|
+
def add_stubs(stub_options)
|
6
|
+
Train::Transports::VMware::Connection.any_instance
|
7
|
+
.stubs(:detect_powershell_binary)
|
8
|
+
.returns(stub_options[:powershell_binary] || :pwsh)
|
9
|
+
Train::Transports::VMware::Connection.any_instance
|
10
|
+
.stubs(:powercli_version)
|
11
|
+
.returns('10.1.1.8827525')
|
12
|
+
Train::Transports::VMware::Connection.any_instance
|
13
|
+
.stubs(:run_command_via_connection)
|
14
|
+
.with('(Get-VMHost | Get-View).hardware.systeminfo.uuid')
|
15
|
+
.returns(stub_options[:mock_uuid_result] || nil)
|
16
|
+
if stub_options[:mock_connect_result]
|
17
|
+
Train::Transports::VMware::Connection.any_instance
|
18
|
+
.expects(:run_command_via_connection)
|
19
|
+
.with('Connect-VIServer 10.0.0.10 -User testuser -Password supersecurepassword | Out-Null')
|
20
|
+
.returns(stub_options[:mock_connect_result])
|
21
|
+
else
|
22
|
+
Train::Transports::VMware::Connection.any_instance
|
23
|
+
.stubs(:connect)
|
24
|
+
.returns(nil)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_transport(options = {})
|
29
|
+
ENV['VISERVER'] = '10.0.0.10'
|
30
|
+
ENV['VISERVER_USERNAME'] = 'testuser'
|
31
|
+
ENV['VISERVER_PASSWORD'] = 'supersecurepassword'
|
32
|
+
|
33
|
+
# Need to require this here as it captures the ENV variables on load
|
34
|
+
require 'train/transports/vmware'
|
35
|
+
add_stubs(options[:stub_options] || {})
|
36
|
+
Train::Transports::VMware.new(options[:transport_options])
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#initialize' do
|
40
|
+
it 'defaults to ENV options' do
|
41
|
+
options = create_transport.connection.instance_variable_get(:@options)
|
42
|
+
options[:viserver].must_equal '10.0.0.10'
|
43
|
+
options[:username].must_equal 'testuser'
|
44
|
+
options[:password].must_equal 'supersecurepassword'
|
45
|
+
options[:insecure].must_equal false
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'allows for overriding options' do
|
49
|
+
transport = create_transport(
|
50
|
+
transport_options: {
|
51
|
+
viserver: '10.1.1.1',
|
52
|
+
username: 'anotheruser',
|
53
|
+
password: 'notsecurepassword',
|
54
|
+
insecure: false,
|
55
|
+
}
|
56
|
+
)
|
57
|
+
options = transport.connection.instance_variable_get(:@options)
|
58
|
+
options[:viserver].must_equal '10.1.1.1'
|
59
|
+
options[:username].must_equal 'anotheruser'
|
60
|
+
options[:password].must_equal 'notsecurepassword'
|
61
|
+
options[:insecure].must_equal false
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'ignores certificate validation if --insecure is used' do
|
65
|
+
Train::Transports::VMware::Connection.any_instance
|
66
|
+
.expects(:run_command_via_connection)
|
67
|
+
.with('Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Scope Session -Confirm:$False')
|
68
|
+
.returns(nil)
|
69
|
+
transport = create_transport(transport_options: { insecure: true })
|
70
|
+
options = transport.connection.instance_variable_get(:@options)
|
71
|
+
options[:insecure].must_equal true
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'uses the Local connection when Windows PowerShell is found' do
|
75
|
+
require 'train/transports/local'
|
76
|
+
Train::Transports::Local::Connection.expects(:new)
|
77
|
+
create_transport(
|
78
|
+
stub_options: {
|
79
|
+
powershell_binary: :powershell
|
80
|
+
}
|
81
|
+
).connection
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#connect' do
|
86
|
+
def mock_connect_result(stderr, exit_status)
|
87
|
+
OpenStruct.new(stderr: stderr, exit_status: exit_status)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'raises certificate error when stderr matches regular expression' do
|
91
|
+
e = proc {
|
92
|
+
create_transport(
|
93
|
+
stub_options: {
|
94
|
+
mock_connect_result: mock_connect_result(
|
95
|
+
'Invalid server certificate', 1
|
96
|
+
)
|
97
|
+
}
|
98
|
+
).connection
|
99
|
+
}.must_raise(RuntimeError)
|
100
|
+
e.message.must_match /Unable to connect.*Please use `--insecure`/
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'raises auth error when stderr matches regular expression' do
|
104
|
+
e = proc {
|
105
|
+
create_transport(
|
106
|
+
stub_options: {
|
107
|
+
mock_connect_result: mock_connect_result(
|
108
|
+
'incorrect user name or password', 1
|
109
|
+
)
|
110
|
+
}
|
111
|
+
).connection
|
112
|
+
}.must_raise(RuntimeError)
|
113
|
+
e.message.must_match /Unable to connect.*Incorrect username/
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'redacts the password when an unspecified error is raised' do
|
117
|
+
e = proc {
|
118
|
+
create_transport(
|
119
|
+
stub_options: {
|
120
|
+
mock_connect_result: mock_connect_result(
|
121
|
+
'something unexpected -Password supersecret -AnotherOption', 1
|
122
|
+
)
|
123
|
+
}
|
124
|
+
).connection
|
125
|
+
}.must_raise(RuntimeError)
|
126
|
+
e.message.must_match /-Password REDACTED/
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#local' do
|
131
|
+
it 'returns true' do
|
132
|
+
create_transport.connection.local?.must_equal true
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe '#platform' do
|
137
|
+
it 'returns correct platform details' do
|
138
|
+
platform = create_transport.connection.platform
|
139
|
+
platform.clean_name.must_equal 'vmware'
|
140
|
+
platform.family_hierarchy.must_equal ['cloud', 'api']
|
141
|
+
platform.platform.must_equal(release: 'vmware-powercli-10.1.1.8827525')
|
142
|
+
platform.vmware?.must_equal true
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#unique_identifier' do
|
147
|
+
it 'returns the correct unique identifier' do
|
148
|
+
uuid = '1f261432-e23e-6911-841c-94c6911a02dd'
|
149
|
+
mock_uuid_result = OpenStruct.new(
|
150
|
+
stdout: uuid + "\n"
|
151
|
+
)
|
152
|
+
connection = create_transport(
|
153
|
+
stub_options: { mock_uuid_result: mock_uuid_result }
|
154
|
+
).connection
|
155
|
+
|
156
|
+
connection.unique_identifier.must_equal(uuid)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe '#uri' do
|
161
|
+
it 'returns the correct URI' do
|
162
|
+
create_transport.connection.uri.must_equal 'vmware://testuser@10.0.0.10'
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: train
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Richter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -271,6 +271,7 @@ files:
|
|
271
271
|
- lib/train/transports/mock.rb
|
272
272
|
- lib/train/transports/ssh.rb
|
273
273
|
- lib/train/transports/ssh_connection.rb
|
274
|
+
- lib/train/transports/vmware.rb
|
274
275
|
- lib/train/transports/winrm.rb
|
275
276
|
- lib/train/transports/winrm_connection.rb
|
276
277
|
- lib/train/version.rb
|
@@ -337,6 +338,7 @@ files:
|
|
337
338
|
- test/unit/transports/local_test.rb
|
338
339
|
- test/unit/transports/mock_test.rb
|
339
340
|
- test/unit/transports/ssh_test.rb
|
341
|
+
- test/unit/transports/vmware_test.rb
|
340
342
|
- test/unit/version_test.rb
|
341
343
|
- test/windows/local_test.rb
|
342
344
|
- test/windows/winrm_test.rb
|
@@ -429,6 +431,7 @@ test_files:
|
|
429
431
|
- test/unit/transports/local_test.rb
|
430
432
|
- test/unit/transports/mock_test.rb
|
431
433
|
- test/unit/transports/ssh_test.rb
|
434
|
+
- test/unit/transports/vmware_test.rb
|
432
435
|
- test/unit/version_test.rb
|
433
436
|
- test/windows/local_test.rb
|
434
437
|
- test/windows/winrm_test.rb
|