vagrant-proxmox 0.0.3 → 0.0.5
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/lib/sanity_checks.rb +1 -1
- data/lib/vagrant-proxmox.rb +1 -2
- data/lib/vagrant-proxmox/action.rb +133 -86
- data/lib/vagrant-proxmox/action/connect_proxmox.rb +10 -10
- data/lib/vagrant-proxmox/action/create_vm.rb +33 -28
- data/lib/vagrant-proxmox/action/destroy_vm.rb +10 -6
- data/lib/vagrant-proxmox/action/get_node_list.rb +8 -6
- data/lib/vagrant-proxmox/action/is_created.rb +1 -0
- data/lib/vagrant-proxmox/action/is_stopped.rb +1 -0
- data/lib/vagrant-proxmox/action/message_file_not_found.rb +21 -0
- data/lib/vagrant-proxmox/action/message_not_running.rb +20 -0
- data/lib/vagrant-proxmox/action/message_upload_server_error.rb +20 -0
- data/lib/vagrant-proxmox/action/proxmox_action.rb +6 -22
- data/lib/vagrant-proxmox/action/read_ssh_info.rb +1 -0
- data/lib/vagrant-proxmox/action/read_state.rb +11 -14
- data/lib/vagrant-proxmox/action/select_node.rb +23 -0
- data/lib/vagrant-proxmox/action/shutdown_vm.rb +8 -8
- data/lib/vagrant-proxmox/action/start_vm.rb +20 -12
- data/lib/vagrant-proxmox/action/stop_vm.rb +9 -8
- data/lib/vagrant-proxmox/action/sync_folders.rb +1 -1
- data/lib/vagrant-proxmox/action/upload_iso_file.rb +38 -0
- data/lib/vagrant-proxmox/action/upload_template_file.rb +38 -0
- data/lib/vagrant-proxmox/config.rb +85 -5
- data/lib/vagrant-proxmox/errors.rb +22 -2
- data/lib/vagrant-proxmox/plugin.rb +0 -14
- data/lib/vagrant-proxmox/proxmox/connection.rb +217 -0
- data/lib/vagrant-proxmox/proxmox/errors.rb +23 -0
- data/lib/vagrant-proxmox/version.rb +1 -1
- data/locales/en.yml +29 -2
- data/spec/actions/cleanup_after_destroy_action_spec.rb +2 -2
- data/spec/actions/connect_proxmox_action_spec.rb +32 -15
- data/spec/actions/create_vm_action_spec.rb +155 -130
- data/spec/actions/destroy_vm_action_spec.rb +50 -23
- data/spec/actions/get_node_list_action_spec.rb +25 -12
- data/spec/actions/is_created_action_spec.rb +8 -8
- data/spec/actions/is_stopped_action_spec.rb +8 -8
- data/spec/actions/message_already_running_action_spec.rb +2 -2
- data/spec/actions/message_already_stopped_action_spec.rb +2 -2
- data/spec/actions/message_file_not_found_spec.rb +23 -0
- data/spec/actions/message_not_created_action_spec.rb +2 -2
- data/spec/actions/message_not_running_action_spec.rb +23 -0
- data/spec/actions/message_upload_server_error_spec.rb +23 -0
- data/spec/actions/proxmox_action_shared.rb +0 -64
- data/spec/actions/proxmox_action_spec.rb +57 -0
- data/spec/actions/read_ssh_info_action_spec.rb +6 -6
- data/spec/actions/read_state_action_spec.rb +36 -34
- data/spec/actions/select_node_spec.rb +33 -0
- data/spec/actions/shutdown_vm_action_spec.rb +50 -22
- data/spec/actions/start_vm_action_spec.rb +87 -33
- data/spec/actions/stop_vm_action_spec.rb +50 -23
- data/spec/actions/sync_folders_action_spec.rb +9 -9
- data/spec/actions/upload_iso_file_action_spec.rb +70 -0
- data/spec/actions/upload_template_file_action_spec.rb +70 -0
- data/spec/commands/destroy_command_spec.rb +25 -25
- data/spec/commands/halt_command_spec.rb +17 -17
- data/spec/commands/provision_command_spec.rb +22 -9
- data/spec/commands/ssh_command_spec.rb +18 -5
- data/spec/commands/ssh_run_command_spec.rb +19 -6
- data/spec/commands/status_command_spec.rb +2 -2
- data/spec/commands/up_command_spec.rb +174 -34
- data/spec/config_spec.rb +325 -46
- data/spec/plugin_spec.rb +1 -8
- data/spec/provider_spec.rb +4 -4
- data/spec/proxmox/connection_spec.rb +662 -0
- data/spec/proxmox/rest_call_shared.rb +41 -0
- data/spec/sanity_checks_spec.rb +1 -1
- data/spec/spec_helper.rb +15 -97
- data/spec/spec_helpers/common_helpers.rb +111 -0
- data/spec/spec_helpers/time_helpers.rb +90 -0
- metadata +161 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 076be20bc1c88631ba0e7c3800e984cd8192e32a
|
4
|
+
data.tar.gz: 578fcb688c63d93d2d935d88267fec5f7e1866eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d4aa5a81acc653d69477121d2912d0af8e3a2742f02fc85b8502788953859f148950d63f43866e5b59c0f6c0cf72d733cdba129ab76326bf5604cb5ce1cc5a9
|
7
|
+
data.tar.gz: c5f44f9e1675596a33ea8990ef44c3fccec2ecf902f9481c778b88f675c46feaf10a513d331abacee3a765f440b04af835297978d63d801c7117c9b1b68d07bb
|
data/lib/sanity_checks.rb
CHANGED
data/lib/vagrant-proxmox.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
require 'pathname'
|
2
2
|
require 'log4r'
|
3
|
-
require 'rest-client'
|
4
|
-
require 'retryable'
|
5
3
|
require 'active_support/core_ext/object/try'
|
6
4
|
|
7
5
|
require 'sanity_checks'
|
8
6
|
require 'vagrant-proxmox/plugin'
|
9
7
|
require 'vagrant-proxmox/errors'
|
8
|
+
require 'vagrant-proxmox/proxmox/connection'
|
10
9
|
|
11
10
|
|
12
11
|
module VagrantPlugins
|
@@ -32,128 +32,175 @@ module VagrantPlugins
|
|
32
32
|
end
|
33
33
|
else
|
34
34
|
b1.use GetNodeList
|
35
|
+
b1.use SelectNode
|
35
36
|
b1.use Provision
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
if env1[:machine].provider_config.vm_type == :openvz
|
38
|
+
b1.use Call, UploadTemplateFile do |env2, b2|
|
39
|
+
if env2[:result] == :ok
|
40
|
+
b2.use CreateVm
|
41
|
+
b2.use StartVm
|
42
|
+
b2.use SyncFolders
|
43
|
+
elsif env2[:result] == :file_not_found
|
44
|
+
b2.use MessageFileNotFound
|
45
|
+
elsif env2[:result] == :server_upload_error
|
46
|
+
b2.use MessageUploadServerError
|
47
|
+
end
|
48
|
+
end
|
49
|
+
elsif env1[:machine].provider_config.vm_type == :qemu
|
50
|
+
b1.use Call, UploadIsoFile do |env2, b2|
|
51
|
+
if env2[:result] == :ok
|
52
|
+
b2.use CreateVm
|
53
|
+
b2.use StartVm
|
54
|
+
b2.use SyncFolders
|
55
|
+
elsif env2[:result] == :file_not_found
|
56
|
+
b2.use MessageFileNotFound
|
57
|
+
elsif env2[:result] == :server_upload_error
|
58
|
+
b2.use MessageUploadServerError
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
39
62
|
end
|
40
63
|
end
|
41
64
|
end
|
42
65
|
end
|
43
66
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
67
|
+
def self.action_provision
|
68
|
+
Vagrant::Action::Builder.new.tap do |b|
|
69
|
+
b.use ConfigValidate
|
70
|
+
b.use Call, IsCreated do |env1, b1|
|
71
|
+
if env1[:result]
|
72
|
+
b1.use Call, IsStopped do |env2, b2|
|
73
|
+
if env2[:result]
|
74
|
+
b2.use MessageNotRunning
|
75
|
+
else
|
76
|
+
b2.use Provision
|
77
|
+
b2.use SyncFolders
|
78
|
+
end
|
53
79
|
end
|
80
|
+
else
|
81
|
+
b1.use MessageNotCreated
|
54
82
|
end
|
55
83
|
end
|
56
84
|
end
|
85
|
+
end
|
57
86
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
87
|
+
def self.action_halt
|
88
|
+
Vagrant::Action::Builder.new.tap do |b|
|
89
|
+
b.use ConfigValidate
|
90
|
+
b.use Call, IsCreated do |env1, b1|
|
91
|
+
if env1[:result]
|
92
|
+
b1.use Call, IsStopped do |env2, b2|
|
93
|
+
if env2[:result]
|
94
|
+
b2.use MessageAlreadyStopped
|
95
|
+
else
|
96
|
+
b2.use ConnectProxmox
|
97
|
+
b2.use ShutdownVm
|
70
98
|
end
|
71
|
-
else
|
72
|
-
b1.use MessageNotCreated
|
73
99
|
end
|
100
|
+
else
|
101
|
+
b1.use MessageNotCreated
|
74
102
|
end
|
75
103
|
end
|
76
104
|
end
|
105
|
+
end
|
77
106
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
93
|
-
else
|
94
|
-
b2.use ::VagrantPlugins::ProviderVirtualBox::Action::MessageWillNotDestroy
|
107
|
+
# This action is called to destroy the remote machine.
|
108
|
+
def self.action_destroy
|
109
|
+
Vagrant::Action::Builder.new.tap do |b|
|
110
|
+
b.use ConfigValidate
|
111
|
+
b.use ConnectProxmox
|
112
|
+
b.use Call, IsCreated do |env1, b1|
|
113
|
+
if env1[:result]
|
114
|
+
b1.use Call, ::Vagrant::Action::Builtin::DestroyConfirm do |env2, b2|
|
115
|
+
if env2[:result]
|
116
|
+
b2.use Call, IsStopped do |env3, b3|
|
117
|
+
b3.use ShutdownVm unless env3[:result]
|
118
|
+
b3.use DestroyVm
|
119
|
+
b3.use ::Vagrant::Action::Builtin::ProvisionerCleanup
|
120
|
+
b3.use CleanupAfterDestroy
|
95
121
|
end
|
122
|
+
else
|
123
|
+
b2.use ::VagrantPlugins::ProviderVirtualBox::Action::MessageWillNotDestroy
|
96
124
|
end
|
97
|
-
else
|
98
|
-
b1.use MessageNotCreated
|
99
125
|
end
|
126
|
+
else
|
127
|
+
b1.use MessageNotCreated
|
100
128
|
end
|
101
129
|
end
|
102
130
|
end
|
131
|
+
end
|
103
132
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
133
|
+
def self.action_read_ssh_info
|
134
|
+
Vagrant::Action::Builder.new.tap do |b|
|
135
|
+
b.use ConfigValidate
|
136
|
+
b.use ConnectProxmox
|
137
|
+
b.use ReadSSHInfo
|
110
138
|
end
|
139
|
+
end
|
111
140
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
141
|
+
def self.action_ssh
|
142
|
+
Vagrant::Action::Builder.new.tap do |b|
|
143
|
+
b.use ConfigValidate
|
144
|
+
b.use Call, IsCreated do |env1, b1|
|
145
|
+
if env1[:result]
|
146
|
+
b1.use Call, IsStopped do |env2, b2|
|
147
|
+
if env2[:result]
|
148
|
+
b2.use MessageNotRunning
|
149
|
+
else
|
150
|
+
b2.use SSHExec
|
151
|
+
end
|
120
152
|
end
|
153
|
+
else
|
154
|
+
b1.use MessageNotCreated
|
121
155
|
end
|
122
156
|
end
|
123
157
|
end
|
158
|
+
end
|
124
159
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
160
|
+
def self.action_ssh_run
|
161
|
+
Vagrant::Action::Builder.new.tap do |b|
|
162
|
+
b.use ConfigValidate
|
163
|
+
b.use Call, IsCreated do |env1, b1|
|
164
|
+
if env1[:result]
|
165
|
+
b1.use Call, IsStopped do |env2, b2|
|
166
|
+
if env2[:result]
|
167
|
+
b2.use MessageNotRunning
|
168
|
+
else
|
169
|
+
b2.use SSHRun
|
170
|
+
end
|
133
171
|
end
|
172
|
+
else
|
173
|
+
b1.use MessageNotCreated
|
134
174
|
end
|
135
175
|
end
|
136
176
|
end
|
177
|
+
end
|
137
178
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
179
|
+
action_root = Pathname.new(File.expand_path '../action', __FILE__)
|
180
|
+
autoload :ProxmoxAction, action_root.join('proxmox_action')
|
181
|
+
autoload :ConnectProxmox, action_root.join('connect_proxmox')
|
182
|
+
autoload :GetNodeList, action_root.join('get_node_list')
|
183
|
+
autoload :SelectNode, action_root.join('select_node')
|
184
|
+
autoload :ReadState, action_root.join('read_state')
|
185
|
+
autoload :IsCreated, action_root.join('is_created')
|
186
|
+
autoload :IsStopped, action_root.join('is_stopped')
|
187
|
+
autoload :MessageAlreadyRunning, action_root.join('message_already_running')
|
188
|
+
autoload :MessageAlreadyStopped, action_root.join('message_already_stopped')
|
189
|
+
autoload :MessageNotCreated, action_root.join('message_not_created')
|
190
|
+
autoload :MessageNotRunning, action_root.join('message_not_running')
|
191
|
+
autoload :MessageFileNotFound, action_root.join('message_file_not_found')
|
192
|
+
autoload :MessageUploadServerError, action_root.join('message_upload_server_error')
|
193
|
+
autoload :CreateVm, action_root.join('create_vm')
|
194
|
+
autoload :StartVm, action_root.join('start_vm')
|
195
|
+
autoload :StopVm, action_root.join('stop_vm')
|
196
|
+
autoload :ShutdownVm, action_root.join('shutdown_vm')
|
197
|
+
autoload :DestroyVm, action_root.join('destroy_vm')
|
198
|
+
autoload :CleanupAfterDestroy, action_root.join('cleanup_after_destroy')
|
199
|
+
autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
200
|
+
autoload :SyncFolders, action_root.join('sync_folders')
|
201
|
+
autoload :UploadTemplateFile, action_root.join('upload_template_file')
|
202
|
+
autoload :UploadIsoFile, action_root.join('upload_iso_file')
|
156
203
|
|
157
|
-
end
|
158
204
|
end
|
159
205
|
end
|
206
|
+
end
|
@@ -2,9 +2,8 @@ module VagrantPlugins
|
|
2
2
|
module Proxmox
|
3
3
|
module Action
|
4
4
|
|
5
|
-
# This action connects to the Proxmox server and stores the
|
6
|
-
#
|
7
|
-
# env[:proxmox_csrf_prevention_token].
|
5
|
+
# This action connects to the Proxmox server and stores the
|
6
|
+
# connection in env[:proxmox_connection]
|
8
7
|
class ConnectProxmox < ProxmoxAction
|
9
8
|
|
10
9
|
def initialize app, env
|
@@ -13,13 +12,15 @@ module VagrantPlugins
|
|
13
12
|
end
|
14
13
|
|
15
14
|
def call env
|
16
|
-
config = env[:machine].provider_config
|
17
|
-
response = RestClient.post "#{config.endpoint}/access/ticket",
|
18
|
-
username: config.user_name, password: config.password
|
19
15
|
begin
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
config = env[:machine].provider_config
|
17
|
+
connection = Connection.new config.endpoint,
|
18
|
+
vm_id_range: config.vm_id_range,
|
19
|
+
task_timeout: config.task_timeout,
|
20
|
+
task_status_check_interval: config.task_status_check_interval,
|
21
|
+
imgcopy_timeout: config.imgcopy_timeout
|
22
|
+
connection.login username: config.user_name, password: config.password
|
23
|
+
env[:proxmox_connection] = connection
|
23
24
|
rescue => e
|
24
25
|
raise Errors::CommunicationError, error_msg: e.message
|
25
26
|
end
|
@@ -27,7 +28,6 @@ module VagrantPlugins
|
|
27
28
|
end
|
28
29
|
|
29
30
|
end
|
30
|
-
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -14,29 +14,18 @@ module VagrantPlugins
|
|
14
14
|
def call env
|
15
15
|
env[:ui].info I18n.t('vagrant_proxmox.creating_vm')
|
16
16
|
config = env[:machine].provider_config
|
17
|
-
|
17
|
+
|
18
|
+
node = env[:proxmox_selected_node]
|
18
19
|
vm_id = nil
|
19
20
|
|
20
21
|
begin
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
hostname: env[:machine].config.vm.hostname || env[:machine].name.to_s,
|
27
|
-
password: 'vagrant',
|
28
|
-
memory: config.vm_memory,
|
29
|
-
description: "#{config.vm_name_prefix}#{env[:machine].name}"}
|
30
|
-
get_machine_ip_address(env).try { |ip_address| params[:ip_address] = ip_address }
|
31
|
-
|
32
|
-
response = RestClient.post "#{config.endpoint}/nodes/#{node}/openvz", params,
|
33
|
-
{CSRFPreventionToken: env[:proxmox_csrf_prevention_token],
|
34
|
-
cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
|
35
|
-
exit_status = wait_for_completion parse_task_id(response), node, env, 'vagrant_proxmox.errors.create_vm_timeout'
|
36
|
-
exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
|
37
|
-
end
|
22
|
+
vm_id = connection(env).get_free_vm_id
|
23
|
+
params = create_params_openvz(config, env, vm_id) if config.vm_type == :openvz
|
24
|
+
params = create_params_qemu(config, env, vm_id) if config.vm_type == :qemu
|
25
|
+
exit_status = connection(env).create_vm node: node, vm_type: config.vm_type, params: params
|
26
|
+
exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
|
38
27
|
rescue StandardError => e
|
39
|
-
raise VagrantPlugins::Proxmox::Errors::
|
28
|
+
raise VagrantPlugins::Proxmox::Errors::VMCreateError, proxmox_exit_status: e.message
|
40
29
|
end
|
41
30
|
|
42
31
|
env[:machine].id = "#{node}/#{vm_id}"
|
@@ -46,18 +35,34 @@ module VagrantPlugins
|
|
46
35
|
end
|
47
36
|
|
48
37
|
private
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
38
|
+
def create_params_qemu(config, env, vm_id)
|
39
|
+
network = 'e1000,bridge=vmbr0'
|
40
|
+
network = "e1000=#{get_machine_macaddress(env)},bridge=vmbr0" if get_machine_macaddress(env)
|
41
|
+
{vmid: vm_id,
|
42
|
+
name: env[:machine].config.vm.hostname || env[:machine].name.to_s,
|
43
|
+
ostype: config.qemu_os,
|
44
|
+
ide2: "#{config.qemu_iso},media=cdrom",
|
45
|
+
sata0: "raid:#{config.qemu_disk_size},format=qcow2",
|
46
|
+
sockets: 1,
|
47
|
+
cores: 1,
|
48
|
+
memory: config.vm_memory,
|
49
|
+
net0: network,
|
50
|
+
description: "#{config.vm_name_prefix}#{env[:machine].name}"}
|
57
51
|
end
|
58
52
|
|
53
|
+
private
|
54
|
+
def create_params_openvz(config, env, vm_id)
|
55
|
+
{vmid: vm_id,
|
56
|
+
ostemplate: config.openvz_os_template,
|
57
|
+
hostname: env[:machine].config.vm.hostname || env[:machine].name.to_s,
|
58
|
+
password: 'vagrant',
|
59
|
+
memory: config.vm_memory,
|
60
|
+
description: "#{config.vm_name_prefix}#{env[:machine].name}"}
|
61
|
+
.tap do |params|
|
62
|
+
params[:ip_address] = get_machine_ip_address(env) if get_machine_ip_address(env)
|
63
|
+
end
|
64
|
+
end
|
59
65
|
end
|
60
|
-
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end
|
@@ -2,21 +2,25 @@ module VagrantPlugins
|
|
2
2
|
module Proxmox
|
3
3
|
module Action
|
4
4
|
|
5
|
+
# This action destroys the virtual machine env[:machine]
|
5
6
|
class DestroyVm < ProxmoxAction
|
6
7
|
|
7
8
|
def initialize app, env
|
8
9
|
@app = app
|
10
|
+
@logger = Log4r::Logger.new 'vagrant_proxmox::action::destroy_vm'
|
9
11
|
end
|
10
12
|
|
11
13
|
def call env
|
12
14
|
env[:ui].info I18n.t('vagrant_proxmox.destroying_vm')
|
13
|
-
node, vm_id = env[:machine].id.split '/'
|
14
|
-
endpoint = env[:machine].provider_config.endpoint
|
15
|
-
response = RestClient.delete "#{endpoint}/nodes/#{node}/openvz/#{vm_id}",
|
16
|
-
{CSRFPreventionToken: env[:proxmox_csrf_prevention_token],
|
17
|
-
cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
|
18
15
|
|
19
|
-
|
16
|
+
begin
|
17
|
+
node, vm_id = env[:machine].id.split '/'
|
18
|
+
exit_status = connection(env).delete_vm vm_id
|
19
|
+
exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
|
20
|
+
rescue StandardError => e
|
21
|
+
raise VagrantPlugins::Proxmox::Errors::VMDestroyError, proxmox_exit_status: e.message
|
22
|
+
end
|
23
|
+
|
20
24
|
env[:ui].info I18n.t('vagrant_proxmox.done')
|
21
25
|
|
22
26
|
next_action env
|