vagrant-vmware-esxi 1.2.1 → 1.3.0
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/README.md +58 -29
- data/Rakefile +1 -1
- data/example_box/Vagrantfile +42 -17
- data/example_box/Vagrantfile-multimachine +1 -1
- data/lib/vagrant-vmware-esxi/action.rb +17 -7
- data/lib/vagrant-vmware-esxi/action/boot.rb +12 -11
- data/lib/vagrant-vmware-esxi/action/createvm.rb +38 -51
- data/lib/vagrant-vmware-esxi/action/destroy.rb +12 -11
- data/lib/vagrant-vmware-esxi/action/esxi_password.rb +176 -0
- data/lib/vagrant-vmware-esxi/action/halt.rb +13 -11
- data/lib/vagrant-vmware-esxi/action/package.rb +2 -3
- data/lib/vagrant-vmware-esxi/action/read_ssh_info.rb +13 -11
- data/lib/vagrant-vmware-esxi/action/read_state.rb +15 -13
- data/lib/vagrant-vmware-esxi/action/resume.rb +14 -10
- data/lib/vagrant-vmware-esxi/action/snapshot_delete.rb +14 -12
- data/lib/vagrant-vmware-esxi/action/snapshot_info.rb +13 -11
- data/lib/vagrant-vmware-esxi/action/snapshot_list.rb +13 -11
- data/lib/vagrant-vmware-esxi/action/snapshot_restore.rb +14 -12
- data/lib/vagrant-vmware-esxi/action/snapshot_save.rb +15 -12
- data/lib/vagrant-vmware-esxi/action/suspend.rb +14 -12
- data/lib/vagrant-vmware-esxi/action/wait_for_state.rb +0 -1
- data/lib/vagrant-vmware-esxi/cap/snapshot_list.rb +0 -1
- data/lib/vagrant-vmware-esxi/provider.rb +5 -1
- data/lib/vagrant-vmware-esxi/version.rb +1 -1
- data/vagrant-vmware-esxi.gemspec +1 -1
- metadata +5 -5
- data/lib/vagrant-vmware-esxi/action/connect_esxi.rb +0 -58
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ESXi
|
@@ -33,19 +33,20 @@ module VagrantPlugins
|
|
33
33
|
raise Errors::ESXiError,
|
34
34
|
message: 'Guest VM should have been powered off...'
|
35
35
|
else
|
36
|
-
Net::SSH
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
37
|
+
password: $esxi_password,
|
38
|
+
port: config.esxi_hostport,
|
39
|
+
keys: config.esxi_private_keys,
|
40
|
+
timeout: 10,
|
41
|
+
number_of_password_prompts: 0,
|
42
|
+
non_interactive: true
|
43
|
+
) do |ssh|
|
42
44
|
|
43
|
-
r = ssh
|
44
|
-
|
45
|
-
if r.exit_code != 0
|
45
|
+
r = ssh.exec!("vim-cmd vmsvc/destroy #{machine.id}")
|
46
|
+
if r.exitstatus != 0
|
46
47
|
raise Errors::ESXiError,
|
47
48
|
message => "Unable to destroy the VM:\n"\
|
48
|
-
" #{r
|
49
|
+
" #{r}"
|
49
50
|
end
|
50
51
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
51
52
|
message: 'VM has been destroyed...')
|
@@ -0,0 +1,176 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'net/ssh'
|
3
|
+
require 'io/console'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module ESXi
|
7
|
+
module Action
|
8
|
+
# This action set the global variable esxi_password and attempt to
|
9
|
+
# login to the esxi server to verify connectivity.
|
10
|
+
class SetESXiPassword
|
11
|
+
def initialize(app, env)
|
12
|
+
@app = app
|
13
|
+
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::set_esxi_password')
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
set_esxi_password(env)
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_esxi_password(env)
|
22
|
+
@logger.info('vagrant-vmware-esxi, set_esxi_password: start...')
|
23
|
+
|
24
|
+
# Get config.
|
25
|
+
machine = env[:machine]
|
26
|
+
config = env[:machine].provider_config
|
27
|
+
|
28
|
+
#
|
29
|
+
# Set global variable $esxi_password
|
30
|
+
#
|
31
|
+
if $esxi_password.nil?
|
32
|
+
if (config.debug =~ %r{password}i)
|
33
|
+
puts "$esxi_password is unset..."
|
34
|
+
end
|
35
|
+
if (config.esxi_password =~ %r{^prompt:}i)
|
36
|
+
#
|
37
|
+
# Prompt for password
|
38
|
+
#
|
39
|
+
begin
|
40
|
+
print "#{config.esxi_hostname} password:"
|
41
|
+
$esxi_password = STDIN.noecho(&:gets).chomp
|
42
|
+
puts ""
|
43
|
+
rescue
|
44
|
+
raise Errors::ESXiError,
|
45
|
+
message: "Prompt for password error???"
|
46
|
+
end
|
47
|
+
elsif (config.esxi_password =~ %r{^env:}i)
|
48
|
+
#
|
49
|
+
# Get pw from environment variable
|
50
|
+
#
|
51
|
+
esxi_password_env = config.esxi_password.gsub(/env:/i, '').chomp
|
52
|
+
if esxi_password_env.length < 1
|
53
|
+
esxi_password_env = 'esxi_password'
|
54
|
+
end
|
55
|
+
begin
|
56
|
+
stdin_pw = ENV[esxi_password_env]
|
57
|
+
$esxi_password = stdin_pw.chomp
|
58
|
+
rescue
|
59
|
+
raise Errors::ESXiError,
|
60
|
+
message: "Unable to read environment variable: #{esxi_password_env}"
|
61
|
+
end
|
62
|
+
elsif (config.esxi_password =~ %r{^file:}i)
|
63
|
+
#
|
64
|
+
# Get password from file
|
65
|
+
#
|
66
|
+
esxi_password_file = config.esxi_password.gsub(/file:/i, '').chomp
|
67
|
+
if esxi_password_file.length < 1
|
68
|
+
esxi_password_file = '~/.esxi_password'
|
69
|
+
end
|
70
|
+
esxi_password_file = File.expand_path(esxi_password_file)
|
71
|
+
# Get password from file
|
72
|
+
begin
|
73
|
+
if File.file?(esxi_password_file)
|
74
|
+
file_pw=""
|
75
|
+
fh = File.open(File.expand_path(esxi_password_file))
|
76
|
+
file_pw = fh.readline
|
77
|
+
fh.close
|
78
|
+
$esxi_password = file_pw.chomp
|
79
|
+
else
|
80
|
+
raise Errors::ESXiError, message: "Unable to open #{esxi_password_file}"
|
81
|
+
end
|
82
|
+
rescue
|
83
|
+
raise Errors::ESXiError, message: "Unable to open #{esxi_password_file}"
|
84
|
+
end
|
85
|
+
elsif (config.esxi_password =~ %r{^key:}i)
|
86
|
+
#
|
87
|
+
# use ssh keys
|
88
|
+
#
|
89
|
+
$esxi_password = ""
|
90
|
+
esxi_password_key = config.esxi_password.gsub(/key:/i, '').chomp
|
91
|
+
if esxi_password_key.length < 1
|
92
|
+
config.esxi_private_keys = config.system_private_keys_path
|
93
|
+
else
|
94
|
+
config.esxi_private_keys = esxi_password_key
|
95
|
+
end
|
96
|
+
else
|
97
|
+
# Use plain text password from config
|
98
|
+
$esxi_password = config.esxi_password
|
99
|
+
end
|
100
|
+
end
|
101
|
+
if (config.debug =~ %r{password}i)
|
102
|
+
puts "pw (set_esxi_password): #{$esxi_password}"
|
103
|
+
puts "esxi_private_keys: #{config.esxi_private_keys}"
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
#
|
108
|
+
# Encode special characters in PW
|
109
|
+
#
|
110
|
+
$encoded_esxi_password = $esxi_password.gsub('@', '%40').gsub(\
|
111
|
+
'<', '%3c').gsub('>', '%3e').gsub(\
|
112
|
+
'[', '%5b').gsub(']', '%5d').gsub(\
|
113
|
+
'(', '%28').gsub(')', '%29').gsub(\
|
114
|
+
'%', '%25').gsub('#', '%23').gsub(\
|
115
|
+
'&', '%26').gsub(':', '%3a').gsub(\
|
116
|
+
'/', '%2f').gsub('\\','%5c').gsub(\
|
117
|
+
'"', '%22').gsub('\'','%27').gsub(\
|
118
|
+
'*', '%2a').gsub('?', '%3f')
|
119
|
+
|
120
|
+
@logger.info('vagrant-vmware-esxi, connect_esxi: esxi_private_keys: '\
|
121
|
+
"#{config.esxi_private_keys}")
|
122
|
+
|
123
|
+
#
|
124
|
+
# Test ESXi host connectivity
|
125
|
+
#
|
126
|
+
begin
|
127
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
128
|
+
password: $esxi_password,
|
129
|
+
port: config.esxi_hostport,
|
130
|
+
keys: config.esxi_private_keys,
|
131
|
+
timeout: 10,
|
132
|
+
number_of_password_prompts: 0,
|
133
|
+
non_interactive: true
|
134
|
+
) do |ssh|
|
135
|
+
|
136
|
+
esxi_version = ssh.exec!("vmware -v")
|
137
|
+
ssh.close
|
138
|
+
|
139
|
+
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::set_esxi_password')
|
140
|
+
if esxi_version =~ %r{^vmware esxi}i
|
141
|
+
@logger.info('vagrant-vmware-esxi, set_esxi_password: '\
|
142
|
+
"ESXi version: #{esxi_version}")
|
143
|
+
else
|
144
|
+
@logger.info('vagrant-vmware-esxi, set_esxi_password: '\
|
145
|
+
"ESXi version: #{esxi_version}")
|
146
|
+
raise Errors::ESXiError,
|
147
|
+
message: "Unable to connect to ESXi host!"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
rescue
|
151
|
+
if (config.esxi_password =~ %r{^prompt:}i)
|
152
|
+
access_error_message = "Prompt for password"
|
153
|
+
elsif (config.esxi_password =~ %r{^env:}i)
|
154
|
+
access_error_message = "env:#{esxi_password_env}"
|
155
|
+
elsif (config.esxi_password =~ %r{^file:}i)
|
156
|
+
access_error_message = "file:#{esxi_password_file}"
|
157
|
+
elsif (config.esxi_password =~ %r{^key:}i)
|
158
|
+
access_error_message = "key:#{config.esxi_private_keys}"
|
159
|
+
else
|
160
|
+
access_error_message = "password in Vagrantfile"
|
161
|
+
end
|
162
|
+
|
163
|
+
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
164
|
+
message: "ESXi host access : #{access_error_message}")
|
165
|
+
|
166
|
+
@logger.info('vagrant-vmware-esxi, set_esxi_password: '\
|
167
|
+
"ESXi host access : #{access_error_message}")
|
168
|
+
|
169
|
+
raise Errors::ESXiError,
|
170
|
+
message: "Unable to connect to ESXi host!"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ESXi
|
@@ -28,19 +28,21 @@ 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
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
32
|
+
password: $esxi_password,
|
33
|
+
port: config.esxi_hostport,
|
34
|
+
keys: config.esxi_private_keys,
|
35
|
+
timeout: 10,
|
36
|
+
number_of_password_prompts: 0,
|
37
|
+
non_interactive: true
|
38
|
+
) do |ssh|
|
37
39
|
|
38
|
-
r = ssh
|
39
|
-
|
40
|
-
if r.
|
40
|
+
r = ssh.exec!("vim-cmd vmsvc/power.off #{machine.id}")
|
41
|
+
|
42
|
+
if r.exitstatus != 0
|
41
43
|
raise Errors::ESXiError,
|
42
44
|
message: "Unable to power off the VM:\n"
|
43
|
-
" #{r
|
45
|
+
" #{r}"
|
44
46
|
end
|
45
47
|
env[:ui].info I18n.t('vagrant_vmware_esxi.states.powered_off.short')
|
46
48
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh/simple'
|
3
2
|
require 'fileutils'
|
4
3
|
|
5
4
|
module VagrantPlugins
|
6
5
|
module ESXi
|
7
6
|
module Action
|
8
|
-
# This action will
|
7
|
+
# This action will package a VM.
|
9
8
|
class Package
|
10
9
|
def initialize(app, env)
|
11
10
|
@app = app
|
@@ -95,7 +94,7 @@ module VagrantPlugins
|
|
95
94
|
|
96
95
|
ovf_cmd = "ovftool --noSSLVerify -tt=VMX --name=\"#{boxname}\" "\
|
97
96
|
"#{overwrite_opts} vi://#{config.esxi_username}:"\
|
98
|
-
"#{
|
97
|
+
"#{$encoded_esxi_password}@#{config.esxi_hostname}"\
|
99
98
|
"?moref=vim.VirtualMachine:#{machine.id} #{tmpdir}"
|
100
99
|
|
101
100
|
unless system "#{ovf_cmd}"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ESXi
|
@@ -23,19 +23,21 @@ module VagrantPlugins
|
|
23
23
|
machine = env[:machine]
|
24
24
|
config = env[:machine].provider_config
|
25
25
|
|
26
|
-
return
|
26
|
+
return nil if machine.id.nil?
|
27
27
|
|
28
28
|
@logger.info("vagrant-vmware-esxi, read_ssh_info: machine id: #{machine.id}")
|
29
29
|
@logger.info('vagrant-vmware-esxi, read_ssh_info: current state:'\
|
30
30
|
" #{env[:machine_state]}")
|
31
31
|
|
32
32
|
# Figure out vm_ipaddress
|
33
|
-
Net::SSH
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
34
|
+
password: $esxi_password,
|
35
|
+
port: config.esxi_hostport,
|
36
|
+
keys: config.esxi_private_keys,
|
37
|
+
timeout: 10,
|
38
|
+
number_of_password_prompts: 0,
|
39
|
+
non_interactive: true
|
40
|
+
) do |ssh|
|
39
41
|
|
40
42
|
@logger = Log4r::Logger.new('vagrant_vmware_esxi::action::'\
|
41
43
|
'read_ssh_info-net_ssh')
|
@@ -44,13 +46,13 @@ module VagrantPlugins
|
|
44
46
|
ssh_execute_cmd = "vim-cmd vmsvc/get.guest #{machine.id} |"
|
45
47
|
ssh_execute_cmd << 'grep -i "^ ipAddress"|'
|
46
48
|
ssh_execute_cmd << 'grep -oE "((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])"'
|
47
|
-
r = ssh
|
49
|
+
r = ssh.exec!(ssh_execute_cmd)
|
48
50
|
|
49
|
-
ipaddress = r.
|
51
|
+
ipaddress = r.strip
|
50
52
|
@logger.info('vagrant-vmware-esxi, read_ssh_info: ipaddress: '\
|
51
53
|
"#{ipaddress}")
|
52
54
|
|
53
|
-
return nil if (ipaddress == '') || (r.
|
55
|
+
return nil if (ipaddress == '') || (r.exitstatus != 0)
|
54
56
|
|
55
57
|
return {
|
56
58
|
host: ipaddress,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
require 'socket'
|
4
4
|
|
5
5
|
module VagrantPlugins
|
@@ -36,26 +36,28 @@ module VagrantPlugins
|
|
36
36
|
machine = env[:machine]
|
37
37
|
config = env[:machine].provider_config
|
38
38
|
|
39
|
-
|
40
39
|
return :not_created if machine.id.to_i < 1
|
41
40
|
|
42
41
|
@logger.info("vagrant-vmware-esxi, read_state: machine id: #{machine.id}")
|
43
42
|
@logger.info("vagrant-vmware-esxi, read_state: current state: #{env[:machine_state]}")
|
44
43
|
|
45
|
-
Net::SSH
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
45
|
+
password: $esxi_password,
|
46
|
+
port: config.esxi_hostport,
|
47
|
+
keys: config.esxi_private_keys,
|
48
|
+
timeout: 10,
|
49
|
+
number_of_password_prompts: 0,
|
50
|
+
non_interactive: true
|
51
|
+
) do |ssh|
|
51
52
|
|
52
|
-
r = ssh
|
53
|
+
r = ssh.exec!(
|
53
54
|
"vim-cmd vmsvc/getallvms|grep -q \"^#{machine.id} \" && "\
|
54
|
-
"vim-cmd vmsvc/power.getstate #{machine.id} || return 254"
|
55
|
-
power_status = r
|
55
|
+
"vim-cmd vmsvc/power.getstate #{machine.id} || return 254")
|
56
|
+
power_status = r
|
57
|
+
|
58
|
+
return :not_created if r.exitstatus == 254
|
56
59
|
|
57
|
-
|
58
|
-
if power_status == "" or r.exit_code != 0
|
60
|
+
if power_status == "" or r.exitstatus != 0
|
59
61
|
raise Errors::ESXiError,
|
60
62
|
message: 'Unable to get VM Power State!'
|
61
63
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ESXi
|
@@ -37,18 +37,22 @@ module VagrantPlugins
|
|
37
37
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
38
38
|
message: 'Attempting to resume')
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
password:
|
43
|
-
port:
|
44
|
-
keys:
|
45
|
-
|
40
|
+
#
|
41
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
42
|
+
password: $esxi_password,
|
43
|
+
port: config.esxi_hostport,
|
44
|
+
keys: config.esxi_private_keys,
|
45
|
+
timeout: 60,
|
46
|
+
number_of_password_prompts: 0,
|
47
|
+
non_interactive: true
|
48
|
+
) do |ssh|
|
46
49
|
|
47
|
-
r = ssh
|
48
|
-
|
50
|
+
r = ssh.exec!("vim-cmd vmsvc/power.on #{machine.id}")
|
51
|
+
|
52
|
+
if r.exitstatus != 0
|
49
53
|
raise Errors::ESXiError,
|
50
54
|
message: "Unable to resume the VM:\n"\
|
51
|
-
" #{r
|
55
|
+
" #{r}"
|
52
56
|
end
|
53
57
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
54
58
|
message: 'VM has been resumed...')
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'net/ssh
|
2
|
+
require 'net/ssh'
|
3
3
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module ESXi
|
@@ -33,24 +33,26 @@ module VagrantPlugins
|
|
33
33
|
env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
|
34
34
|
message: 'Attempting to snapshot_delete')
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
password:
|
39
|
-
port:
|
40
|
-
keys:
|
41
|
-
timeout:
|
42
|
-
|
36
|
+
#
|
37
|
+
Net::SSH.start( config.esxi_hostname, config.esxi_username,
|
38
|
+
password: $esxi_password,
|
39
|
+
port: config.esxi_hostport,
|
40
|
+
keys: config.esxi_private_keys,
|
41
|
+
timeout: 10,
|
42
|
+
number_of_password_prompts: 0,
|
43
|
+
non_interactive: true
|
44
|
+
) do |ssh|
|
43
45
|
|
44
|
-
r = ssh
|
46
|
+
r = ssh.exec!(
|
45
47
|
"vim-cmd vmsvc/snapshot.remove #{machine.id} "\
|
46
48
|
"`vim-cmd vmsvc/snapshot.get #{machine.id} | "\
|
47
49
|
"grep -A1 '.*Snapshot Name : #{env[:snapshot_name]}$' | "\
|
48
|
-
"grep 'Snapshot Id'|awk '{print $NF}'`"
|
50
|
+
"grep 'Snapshot Id'|awk '{print $NF}'`")
|
49
51
|
|
50
|
-
if r.
|
52
|
+
if r.exitstatus != 0
|
51
53
|
raise Errors::ESXiError,
|
52
54
|
message: "Unable to remove snapshots of the VM:\n"\
|
53
|
-
" #{r
|
55
|
+
" #{r}"
|
54
56
|
end
|
55
57
|
|
56
58
|
env[:ui].info I18n.t('vagrant_vmware_esxi.snapshot_deleted')
|