vagrant-vmware-esxi 1.5.0 → 1.5.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.
- checksums.yaml +4 -4
- data/ESXi_guestos_types.md +68 -0
- data/README.md +83 -67
- data/example_box/Vagrantfile +53 -41
- data/example_box/Vagrantfile-multimachine +10 -13
- data/lib/vagrant-vmware-esxi/action/boot.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/createvm.rb +83 -41
- data/lib/vagrant-vmware-esxi/action/destroy.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/esxi_password.rb +29 -28
- data/lib/vagrant-vmware-esxi/action/halt.rb +3 -4
- data/lib/vagrant-vmware-esxi/action/read_ssh_info.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/read_state.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/resume.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/set_network_ip.rb +8 -8
- data/lib/vagrant-vmware-esxi/action/snapshot_delete.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/snapshot_info.rb +3 -3
- data/lib/vagrant-vmware-esxi/action/snapshot_list.rb +1 -1
- data/lib/vagrant-vmware-esxi/action/snapshot_restore.rb +3 -3
- data/lib/vagrant-vmware-esxi/action/snapshot_save.rb +4 -5
- data/lib/vagrant-vmware-esxi/action/suspend.rb +3 -3
- data/lib/vagrant-vmware-esxi/config.rb +6 -0
- data/lib/vagrant-vmware-esxi/version.rb +2 -1
- data/vagrant-vmware-esxi.gemspec +1 -1
- metadata +3 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
#
|
2
|
+
# Multi machine, essential options Vagrant file example. (documentation removed)
|
3
3
|
#
|
4
4
|
|
5
5
|
nodes = [
|
@@ -7,7 +7,7 @@ nodes = [
|
|
7
7
|
{ hostname: 'VM-multi2', box: 'hashicorp/precise64' }
|
8
8
|
]
|
9
9
|
|
10
|
-
Vagrant.configure(
|
10
|
+
Vagrant.configure('2') do |config|
|
11
11
|
nodes.each do |node|
|
12
12
|
config.vm.define node[:hostname] do |node_config|
|
13
13
|
node_config.vm.hostname = node[:hostname]
|
@@ -20,17 +20,14 @@ Vagrant.configure("2") do |config|
|
|
20
20
|
#
|
21
21
|
# Provider settings
|
22
22
|
#
|
23
|
-
esxi.esxi_hostname =
|
24
|
-
esxi.esxi_username =
|
25
|
-
esxi.esxi_password =
|
23
|
+
esxi.esxi_hostname = 'esxi'
|
24
|
+
esxi.esxi_username = 'root'
|
25
|
+
esxi.esxi_password = 'file:'
|
26
26
|
#esxi.esxi_hostport = 22
|
27
|
-
#esxi.virtual_network =
|
28
|
-
#esxi.
|
29
|
-
#esxi.
|
30
|
-
#esxi.
|
31
|
-
#esxi.
|
32
|
-
#esxi.numvcpus = "2"
|
33
|
-
#esxi.resource_pool = "/Vagrant"
|
34
|
-
#esxi.allow_overwrite = 'True'
|
27
|
+
#esxi.virtual_network = 'vmnet_example'
|
28
|
+
#esxi.vm_disk_store = 'DS_001'
|
29
|
+
#esxi.memsize = '2048'
|
30
|
+
#esxi.numvcpus = '2'
|
31
|
+
#esxi.resource_pool = '/Vagrant'
|
35
32
|
end
|
36
33
|
end
|
@@ -34,7 +34,7 @@ module VagrantPlugins
|
|
34
34
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
35
35
|
message: 'Cannot boot in this state')
|
36
36
|
else
|
37
|
-
Net::SSH.start(
|
37
|
+
Net::SSH.start(config.esxi_hostname, config.esxi_username,
|
38
38
|
password: $esxi_password,
|
39
39
|
port: config.esxi_hostport,
|
40
40
|
keys: config.esxi_private_keys,
|
@@ -78,12 +78,13 @@ module VagrantPlugins
|
|
78
78
|
#
|
79
79
|
# Figure out DataStore
|
80
80
|
r = ssh.exec!(
|
81
|
-
'df | grep "^[VMFS|NFS]" |
|
82
|
-
'sed "s|.*/vmfs/volumes/||g"
|
81
|
+
'df 2>/dev/null| grep "^[VMFS|NFS].*/vmfs/volumes/" | '\
|
82
|
+
'sort -nk4 | sed "s|.*/vmfs/volumes/||g"')
|
83
83
|
|
84
84
|
availvolumes = r.split(/\n/)
|
85
|
-
if
|
86
|
-
|
85
|
+
if config.debug =~ %r{true}i
|
86
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
87
|
+
message: "Avail DS vols : #{availvolumes}")
|
87
88
|
end
|
88
89
|
if (r == '') || (r.exitstatus != 0)
|
89
90
|
raise Errors::ESXiError,
|
@@ -93,6 +94,10 @@ module VagrantPlugins
|
|
93
94
|
# Use least-used if vm_disk_store is not set (or not found)
|
94
95
|
if config.vm_disk_store.nil?
|
95
96
|
desired_ds = '--- Least Used ---'
|
97
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
98
|
+
message: 'WARNING : '\
|
99
|
+
"vm_disk_store not set, using "\
|
100
|
+
"\"--- Least Used ---\"")
|
96
101
|
else
|
97
102
|
desired_ds = config.vm_disk_store.to_s
|
98
103
|
end
|
@@ -122,8 +127,9 @@ module VagrantPlugins
|
|
122
127
|
'grep Portgroups | sed "s/^ Portgroups: //g" |'\
|
123
128
|
'sed "s/,./\n/g"')
|
124
129
|
availnetworks = r.split(/\n/)
|
125
|
-
if
|
126
|
-
|
130
|
+
if config.debug =~ %r{true}i
|
131
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
132
|
+
message: "Avail Networks : #{availnetworks}")
|
127
133
|
end
|
128
134
|
if (availnetworks == '') || (r.exitstatus != 0)
|
129
135
|
raise Errors::ESXiError,
|
@@ -131,30 +137,62 @@ module VagrantPlugins
|
|
131
137
|
"#{r.stderr}"
|
132
138
|
end
|
133
139
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
140
|
+
# How many vm.network are there?
|
141
|
+
vm_network_index = 0
|
142
|
+
env[:machine].config.vm.networks.each do |type, options|
|
143
|
+
# I only handle private and public networks
|
144
|
+
next if type != :private_network && type != :public_network
|
145
|
+
vm_network_index += 1
|
146
|
+
end
|
147
|
+
|
148
|
+
if config.debug =~ %r{true}i
|
138
149
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
150
|
+
message: "virtual_network : #{config.virtual_network}")
|
151
|
+
end
|
152
|
+
|
153
|
+
# If there is more vm.network than virtual_network's configured
|
154
|
+
# I need to add more virtual_networks. Setting each to ---NotSet---
|
155
|
+
# to give a warning below...
|
156
|
+
if vm_network_index >= config.virtual_network.count
|
157
|
+
config.virtual_network.count.upto(vm_network_index) do |index|
|
158
|
+
config.virtual_network << '--NotSet--'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Go through each virtual_network and make sure it's good. If not
|
163
|
+
# display a WARNING that we are choosing the first found.
|
164
|
+
@guestvm_network = []
|
165
|
+
networkID = 0
|
166
|
+
for aVirtNet in Array(config.virtual_network) do
|
167
|
+
if config.virtual_network == [''] ||
|
168
|
+
config.virtual_network[0] == '--NotSet--'
|
169
|
+
# First (and only ) interface is not configure or not set
|
170
|
+
@guestvm_network = [availnetworks.first]
|
171
|
+
config.virtual_network = [availnetworks.first]
|
172
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
173
|
+
message: 'WARNING : '\
|
174
|
+
"virtual_network[#{networkID}] not "\
|
175
|
+
"set, using #{availnetworks.first}")
|
176
|
+
elsif availnetworks.include? aVirtNet
|
177
|
+
# Network interface is good
|
178
|
+
@guestvm_network << aVirtNet
|
179
|
+
else
|
180
|
+
# Network interface is NOT good.
|
181
|
+
@guestvm_network[networkID] = availnetworks.first
|
182
|
+
config.virtual_network[networkID] = availnetworks.first
|
183
|
+
if aVirtNet == '--NotSet--'
|
184
|
+
aVirtNet_msg = "virtual_network[#{networkID}]"
|
147
185
|
else
|
148
|
-
|
149
|
-
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
150
|
-
message: 'WARNING : '\
|
151
|
-
"#{aVirtNet} not "\
|
152
|
-
"found, using #{availnetworks.first}")
|
153
|
-
end
|
154
|
-
networkID += 1
|
155
|
-
if networkID >= 4
|
156
|
-
break
|
186
|
+
aVirtNet_msg = aVirtNet
|
157
187
|
end
|
188
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
189
|
+
message: 'WARNING : '\
|
190
|
+
"#{aVirtNet_msg} not "\
|
191
|
+
"found, using #{availnetworks.first}")
|
192
|
+
end
|
193
|
+
networkID += 1
|
194
|
+
if networkID >= 4
|
195
|
+
break
|
158
196
|
end
|
159
197
|
end
|
160
198
|
end
|
@@ -231,8 +269,9 @@ module VagrantPlugins
|
|
231
269
|
netOpts = ""
|
232
270
|
networkID = 0
|
233
271
|
for element in @guestvm_network do
|
234
|
-
if
|
235
|
-
|
272
|
+
if config.debug =~ %r{true}i
|
273
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
274
|
+
message: "Network[#{networkID}] : #{element}")
|
236
275
|
end
|
237
276
|
new_vmx_contents << "ethernet#{networkID}.networkName = \"net#{networkID}\"\n"
|
238
277
|
new_vmx_contents << "ethernet#{networkID}.present = \"TRUE\"\n"
|
@@ -419,12 +458,13 @@ module VagrantPlugins
|
|
419
458
|
"#{$encoded_esxi_password}@#{config.esxi_hostname}"\
|
420
459
|
"#{resource_pool}"
|
421
460
|
|
422
|
-
#
|
423
|
-
|
461
|
+
#
|
462
|
+
# Security alert! If password debugging is enabled, Password will
|
463
|
+
# be exposed in log file.
|
464
|
+
if config.debug =~ %r{password}i
|
424
465
|
@logger.info("vagrant-vmware-esxi, createvm: ovf_cmd #{ovf_cmd}")
|
425
466
|
puts "ovftool command: #{ovf_cmd}"
|
426
|
-
|
427
|
-
if (config.debug =~ %r{true}i)
|
467
|
+
elsif config.debug =~ %r{true}i
|
428
468
|
ovf_cmd_nopw = ovf_cmd.gsub(/#{$encoded_esxi_password}/, '******')
|
429
469
|
puts "ovftool command: #{ovf_cmd_nopw}"
|
430
470
|
end
|
@@ -433,8 +473,9 @@ module VagrantPlugins
|
|
433
473
|
end
|
434
474
|
|
435
475
|
# VMX file is not needed any longer. Delete it
|
436
|
-
if
|
437
|
-
|
476
|
+
if config.debug =~ %r{true}i
|
477
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
478
|
+
message: "Keeping file : #{new_vmx_file}")
|
438
479
|
else
|
439
480
|
File.delete(new_vmx_file)
|
440
481
|
end
|
@@ -442,7 +483,7 @@ module VagrantPlugins
|
|
442
483
|
#
|
443
484
|
# Re-open the network connection to get VMID
|
444
485
|
#
|
445
|
-
Net::SSH.start(
|
486
|
+
Net::SSH.start(config.esxi_hostname, config.esxi_username,
|
446
487
|
password: $esxi_password,
|
447
488
|
port: config.esxi_hostport,
|
448
489
|
keys: config.esxi_private_keys,
|
@@ -461,7 +502,7 @@ module VagrantPlugins
|
|
461
502
|
|
462
503
|
env[:machine].id = vmid.to_i
|
463
504
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
464
|
-
message: "VMID: #{env[:machine].id}")
|
505
|
+
message: "VMID : #{env[:machine].id}")
|
465
506
|
|
466
507
|
#
|
467
508
|
# -=-=-=-=-=-=-
|
@@ -478,7 +519,7 @@ module VagrantPlugins
|
|
478
519
|
|
479
520
|
# Get vmx file in memory
|
480
521
|
esxi_orig_vmx_file = ssh.exec!("cat #{dst_vmx_file} 2>/dev/null")
|
481
|
-
if
|
522
|
+
if config.debug =~ %r{vmx}i
|
482
523
|
puts "orig vmx: #{esxi_orig_vmx_file}"
|
483
524
|
puts "\n\n"
|
484
525
|
end
|
@@ -597,7 +638,7 @@ module VagrantPlugins
|
|
597
638
|
|
598
639
|
# If there was changes, update esxi
|
599
640
|
if vmx_need_change_flag == true
|
600
|
-
if
|
641
|
+
if config.debug =~ %r{vmx}i
|
601
642
|
puts "new vmx: #{new_vmx_contents}"
|
602
643
|
puts "\n\n"
|
603
644
|
end
|
@@ -614,8 +655,9 @@ module VagrantPlugins
|
|
614
655
|
end
|
615
656
|
ssh.loop
|
616
657
|
else
|
617
|
-
if
|
618
|
-
|
658
|
+
if config.debug =~ %r{vmx}i
|
659
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
660
|
+
message: 'ESXi vmx file : Unmodified')
|
619
661
|
end
|
620
662
|
end
|
621
663
|
end
|
@@ -33,7 +33,7 @@ module VagrantPlugins
|
|
33
33
|
raise Errors::ESXiError,
|
34
34
|
message: 'Guest VM should have been powered off...'
|
35
35
|
else
|
36
|
-
Net::SSH.start(
|
36
|
+
Net::SSH.start(config.esxi_hostname, config.esxi_username,
|
37
37
|
password: $esxi_password,
|
38
38
|
port: config.esxi_hostport,
|
39
39
|
keys: config.esxi_private_keys,
|
@@ -8,7 +8,7 @@ module VagrantPlugins
|
|
8
8
|
# This action set the global variable esxi_password and attempt to
|
9
9
|
# login to the esxi server to verify connectivity.
|
10
10
|
class SetESXiPassword
|
11
|
-
def initialize(app,
|
11
|
+
def initialize(app, _env)
|
12
12
|
@app = app
|
13
13
|
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::set_esxi_password')
|
14
14
|
end
|
@@ -22,26 +22,25 @@ module VagrantPlugins
|
|
22
22
|
@logger.info('vagrant-vmware-esxi, set_esxi_password: start...')
|
23
23
|
|
24
24
|
# Get config.
|
25
|
-
machine = env[:machine]
|
26
25
|
config = env[:machine].provider_config
|
27
26
|
|
28
27
|
#
|
29
28
|
# Set global variable $esxi_password
|
30
29
|
#
|
31
30
|
if $esxi_password.nil?
|
32
|
-
if
|
31
|
+
if config.esxi_password =~ %r{^prompt:}i
|
33
32
|
#
|
34
33
|
# Prompt for password
|
35
34
|
#
|
36
35
|
begin
|
37
36
|
print "#{config.esxi_hostname} password:"
|
38
37
|
$esxi_password = STDIN.noecho(&:gets).chomp
|
39
|
-
puts
|
38
|
+
puts ''
|
40
39
|
rescue
|
41
40
|
raise Errors::ESXiError,
|
42
|
-
message:
|
41
|
+
message: 'Prompt for password error???'
|
43
42
|
end
|
44
|
-
elsif
|
43
|
+
elsif config.esxi_password =~ %r{^env:}i
|
45
44
|
#
|
46
45
|
# Get pw from environment variable
|
47
46
|
#
|
@@ -56,19 +55,19 @@ module VagrantPlugins
|
|
56
55
|
raise Errors::ESXiError,
|
57
56
|
message: "Unable to read environment variable: #{esxi_password_env}"
|
58
57
|
end
|
59
|
-
elsif
|
58
|
+
elsif config.esxi_password =~ %r{^file:}i
|
60
59
|
#
|
61
60
|
# Get password from file
|
62
61
|
#
|
63
62
|
esxi_password_file = config.esxi_password.gsub(/file:/i, '').chomp
|
64
|
-
if esxi_password_file.
|
63
|
+
if esxi_password_file.empty?
|
65
64
|
esxi_password_file = '~/.esxi_password'
|
66
65
|
end
|
67
66
|
esxi_password_file = File.expand_path(esxi_password_file)
|
68
67
|
# Get password from file
|
69
68
|
begin
|
70
69
|
if File.file?(esxi_password_file)
|
71
|
-
file_pw=
|
70
|
+
file_pw = ''
|
72
71
|
fh = File.open(File.expand_path(esxi_password_file))
|
73
72
|
file_pw = fh.readline
|
74
73
|
fh.close
|
@@ -79,13 +78,13 @@ module VagrantPlugins
|
|
79
78
|
rescue
|
80
79
|
raise Errors::ESXiError, message: "Unable to open #{esxi_password_file}"
|
81
80
|
end
|
82
|
-
elsif
|
81
|
+
elsif config.esxi_password =~ %r{^key:}i
|
83
82
|
#
|
84
83
|
# use ssh keys
|
85
84
|
#
|
86
|
-
$esxi_password =
|
85
|
+
$esxi_password = ''
|
87
86
|
esxi_password_key = config.esxi_password.gsub(/key:/i, '').chomp
|
88
|
-
if esxi_password_key.
|
87
|
+
if esxi_password_key.empty?
|
89
88
|
config.esxi_private_keys = config.system_private_keys_path
|
90
89
|
else
|
91
90
|
config.esxi_private_keys = esxi_password_key
|
@@ -99,11 +98,11 @@ module VagrantPlugins
|
|
99
98
|
#
|
100
99
|
# Encode special characters in PW
|
101
100
|
#
|
102
|
-
$encoded_esxi_password = $esxi_password.gsub('
|
101
|
+
$encoded_esxi_password = $esxi_password.gsub('%', '%25').gsub(\
|
103
102
|
'<', '%3c').gsub('>', '%3e').gsub(\
|
104
103
|
'[', '%5b').gsub(']', '%5d').gsub(\
|
105
104
|
'(', '%28').gsub(')', '%29').gsub(\
|
106
|
-
'
|
105
|
+
'@', '%40').gsub('#', '%23').gsub(\
|
107
106
|
'&', '%26').gsub(':', '%3a').gsub(\
|
108
107
|
'/', '%2f').gsub('\\','%5c').gsub(\
|
109
108
|
'"', '%22').gsub('\'','%27').gsub(\
|
@@ -117,7 +116,7 @@ module VagrantPlugins
|
|
117
116
|
# Test ESXi host connectivity
|
118
117
|
#
|
119
118
|
begin
|
120
|
-
Net::SSH.start(
|
119
|
+
Net::SSH.start(config.esxi_hostname, config.esxi_username,
|
121
120
|
password: $esxi_password,
|
122
121
|
port: config.esxi_hostport,
|
123
122
|
keys: config.esxi_private_keys,
|
@@ -126,31 +125,33 @@ module VagrantPlugins
|
|
126
125
|
non_interactive: true
|
127
126
|
) do |ssh|
|
128
127
|
|
129
|
-
esxi_version = ssh.exec!(
|
128
|
+
esxi_version = ssh.exec!('vmware -v')
|
130
129
|
ssh.close
|
131
130
|
|
132
131
|
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::set_esxi_password')
|
133
|
-
if
|
134
|
-
|
135
|
-
|
136
|
-
|
132
|
+
if (config.debug =~ %r{true}i) && $showVersionFlag.nil?
|
133
|
+
$showVersionFlag = true
|
134
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
135
|
+
message: "ESXi version : #{esxi_version}")
|
136
|
+
end
|
137
|
+
if esxi_version !~ %r{^vmware esxi}i
|
137
138
|
@logger.info('vagrant-vmware-esxi, set_esxi_password: '\
|
138
139
|
"ESXi version: #{esxi_version}")
|
139
140
|
raise Errors::ESXiError,
|
140
|
-
message:
|
141
|
+
message: 'Unable to connect to ESXi host!'
|
141
142
|
end
|
142
143
|
end
|
143
144
|
rescue
|
144
|
-
if
|
145
|
-
access_error_message =
|
146
|
-
elsif
|
145
|
+
if config.esxi_password =~ %r{^prompt:}i
|
146
|
+
access_error_message = 'Prompt for password'
|
147
|
+
elsif config.esxi_password =~ %r{^env:}i
|
147
148
|
access_error_message = "env:#{esxi_password_env}"
|
148
|
-
elsif
|
149
|
+
elsif config.esxi_password =~ %r{^file:}i
|
149
150
|
access_error_message = "file:#{esxi_password_file}"
|
150
|
-
elsif
|
151
|
+
elsif config.esxi_password =~ %r{^key:}i
|
151
152
|
access_error_message = "key:#{config.esxi_private_keys}"
|
152
153
|
else
|
153
|
-
access_error_message =
|
154
|
+
access_error_message = 'password in Vagrantfile'
|
154
155
|
end
|
155
156
|
|
156
157
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
@@ -160,7 +161,7 @@ module VagrantPlugins
|
|
160
161
|
"ESXi host access : #{access_error_message}")
|
161
162
|
|
162
163
|
raise Errors::ESXiError,
|
163
|
-
message:
|
164
|
+
message: 'Unable to connect to ESXi host!'
|
164
165
|
end
|
165
166
|
end
|
166
167
|
end
|
@@ -6,7 +6,7 @@ module VagrantPlugins
|
|
6
6
|
module Action
|
7
7
|
# This action will halt (power off) the VM
|
8
8
|
class Halt
|
9
|
-
def initialize(app,
|
9
|
+
def initialize(app, _env)
|
10
10
|
@app = app
|
11
11
|
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::halt')
|
12
12
|
end
|
@@ -28,7 +28,7 @@ module VagrantPlugins
|
|
28
28
|
elsif env[:machine_state].to_s == 'not_created'
|
29
29
|
env[:ui].info I18n.t('vagrant_vmware_esxi.already_destroyed')
|
30
30
|
else
|
31
|
-
Net::SSH.start(
|
31
|
+
Net::SSH.start(config.esxi_hostname, config.esxi_username,
|
32
32
|
password: $esxi_password,
|
33
33
|
port: config.esxi_hostport,
|
34
34
|
keys: config.esxi_private_keys,
|
@@ -41,8 +41,7 @@ module VagrantPlugins
|
|
41
41
|
|
42
42
|
if r.exitstatus != 0
|
43
43
|
raise Errors::ESXiError,
|
44
|
-
message: "Unable to power off the VM:\n"
|
45
|
-
" #{r}"
|
44
|
+
message: "Unable to power off the VM:\n #{r}"
|
46
45
|
end
|
47
46
|
env[:ui].info I18n.t('vagrant_vmware_esxi.states.powered_off.short')
|
48
47
|
end
|