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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sanity_checks.rb +1 -1
  3. data/lib/vagrant-proxmox.rb +1 -2
  4. data/lib/vagrant-proxmox/action.rb +133 -86
  5. data/lib/vagrant-proxmox/action/connect_proxmox.rb +10 -10
  6. data/lib/vagrant-proxmox/action/create_vm.rb +33 -28
  7. data/lib/vagrant-proxmox/action/destroy_vm.rb +10 -6
  8. data/lib/vagrant-proxmox/action/get_node_list.rb +8 -6
  9. data/lib/vagrant-proxmox/action/is_created.rb +1 -0
  10. data/lib/vagrant-proxmox/action/is_stopped.rb +1 -0
  11. data/lib/vagrant-proxmox/action/message_file_not_found.rb +21 -0
  12. data/lib/vagrant-proxmox/action/message_not_running.rb +20 -0
  13. data/lib/vagrant-proxmox/action/message_upload_server_error.rb +20 -0
  14. data/lib/vagrant-proxmox/action/proxmox_action.rb +6 -22
  15. data/lib/vagrant-proxmox/action/read_ssh_info.rb +1 -0
  16. data/lib/vagrant-proxmox/action/read_state.rb +11 -14
  17. data/lib/vagrant-proxmox/action/select_node.rb +23 -0
  18. data/lib/vagrant-proxmox/action/shutdown_vm.rb +8 -8
  19. data/lib/vagrant-proxmox/action/start_vm.rb +20 -12
  20. data/lib/vagrant-proxmox/action/stop_vm.rb +9 -8
  21. data/lib/vagrant-proxmox/action/sync_folders.rb +1 -1
  22. data/lib/vagrant-proxmox/action/upload_iso_file.rb +38 -0
  23. data/lib/vagrant-proxmox/action/upload_template_file.rb +38 -0
  24. data/lib/vagrant-proxmox/config.rb +85 -5
  25. data/lib/vagrant-proxmox/errors.rb +22 -2
  26. data/lib/vagrant-proxmox/plugin.rb +0 -14
  27. data/lib/vagrant-proxmox/proxmox/connection.rb +217 -0
  28. data/lib/vagrant-proxmox/proxmox/errors.rb +23 -0
  29. data/lib/vagrant-proxmox/version.rb +1 -1
  30. data/locales/en.yml +29 -2
  31. data/spec/actions/cleanup_after_destroy_action_spec.rb +2 -2
  32. data/spec/actions/connect_proxmox_action_spec.rb +32 -15
  33. data/spec/actions/create_vm_action_spec.rb +155 -130
  34. data/spec/actions/destroy_vm_action_spec.rb +50 -23
  35. data/spec/actions/get_node_list_action_spec.rb +25 -12
  36. data/spec/actions/is_created_action_spec.rb +8 -8
  37. data/spec/actions/is_stopped_action_spec.rb +8 -8
  38. data/spec/actions/message_already_running_action_spec.rb +2 -2
  39. data/spec/actions/message_already_stopped_action_spec.rb +2 -2
  40. data/spec/actions/message_file_not_found_spec.rb +23 -0
  41. data/spec/actions/message_not_created_action_spec.rb +2 -2
  42. data/spec/actions/message_not_running_action_spec.rb +23 -0
  43. data/spec/actions/message_upload_server_error_spec.rb +23 -0
  44. data/spec/actions/proxmox_action_shared.rb +0 -64
  45. data/spec/actions/proxmox_action_spec.rb +57 -0
  46. data/spec/actions/read_ssh_info_action_spec.rb +6 -6
  47. data/spec/actions/read_state_action_spec.rb +36 -34
  48. data/spec/actions/select_node_spec.rb +33 -0
  49. data/spec/actions/shutdown_vm_action_spec.rb +50 -22
  50. data/spec/actions/start_vm_action_spec.rb +87 -33
  51. data/spec/actions/stop_vm_action_spec.rb +50 -23
  52. data/spec/actions/sync_folders_action_spec.rb +9 -9
  53. data/spec/actions/upload_iso_file_action_spec.rb +70 -0
  54. data/spec/actions/upload_template_file_action_spec.rb +70 -0
  55. data/spec/commands/destroy_command_spec.rb +25 -25
  56. data/spec/commands/halt_command_spec.rb +17 -17
  57. data/spec/commands/provision_command_spec.rb +22 -9
  58. data/spec/commands/ssh_command_spec.rb +18 -5
  59. data/spec/commands/ssh_run_command_spec.rb +19 -6
  60. data/spec/commands/status_command_spec.rb +2 -2
  61. data/spec/commands/up_command_spec.rb +174 -34
  62. data/spec/config_spec.rb +325 -46
  63. data/spec/plugin_spec.rb +1 -8
  64. data/spec/provider_spec.rb +4 -4
  65. data/spec/proxmox/connection_spec.rb +662 -0
  66. data/spec/proxmox/rest_call_shared.rb +41 -0
  67. data/spec/sanity_checks_spec.rb +1 -1
  68. data/spec/spec_helper.rb +15 -97
  69. data/spec/spec_helpers/common_helpers.rb +111 -0
  70. data/spec/spec_helpers/time_helpers.rb +90 -0
  71. metadata +161 -45
@@ -2,8 +2,8 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
- # This action gets a list of all the nodes of a Proxmox server cluster
6
- # and stores it under env[:proxmox_nodes]
5
+ # This action gets a list of all the nodes e.g. ['node1', 'node2'] of
6
+ # a Proxmox server cluster and stores it under env[:proxmox_nodes]
7
7
  class GetNodeList < ProxmoxAction
8
8
 
9
9
  def initialize app, env
@@ -11,10 +11,12 @@ module VagrantPlugins
11
11
  end
12
12
 
13
13
  def call env
14
- endpoint = env[:machine].provider_config.endpoint
15
- response = RestClient.get "#{endpoint}/nodes", {cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
16
- env[:proxmox_nodes] = JSON.parse(response.to_s, symbolize_names: true)[:data]
17
- next_action env
14
+ begin
15
+ env[:proxmox_nodes] = env[:proxmox_connection].get_node_list
16
+ next_action env
17
+ rescue => e
18
+ raise Errors::CommunicationError, error_msg: e.message
19
+ end
18
20
  end
19
21
 
20
22
  end
@@ -2,6 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
+ # set env[:result] to :is_created
5
6
  class IsCreated < ProxmoxAction
6
7
 
7
8
  def initialize app, env
@@ -2,6 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
+ # set env[:result] to :stopped
5
6
  class IsStopped < ProxmoxAction
6
7
 
7
8
  def initialize app, env
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ class MessageFileNotFound < ProxmoxAction
6
+
7
+ def initialize app, env
8
+ @app = app
9
+ end
10
+
11
+ def call env
12
+ #TODO add file name
13
+ env[:ui].info I18n.t('vagrant_proxmox.errors.file_not_found')
14
+ next_action env
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ class MessageNotRunning < ProxmoxAction
6
+
7
+ def initialize app, env
8
+ @app = app
9
+ end
10
+
11
+ def call env
12
+ env[:ui].info I18n.t('vagrant_proxmox.errors.vm_not_running')
13
+ next_action env
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ class MessageUploadServerError < ProxmoxAction
6
+
7
+ def initialize app, env
8
+ @app = app
9
+ end
10
+
11
+ def call env
12
+ env[:ui].info I18n.t('vagrant_proxmox.errors.upload_server_error')
13
+ next_action env
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -10,34 +10,18 @@ module VagrantPlugins
10
10
  end
11
11
 
12
12
  protected
13
- def parse_task_id proxmox_response
14
- JSON.parse(proxmox_response.to_s, symbolize_names: true)[:data]
13
+ def get_machine_ip_address env
14
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:ip] rescue nil
15
15
  end
16
16
 
17
- # Wait for the completion of the proxmox task with the given upid.
18
17
  protected
19
- def wait_for_completion task_upid, node, env, timeout_message
20
- begin
21
- retryable(on: VagrantPlugins::Proxmox::ProxmoxTaskNotFinished,
22
- tries: env[:machine].provider_config.task_timeout,
23
- sleep: env[:machine].provider_config.task_status_check_interval) do
24
- exit_status = get_task_exitstatus task_upid, node, env
25
- exit_status.nil? ? raise(VagrantPlugins::Proxmox::ProxmoxTaskNotFinished) : exit_status
26
- end
27
- rescue VagrantPlugins::Proxmox::ProxmoxTaskNotFinished
28
- raise Errors::Timeout.new timeout_message
29
- end
18
+ def get_machine_macaddress env
19
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:macaddress] rescue nil
30
20
  end
31
21
 
32
22
  protected
33
- def get_machine_ip_address env
34
- env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:ip] rescue nil
35
- end
36
-
37
- private
38
- def get_task_exitstatus task_upid, node, env
39
- response = RestClient.get "#{env[:machine].provider_config.endpoint}/nodes/#{node}/tasks/#{task_upid}/status", {cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
40
- parse_task_id(response)[:exitstatus]
23
+ def connection env
24
+ env[:proxmox_connection]
41
25
  end
42
26
 
43
27
  end
@@ -2,6 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
+ # This action stores the ssh information in env[:machine_ssh_info]
5
6
  class ReadSSHInfo < ProxmoxAction
6
7
 
7
8
  def initialize app, env
@@ -13,21 +13,18 @@ module VagrantPlugins
13
13
 
14
14
  def call env
15
15
  begin
16
- if env[:machine].id
17
- node, vm_id = env[:machine].id.split '/'
18
- endpoint = env[:machine].provider_config.endpoint
19
- response = RestClient.get "#{endpoint}/nodes/#{node}/openvz/#{vm_id}/status/current",
20
- {cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
21
- states = {'running' => :running,
22
- 'stopped' => :stopped}
23
- env[:machine_state_id] = states[JSON.parse(response.to_s)['data']['status']]
24
- else
25
- env[:machine_state_id] = :not_created
26
- end
27
- rescue RestClient::InternalServerError
28
- env[:machine_state_id] = :not_created
16
+ env[:machine_state_id] =
17
+ if env[:machine].id
18
+ node, vm_id = env[:machine].id.split '/'
19
+ env[:proxmox_connection].get_vm_state vm_id
20
+ else
21
+ :not_created
22
+ end
23
+ next_action env
24
+ rescue => e
25
+ raise Errors::CommunicationError, error_msg: e.message
29
26
  end
30
- next_action env
27
+
31
28
  end
32
29
 
33
30
  end
@@ -0,0 +1,23 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action reads the state of a Proxmox virtual machine and stores it
6
+ # in env[:machine_state_id].
7
+ class SelectNode < ProxmoxAction
8
+
9
+ def initialize app, env
10
+ @app = app
11
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::select_node'
12
+ end
13
+
14
+ def call env
15
+ env[:proxmox_selected_node] = env[:proxmox_nodes].sample
16
+ next_action env
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -2,7 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
- # This action shuts down a Proxmox virtual machine.
5
+ # This action shuts down the Proxmox virtual machine in env[:machine]
6
6
  class ShutdownVm < ProxmoxAction
7
7
 
8
8
  def initialize app, env
@@ -11,14 +11,14 @@ module VagrantPlugins
11
11
  end
12
12
 
13
13
  def call env
14
- endpoint = env[:machine].provider_config.endpoint
15
- node, vm_id = env[:machine].id.split '/'
16
14
  env[:ui].info I18n.t('vagrant_proxmox.shut_down_vm')
17
- response = RestClient.post "#{endpoint}/nodes/#{node}/openvz/#{vm_id}/status/shutdown", nil,
18
- {CSRFPreventionToken: env[:proxmox_csrf_prevention_token],
19
- cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
20
-
21
- wait_for_completion parse_task_id(response), node, env, 'vagrant_proxmox.errors.shutdown_vm_timeout'
15
+ begin
16
+ node, vm_id = env[:machine].id.split '/'
17
+ exit_status = connection(env).shutdown_vm vm_id
18
+ exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
19
+ rescue StandardError => e
20
+ raise VagrantPlugins::Proxmox::Errors::VMShutdownError, proxmox_exit_status: e.message
21
+ end
22
22
  env[:ui].info I18n.t('vagrant_proxmox.done')
23
23
 
24
24
  next_action env
@@ -2,7 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
- # This action starts a Proxmox virtual machine.
5
+ # This action starts the Proxmox virtual machine in env[:machine]
6
6
  class StartVm < ProxmoxAction
7
7
 
8
8
  def initialize app, env
@@ -11,23 +11,31 @@ module VagrantPlugins
11
11
  end
12
12
 
13
13
  def call env
14
- endpoint = env[:machine].provider_config.endpoint
15
- node, vm_id = env[:machine].id.split '/'
16
14
  env[:ui].info I18n.t('vagrant_proxmox.starting_vm')
17
- response = RestClient.post "#{endpoint}/nodes/#{node}/openvz/#{vm_id}/status/start", nil,
18
- {CSRFPreventionToken: env[:proxmox_csrf_prevention_token],
19
- cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
15
+ begin
16
+ node, vm_id = env[:machine].id.split '/'
17
+ exit_status = connection(env).start_vm vm_id
18
+ exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
19
+ rescue StandardError => e
20
+ raise VagrantPlugins::Proxmox::Errors::VMStartError, proxmox_exit_status: e.message
21
+ end
20
22
 
21
- wait_for_completion parse_task_id(response), node, env, 'vagrant_proxmox.errors.start_vm_timeout'
22
23
  env[:ui].info I18n.t('vagrant_proxmox.done')
23
24
 
24
25
  env[:ui].info I18n.t('vagrant_proxmox.waiting_for_ssh_connection')
25
- loop do
26
- # If we're interrupted then just back out
27
- break if env[:interrupted]
28
- break if env[:machine].communicate.ready?
29
- sleep env[:machine].provider_config.task_status_check_interval
26
+
27
+ retryException = Class.new StandardError
28
+
29
+ begin
30
+ retryable(on: retryException,
31
+ tries: env[:machine].provider_config.ssh_timeout / env[:machine].provider_config.ssh_status_check_interval + 1,
32
+ sleep: env[:machine].provider_config.ssh_status_check_interval) do
33
+ raise retryException unless env[:interrupted] || env[:machine].communicate.ready?
34
+ end
35
+ rescue retryException
36
+ raise VagrantPlugins::Proxmox::Errors::SSHError
30
37
  end
38
+
31
39
  env[:ui].info I18n.t('vagrant_proxmox.done')
32
40
 
33
41
  next_action env
@@ -2,7 +2,7 @@ module VagrantPlugins
2
2
  module Proxmox
3
3
  module Action
4
4
 
5
- # This action stops a Proxmox virtual machine.
5
+ # This action stops the Proxmox virtual machine in env[:machine]
6
6
  class StopVm < ProxmoxAction
7
7
 
8
8
  def initialize app, env
@@ -11,14 +11,15 @@ module VagrantPlugins
11
11
  end
12
12
 
13
13
  def call env
14
- endpoint = env[:machine].provider_config.endpoint
15
- node, vm_id = env[:machine].id.split '/'
16
- env[:ui].info I18n.t('vagrant_proxmox.stopping_vm')
17
- response = RestClient.post "#{endpoint}/nodes/#{node}/openvz/#{vm_id}/status/stop", nil,
18
- {CSRFPreventionToken: env[:proxmox_csrf_prevention_token],
19
- cookies: {PVEAuthCookie: env[:proxmox_ticket]}}
14
+ begin
15
+ node, vm_id = env[:machine].id.split '/'
16
+ env[:ui].info I18n.t('vagrant_proxmox.stopping_vm')
17
+ exit_status = connection(env).stop_vm vm_id
18
+ exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
19
+ rescue StandardError => e
20
+ raise VagrantPlugins::Proxmox::Errors::VMStopError, proxmox_exit_status: e.message
21
+ end
20
22
 
21
- wait_for_completion parse_task_id(response), node, env, 'vagrant_proxmox.errors.stop_vm_timeout'
22
23
  env[:ui].info I18n.t('vagrant_proxmox.done')
23
24
 
24
25
  next_action env
@@ -33,7 +33,7 @@ module VagrantPlugins
33
33
  # rsync over to the guest path using the SSH info
34
34
  command = [
35
35
  'rsync', '--verbose', '--archive', '--compress', '--delete',
36
- '-e', "ssh -p #{ssh_info[:port]} -i '#{ssh_info[:private_key_path]}' -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
36
+ '-e', "ssh -p #{ssh_info[:port]} -i '#{ssh_info[:private_key_path][0]}' -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
37
37
  hostpath, "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
38
38
 
39
39
  rsync_process = Vagrant::Util::Subprocess.execute *command
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action uploads a iso file into the local storage a given node
6
+ class UploadIsoFile < ProxmoxAction
7
+
8
+ def initialize app, env
9
+ @app = app
10
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::iso_file_upload'
11
+ end
12
+
13
+ def call env
14
+ env[:result] = :ok
15
+ config = env[:machine].provider_config
16
+ if config.qemu_iso_file
17
+ env[:result] = upload_file env, config.qemu_iso_file
18
+ end
19
+ next_action env
20
+ end
21
+
22
+ private
23
+ def upload_file env, filename
24
+ if File.exist? filename
25
+ begin
26
+ connection(env).upload_file(filename, content_type: 'iso', node: env[:proxmox_selected_node], storage: 'local')
27
+ :ok
28
+ rescue
29
+ :server_upload_error
30
+ end
31
+ else
32
+ :file_not_found
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action uploads a template file into the local storage of a given node
6
+ class UploadTemplateFile < ProxmoxAction
7
+
8
+ def initialize app, env
9
+ @app = app
10
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::template_file_upload'
11
+ end
12
+
13
+ def call env
14
+ env[:result] = :ok
15
+ config = env[:machine].provider_config
16
+ if config.openvz_template_file
17
+ env[:result] = upload_file env, config.openvz_template_file
18
+ end
19
+ next_action env
20
+ end
21
+
22
+ private
23
+ def upload_file env, filename
24
+ if File.exist? filename
25
+ begin
26
+ connection(env).upload_file(filename, content_type: 'vztmpl', node: env[:proxmox_selected_node], storage: 'local')
27
+ :ok
28
+ rescue
29
+ :server_upload_error
30
+ end
31
+ else
32
+ :file_not_found
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -17,10 +17,20 @@ module VagrantPlugins
17
17
  # @return [String]
18
18
  attr_accessor :password
19
19
 
20
- # The openvz os template to use for the virtual machines
20
+ # The virtual machine type, e.g. :openvz or :qemu
21
+ #
22
+ # @return [Symbol]
23
+ attr_accessor :vm_type
24
+
25
+ # The openvz os template to use for the virtual machine
21
26
  #
22
27
  # @return [String]
23
- attr_accessor :os_template
28
+ attr_accessor :openvz_os_template
29
+
30
+ # The openvz os template file to upload and use for the virtual machine
31
+ #
32
+ # @return [String]
33
+ attr_accessor :openvz_template_file
24
34
 
25
35
  # The id range to use for the virtual machines
26
36
  #
@@ -47,16 +57,60 @@ module VagrantPlugins
47
57
  # @return [Integer, Proc]
48
58
  attr_accessor :task_status_check_interval
49
59
 
60
+ # The maximum timeout for a ssh connection to a virtual machine (in seconds)
61
+ #
62
+ # @return [Integer]
63
+ attr_accessor :ssh_timeout
64
+
65
+ # The interval between two ssh reachability status retrievals (in seconds)
66
+ #
67
+ # @return [Integer, Proc]
68
+ attr_accessor :ssh_status_check_interval
69
+
70
+ # The maximum timeout for a proxmox server task if it's an upload (in seconds)
71
+ #
72
+ # @return [Integer]
73
+ attr_accessor :imgcopy_timeout
74
+
75
+ # The qemu virtual machine operating system, e.g. :l26
76
+ #
77
+ # @return [Symbol]
78
+ attr_accessor :qemu_os
79
+
80
+ # The qemu iso file to use for the virtual machine
81
+ #
82
+ # @return [String]
83
+ attr_accessor :qemu_iso
84
+
85
+ # The qemu iso file to upload and use for the virtual machine
86
+ #
87
+ # @return [String]
88
+ attr_accessor :qemu_iso_file
89
+
90
+ # The qemu disk size to use for the virtual machine, e.g. '30G'
91
+ #
92
+ # @return [String]
93
+ attr_accessor :qemu_disk_size
94
+
50
95
  def initialize
51
96
  @endpoint = UNSET_VALUE
52
97
  @user_name = UNSET_VALUE
53
98
  @password = UNSET_VALUE
54
- @os_template = UNSET_VALUE
99
+ @vm_type = UNSET_VALUE
100
+ @openvz_os_template = UNSET_VALUE
101
+ @openvz_template_file = UNSET_VALUE
55
102
  @vm_id_range = 900..999
56
103
  @vm_name_prefix = 'vagrant_'
57
104
  @vm_memory = 512
58
105
  @task_timeout = 60
59
106
  @task_status_check_interval = 2
107
+ @ssh_timeout = 60
108
+ @ssh_status_check_interval = 5
109
+ @imgcopy_timeout = 120
110
+ @qemu_os = UNSET_VALUE
111
+ @qemu_iso = UNSET_VALUE
112
+ @qemu_iso_file = UNSET_VALUE
113
+ @qemu_disk_size = UNSET_VALUE
60
114
  end
61
115
 
62
116
  # This is the hook that is called to finalize the object before it is put into use.
@@ -64,7 +118,16 @@ module VagrantPlugins
64
118
  @endpoint = nil if @endpoint == UNSET_VALUE
65
119
  @user_name = nil if @user_name == UNSET_VALUE
66
120
  @password = nil if @password == UNSET_VALUE
67
- @os_template = nil if @os_template == UNSET_VALUE
121
+ @vm_type = nil if @vm_type == UNSET_VALUE
122
+ @openvz_template_file = nil if @openvz_template_file == UNSET_VALUE
123
+ @openvz_os_template = "local:vztmpl/#{File.basename @openvz_template_file}" if @openvz_template_file
124
+ @openvz_os_template = nil if @openvz_os_template == UNSET_VALUE
125
+ @qemu_os = nil if @qemu_os == UNSET_VALUE
126
+ @qemu_iso_file = nil if @qemu_iso_file == UNSET_VALUE
127
+ @qemu_iso = "local:iso/#{File.basename @qemu_iso_file}" if @qemu_iso_file
128
+ @qemu_iso = nil if @qemu_iso == UNSET_VALUE
129
+ @qemu_disk_size = nil if @qemu_disk_size == UNSET_VALUE
130
+ @qemu_disk_size = convert_disk_size_to_gigabyte @qemu_disk_size if @qemu_disk_size
68
131
  end
69
132
 
70
133
  def validate machine
@@ -72,10 +135,27 @@ module VagrantPlugins
72
135
  errors << I18n.t('vagrant_proxmox.errors.no_endpoint_specified') unless @endpoint
73
136
  errors << I18n.t('vagrant_proxmox.errors.no_user_name_specified') unless @user_name
74
137
  errors << I18n.t('vagrant_proxmox.errors.no_password_specified') unless @password
75
- errors << I18n.t('vagrant_proxmox.errors.no_os_template_specified') unless @os_template
138
+ errors << I18n.t('vagrant_proxmox.errors.no_vm_type_specified') unless @vm_type
139
+ if @vm_type == :openvz
140
+ errors << I18n.t('vagrant_proxmox.errors.no_openvz_os_template_or_openvz_template_file_specified_for_type_openvz') unless @openvz_os_template || @openvz_template_file
141
+ end
142
+ if @vm_type == :qemu
143
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_os_specified_for_vm_type_qemu') unless @qemu_os
144
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_iso_or_qemu_iso_file_specified_for_vm_type_qemu') unless @qemu_iso || @qemu_iso_file
145
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_disk_size_specified_for_vm_type_qemu') unless @qemu_disk_size
146
+ end
76
147
  {'Proxmox Provider' => errors}
77
148
  end
78
149
 
150
+ private
151
+ def convert_disk_size_to_gigabyte disk_size
152
+ case disk_size[-1]
153
+ when 'G'
154
+ disk_size[0..-2]
155
+ else
156
+ disk_size
157
+ end
158
+ end
79
159
  end
80
160
  end
81
161
  end