vagrant-proxmox 0.0.9 → 0.0.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4565859e642abb0c27f2447e318af6947fa1c1a1
4
- data.tar.gz: 2d1c4fbf9d77a08728d95a83d2acf818e422b82d
3
+ metadata.gz: 839f7c29c05343449fbed0cdc2979032c626b320
4
+ data.tar.gz: c6054dbe620fc0899fb5397e4c41fecfacdce356
5
5
  SHA512:
6
- metadata.gz: b8e544f6029a57e4c13d2a6b9cf56269879defcce1d8fa34b2f45bbf64bb13d7baad5777f8be94c4b0d5a40fd69cfba29c8d55b2f62ca8cee28db1fd1dfbd2a1
7
- data.tar.gz: a9f4ef692d5f8eeaa0d11292e1804bda3f3dbad3bc62c3d1c97af5365f0cb4c07761f23e65f1417c36119580e3a2e1d8f31cde880098c625a1a500e08a1c1f75
6
+ metadata.gz: aa1d00cbc158511c2a1e7c1aa8ce0dc432a161eae627ac4e0cf624c0214a2974f00bc4f756f9cde48b5405794cbbf5d73cc2778b41fc6ee04c047ac02851270d
7
+ data.tar.gz: b731ec46291d842e627c3c606af0f143705945d759b0aca7851255c56cb09f848f04a96691cc31ea15f65748231a51f172af16eccb47984390d4ff2c604947b9
@@ -7,7 +7,7 @@ end
7
7
  # This is a sanity check to make sure no one is attempting to install
8
8
  # this into an early Vagrant version.
9
9
  if Vagrant::VERSION < '1.4.0'
10
- fail 'The Vagrant Proxmox plugin is only compatible with Vagrant 1.2+'
10
+ fail 'The Vagrant Proxmox plugin is only compatible with Vagrant 1.4+'
11
11
  end
12
12
 
13
13
  if RUBY_VERSION.to_i < 2
@@ -46,8 +46,8 @@ module VagrantPlugins
46
46
  b2.use MessageUploadServerError
47
47
  end
48
48
  end
49
- elsif env1[:machine].provider_config.vm_type == :qemu
50
- b1.use Call, UploadIsoFile do |env2, b2|
49
+ elsif env1[:machine].provider_config.vm_type == :lxc
50
+ b1.use Call, UploadTemplateFile do |env2, b2|
51
51
  if env2[:result] == :ok
52
52
  b2.use CreateVm
53
53
  b2.use StartVm
@@ -58,6 +58,34 @@ module VagrantPlugins
58
58
  b2.use MessageUploadServerError
59
59
  end
60
60
  end
61
+ elsif env1[:machine].provider_config.vm_type == :qemu
62
+ if env1[:machine].provider_config.qemu_iso
63
+ b1.use Call, UploadIsoFile do |env2, b2|
64
+ if env2[:result] == :ok
65
+ b2.use CreateVm
66
+ b2.use StartVm
67
+ b2.use SyncFolders
68
+ elsif env2[:result] == :file_not_found
69
+ b2.use MessageFileNotFound
70
+ elsif env2[:result] == :server_upload_error
71
+ b2.use MessageUploadServerError
72
+ end
73
+ end
74
+ else
75
+ b1.use CloneVm
76
+ b1.use Call, IsCreated do |env2, b2|
77
+ if env2[:result]
78
+ b2.use AdjustForwardedPortParams
79
+ b2.use ConfigClone
80
+ b2.use StartVm
81
+ b2.use SyncFolders
82
+ elsif env2[:result] == :file_not_found
83
+ b2.use MessageFileNotFound
84
+ elsif env2[:result] == :server_upload_error
85
+ b2.use MessageUploadServerError
86
+ end
87
+ end
88
+ end
61
89
  end
62
90
  end
63
91
  end
@@ -134,6 +162,9 @@ module VagrantPlugins
134
162
  Vagrant::Action::Builder.new.tap do |b|
135
163
  b.use ConfigValidate
136
164
  b.use ConnectProxmox
165
+ b.use GetNodeList
166
+ b.use SelectNode
167
+ b.use AdjustForwardedPortParams
137
168
  b.use ReadSSHInfo
138
169
  end
139
170
  end
@@ -163,9 +194,9 @@ module VagrantPlugins
163
194
  b.use Call, IsCreated do |env1, b1|
164
195
  if env1[:result]
165
196
  b1.use Call, IsStopped do |env2, b2|
166
- if env2[:result]
197
+ if env2[:result]
167
198
  b2.use MessageNotRunning
168
- else
199
+ else
169
200
  b2.use SSHRun
170
201
  end
171
202
  end
@@ -191,6 +222,9 @@ module VagrantPlugins
191
222
  autoload :MessageFileNotFound, action_root.join('message_file_not_found')
192
223
  autoload :MessageUploadServerError, action_root.join('message_upload_server_error')
193
224
  autoload :CreateVm, action_root.join('create_vm')
225
+ autoload :CloneVm, action_root.join('clone_vm')
226
+ autoload :AdjustForwardedPortParams, action_root.join('adjust_forwarded_port_params')
227
+ autoload :ConfigClone, action_root.join('config_clone')
194
228
  autoload :StartVm, action_root.join('start_vm')
195
229
  autoload :StopVm, action_root.join('stop_vm')
196
230
  autoload :ShutdownVm, action_root.join('shutdown_vm')
@@ -0,0 +1,42 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action creates a new virtual machine on the Proxmox server and
6
+ # stores its node and vm_id env[:machine].id
7
+ class AdjustForwardedPortParams < ProxmoxAction
8
+
9
+ def initialize app, env
10
+ @app = app
11
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::adjust_forwarded_port_params'
12
+ end
13
+
14
+ def call env
15
+ env[:ui].info I18n.t('vagrant_proxmox.adjust_forwarded_port_params')
16
+ config = env[:machine].provider_config
17
+ node = env[:proxmox_selected_node]
18
+ vm_id = nil
19
+
20
+ begin
21
+ vm_id = env[:machine].id.split("/").last
22
+ node_ip = env[:proxmox_connection].get_node_ip(node, 'vmbr0')
23
+ env[:machine].config.vm.networks.each do |type, options|
24
+ next if type != :forwarded_port
25
+ if options[:id] == "ssh"
26
+ # Provisioning and vagrant ssh will use this
27
+ # high port of the selected proxmox node
28
+ options[:auto_correct] = false
29
+ options[:host_ip] = node_ip
30
+ options[:host] = sprintf("22%03d", vm_id.to_i).to_i
31
+ env[:machine].config.ssh.host = node_ip
32
+ env[:machine].config.ssh.port = sprintf("22%03d", vm_id.to_i).to_s
33
+ break
34
+ end
35
+ end
36
+ end
37
+ next_action env
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,55 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action clones from a qemu template on the Proxmox server and
6
+ # stores its node and vm_id env[:machine].id
7
+ class CloneVm < ProxmoxAction
8
+
9
+ def initialize app, env
10
+ @app = app
11
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::clone_vm'
12
+ end
13
+
14
+ def call env
15
+ env[:ui].info I18n.t('vagrant_proxmox.cloning_vm')
16
+ config = env[:machine].provider_config
17
+
18
+ node = env[:proxmox_selected_node]
19
+ vm_id = nil
20
+ template_vm_id = nil
21
+
22
+ begin
23
+ template_vm_id = connection(env).get_qemu_template_id(config.qemu_template)
24
+ rescue StandardError => e
25
+ raise VagrantPlugins::Proxmox::Errors::VMCloneError, proxmox_exit_status: e.message
26
+ end
27
+
28
+ begin
29
+ vm_id = connection(env).get_free_vm_id
30
+ params = create_params_qemu(config, env, vm_id, template_vm_id)
31
+ exit_status = connection(env).clone_vm node: node, vm_type: config.vm_type, params: params
32
+ exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
33
+ rescue StandardError => e
34
+ raise VagrantPlugins::Proxmox::Errors::VMCloneError, proxmox_exit_status: e.message
35
+ end
36
+
37
+ env[:machine].id = "#{node}/#{vm_id}"
38
+
39
+ env[:ui].info I18n.t('vagrant_proxmox.done')
40
+ next_action env
41
+ end
42
+
43
+ private
44
+ def create_params_qemu(config, env, vm_id, template_vm_id)
45
+ # without network, which will added in ConfigClonedVm
46
+ {vmid: template_vm_id,
47
+ newid: vm_id,
48
+ name: env[:machine].config.vm.hostname || env[:machine].name.to_s,
49
+ description: "#{config.vm_name_prefix}#{env[:machine].name}"}
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,98 @@
1
+ module VagrantPlugins
2
+ module Proxmox
3
+ module Action
4
+
5
+ # This action modifies the configuration of a cloned vm
6
+ # Basically it creates a user network interface with hostfwd for the provisioning
7
+ # and an interface for every public or private interface defined in the Vagrantfile
8
+ class ConfigClone < ProxmoxAction
9
+
10
+ def initialize app, env
11
+ @app = app
12
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::config_clone'
13
+ @node_ip = nil
14
+ @guest_port = nil
15
+ end
16
+
17
+ def call env
18
+ env[:ui].info I18n.t('vagrant_proxmox.configuring_vm')
19
+ config = env[:machine].provider_config
20
+ node = env[:proxmox_selected_node]
21
+ vm_id = nil
22
+
23
+ begin
24
+ vm_id = env[:machine].id.split("/").last
25
+ @node_ip = connection(env).get_node_ip(node, 'vmbr0') if config.vm_type == :qemu
26
+ @guest_port = sprintf("22%03d", vm_id.to_i).to_s
27
+ rescue StandardError => e
28
+ raise VagrantPlugins::Proxmox::Errors::VMConfigError, proxmox_exit_status: e.message
29
+ end
30
+
31
+ begin
32
+ template_config = connection(env).get_vm_config node: node, vm_id: vm_id, vm_type: config.vm_type
33
+ params = create_params_qemu(config, env, vm_id, template_config)
34
+ exit_status = connection(env).config_clone node: node, vm_type: config.vm_type, params: params
35
+ exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
36
+ rescue StandardError => e
37
+ raise VagrantPlugins::Proxmox::Errors::VMConfigError, proxmox_exit_status: e.message
38
+ end
39
+
40
+ env[:ui].info I18n.t('vagrant_proxmox.done')
41
+ next_action env
42
+ end
43
+
44
+ private
45
+ def create_params_qemu(provider_config, env, vm_id, template_config)
46
+ vm_config = env[:machine].config.vm
47
+ params = {
48
+ vmid: vm_id,
49
+ description: "#{provider_config.vm_name_prefix}#{env[:machine].name}",
50
+ }
51
+ # delete existing network interfaces from template
52
+ to_delete = template_config.keys.select{|key| key.to_s.match(/^net/) }
53
+ params[:delete] = to_delete.join(",") if not to_delete.empty?
54
+ # net0 is the provisioning network, derived from forwarded_port
55
+ net_num = 0
56
+ hostname = vm_config.hostname || env[:machine].name
57
+ netdev0 = [
58
+ "type=user",
59
+ "id=net0",
60
+ "hostname=#{hostname}",
61
+ "hostfwd=tcp:#{@node_ip}:#{@guest_port}-:22", # selected_node's primary ip and port (22000 + vm_id)
62
+ ]
63
+ device0 = [
64
+ "#{provider_config.qemu_nic_model}",
65
+ "netdev=net0",
66
+ "bus=pci.0",
67
+ "addr=0x12", # starting point for network interfaces
68
+ "id=net0",
69
+ "bootindex=299"
70
+ ]
71
+ params[:args] = "-netdev " + netdev0.join(",") + " -device " + device0.join(",")
72
+ # now add a network device for every public_network or private_network
73
+ # ip addresses are ignored here, as we can't configure anything inside the qemu vm.
74
+ # at least we can set the predefined mac address and a bridge
75
+ net_num += 1
76
+ vm_config.networks.each do |type, options|
77
+ next if not type.match(/^p.*_network$/)
78
+ nic = provider_config.qemu_nic_model
79
+ nic += "=#{options[:macaddress]}" if options[:macaddress]
80
+ nic += ",bridge=#{options[:bridge]}" if options[:bridge]
81
+ net = 'net' + net_num.to_s
82
+ params[net] = nic
83
+ net_num += 1
84
+ end
85
+
86
+ # some more individual settings
87
+ params[:ide2] = "#{provider_config.qemu_iso},media=cdrom" if provider_config.qemu_iso
88
+ params[:sockets] = "#{provider_config.qemu_sockets}".to_i if provider_config.qemu_sockets
89
+ params[:cores] = "#{provider_config.qemu_cores}".to_i if provider_config.qemu_cores
90
+ params[:balloon] = "#{provider_config.vm_memory}".to_i if provider_config.vm_memory and provider_config.vm_memory < template_config[:balloon]
91
+ params[:memory] = "#{provider_config.vm_memory}".to_i if provider_config.vm_memory
92
+ params
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+ end
@@ -21,6 +21,7 @@ module VagrantPlugins
21
21
  begin
22
22
  vm_id = connection(env).get_free_vm_id
23
23
  params = create_params_openvz(config, env, vm_id) if config.vm_type == :openvz
24
+ params = create_params_lxc(config, env, vm_id) if config.vm_type == :lxc
24
25
  params = create_params_qemu(config, env, vm_id) if config.vm_type == :qemu
25
26
  exit_status = connection(env).create_vm node: node, vm_type: config.vm_type, params: params
26
27
  exit_status == 'OK' ? exit_status : raise(VagrantPlugins::Proxmox::Errors::ProxmoxTaskFailed, proxmox_exit_status: exit_status)
@@ -62,6 +63,20 @@ module VagrantPlugins
62
63
  params[:ip_address] = get_machine_ip_address(env) if get_machine_ip_address(env)
63
64
  end
64
65
  end
66
+
67
+ private
68
+ def create_params_lxc(config, env, vm_id)
69
+ {vmid: vm_id,
70
+ ostemplate: config.openvz_os_template,
71
+ hostname: env[:machine].config.vm.hostname || env[:machine].name.to_s,
72
+ password: 'vagrant',
73
+ storage: "#{config.vm_storage}:#{config.vm_disk_size}",
74
+ memory: config.vm_memory,
75
+ description: "#{config.vm_name_prefix}#{env[:machine].name}"}
76
+ .tap do |params|
77
+ params[:net0] = "name=#{get_machine_interface_name(env)},ip=#{get_machine_ip_address(env)}/24,gw=#{get_machine_gw_ip(env)},bridge=#{get_machine_bridge_name(env)}" if get_machine_ip_address(env)
78
+ end
79
+ end
65
80
  end
66
81
  end
67
82
  end
@@ -11,8 +11,28 @@ module VagrantPlugins
11
11
 
12
12
  protected
13
13
  def get_machine_ip_address env
14
- env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:ip] rescue nil
14
+ config = env[:machine].provider_config
15
+ if config.vm_type == :qemu
16
+ env[:machine].config.vm.networks.select { |type, _| type == :forwarded_port }.first[1][:host_ip] rescue nil
17
+ else
18
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:ip] rescue nil
19
+ end
15
20
  end
21
+
22
+ protected
23
+ def get_machine_interface_name env
24
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:interface] rescue nil
25
+ end
26
+
27
+ protected
28
+ def get_machine_bridge_name env
29
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:bridge] rescue nil
30
+ end
31
+
32
+ protected
33
+ def get_machine_gw_ip env
34
+ env[:machine].config.vm.networks.select { |type, _| type == :public_network }.first[1][:gw] rescue nil
35
+ end
16
36
 
17
37
  protected
18
38
  def get_machine_macaddress env
@@ -7,12 +7,14 @@ module VagrantPlugins
7
7
 
8
8
  def initialize app, env
9
9
  @app = app
10
+ @logger = Log4r::Logger.new 'vagrant_proxmox::action::read_ssh_info'
10
11
  end
11
12
 
12
13
  def call env
13
14
  env[:machine_ssh_info] = get_machine_ip_address(env).try do |ip_address|
14
15
  {host: ip_address, port: env[:machine].config.ssh.guest_port}
15
16
  end
17
+ env[:machine_ssh_info]
16
18
  next_action env
17
19
  end
18
20
 
@@ -22,7 +22,7 @@ module VagrantPlugins
22
22
  # @return [String]
23
23
  attr_accessor :password
24
24
 
25
- # The virtual machine type, e.g. :openvz or :qemu
25
+ # The virtual machine type, e.g. :openvz or :qemu or :lxc
26
26
  #
27
27
  # @return [Symbol]
28
28
  attr_accessor :vm_type
@@ -57,6 +57,17 @@ module VagrantPlugins
57
57
  # @return [Integer]
58
58
  attr_accessor :vm_memory
59
59
 
60
+ # The vm disk size to use for the virtual machine, e.g. '30G'
61
+ #
62
+ # @return [String]
63
+ attr_accessor :vm_disk_size
64
+
65
+ # The vm storage to use for the virtual machine, e.g. 'local', 'raid', 'cephstore'
66
+ # defaults to 'raid' for backwards compatability
67
+ #
68
+ # @return [String]
69
+ attr_accessor :vm_storage
70
+
60
71
  # The maximum timeout for a proxmox server task (in seconds)
61
72
  #
62
73
  # @return [Integer]
@@ -97,6 +108,11 @@ module VagrantPlugins
97
108
  # @return [Integer]
98
109
  attr_accessor :qemu_sockets
99
110
 
111
+ # The qemu template to clone for the virtual machine
112
+ #
113
+ # @return [String]
114
+ attr_accessor :qemu_template
115
+
100
116
  # The qemu iso file to use for the virtual machine
101
117
  #
102
118
  # @return [String]
@@ -147,6 +163,8 @@ module VagrantPlugins
147
163
  @vm_id_range = 900..999
148
164
  @vm_name_prefix = 'vagrant_'
149
165
  @vm_memory = 512
166
+ @vm_disk_size = '20G'
167
+ @vm_storage = 'local'
150
168
  @task_timeout = 60
151
169
  @task_status_check_interval = 2
152
170
  @ssh_timeout = 60
@@ -155,6 +173,7 @@ module VagrantPlugins
155
173
  @qemu_os = UNSET_VALUE
156
174
  @qemu_cores = 1
157
175
  @qemu_sockets = 1
176
+ @qemu_template = UNSET_VALUE
158
177
  @qemu_iso = UNSET_VALUE
159
178
  @qemu_iso_file = UNSET_VALUE
160
179
  @replace_qemu_iso_file = false
@@ -174,12 +193,14 @@ module VagrantPlugins
174
193
  @openvz_template_file = nil if @openvz_template_file == UNSET_VALUE
175
194
  @openvz_os_template = "local:vztmpl/#{File.basename @openvz_template_file}" if @openvz_template_file
176
195
  @openvz_os_template = nil if @openvz_os_template == UNSET_VALUE
196
+ @qemu_template = nil if @qemu_os == UNSET_VALUE
177
197
  @qemu_os = nil if @qemu_os == UNSET_VALUE
178
198
  @qemu_iso_file = nil if @qemu_iso_file == UNSET_VALUE
179
199
  @qemu_iso = "local:iso/#{File.basename @qemu_iso_file}" if @qemu_iso_file
180
200
  @qemu_iso = nil if @qemu_iso == UNSET_VALUE
181
201
  @qemu_disk_size = nil if @qemu_disk_size == UNSET_VALUE
182
202
  @qemu_disk_size = convert_disk_size_to_gigabyte @qemu_disk_size if @qemu_disk_size
203
+ @vm_disk_size = convert_disk_size_to_gigabyte @vm_disk_size if @vm_disk_size
183
204
  end
184
205
 
185
206
  def validate machine
@@ -192,9 +213,12 @@ module VagrantPlugins
192
213
  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
193
214
  end
194
215
  if @vm_type == :qemu
195
- errors << I18n.t('vagrant_proxmox.errors.no_qemu_os_specified_for_vm_type_qemu') unless @qemu_os
196
- errors << I18n.t('vagrant_proxmox.errors.no_qemu_iso_or_qemu_iso_file_specified_for_vm_type_qemu') unless @qemu_iso || @qemu_iso_file
197
- errors << I18n.t('vagrant_proxmox.errors.no_qemu_disk_size_specified_for_vm_type_qemu') unless @qemu_disk_size
216
+ if @qemu_template
217
+ else
218
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_os_specified_for_vm_type_qemu') unless @qemu_os
219
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_iso_or_qemu_iso_file_specified_for_vm_type_qemu') unless @qemu_iso || @qemu_iso_file
220
+ errors << I18n.t('vagrant_proxmox.errors.no_qemu_disk_size_specified_for_vm_type_qemu') unless @qemu_disk_size
221
+ end
198
222
  end
199
223
  {'Proxmox Provider' => errors}
200
224
  end
@@ -30,6 +30,18 @@ module VagrantPlugins
30
30
  error_key :vm_create_error
31
31
  end
32
32
 
33
+ class VMCloneError < VagrantProxmoxError
34
+ error_key :vm_clone_error
35
+ end
36
+
37
+ class NoTemplateAvailable < VagrantProxmoxError
38
+ error_key :no_template_available
39
+ end
40
+
41
+ class VMConfigError < VagrantProxmoxError
42
+ error_key :vm_configure_error
43
+ end
44
+
33
45
  class VMDestroyError < VagrantProxmoxError
34
46
  error_key :vm_destroy_error
35
47
  end
@@ -100,6 +100,34 @@ module VagrantPlugins
100
100
  wait_for_completion task_response: response, timeout_message: 'vagrant_proxmox.errors.create_vm_timeout'
101
101
  end
102
102
 
103
+ def clone_vm node: required('node'), vm_type: required('node'), params: required('params')
104
+ vm_id = params[:vmid]
105
+ params.delete(:vmid)
106
+ params.delete(:ostype)
107
+ params.delete(:ide2)
108
+ params.delete(:sata0)
109
+ params.delete(:sockets)
110
+ params.delete(:cores)
111
+ params.delete(:description)
112
+ params.delete(:memory)
113
+ params.delete(:net0)
114
+ response = post "/nodes/#{node}/#{vm_type}/#{vm_id}/clone", params
115
+ wait_for_completion task_response: response, timeout_message: 'vagrant_proxmox.errors.create_vm_timeout'
116
+ end
117
+
118
+ def config_clone node: required('node'), vm_type: required('node'), params: required('params')
119
+ vm_id = params[:vmid]
120
+ params.delete(:vmid)
121
+ response = post "/nodes/#{node}/#{vm_type}/#{vm_id}/config", params
122
+ wait_for_completion task_response: response, timeout_message: 'vagrant_proxmox.errors.create_vm_timeout'
123
+ end
124
+
125
+ def get_vm_config node: required('node'), vm_id: required('node'), vm_type: required('node')
126
+ response = get "/nodes/#{node}/#{vm_type}/#{vm_id}/config"
127
+ response = response[:data]
128
+ response.empty? ? raise(VagrantPlugins::Proxmox::Errors::VMConfigError) : response
129
+ end
130
+
103
131
  def start_vm vm_id
104
132
  vm_info = get_vm_info vm_id
105
133
  response = post "/nodes/#{vm_info[:node]}/#{vm_info[:type]}/#{vm_id}/status/start", nil
@@ -119,6 +147,8 @@ module VagrantPlugins
119
147
  end
120
148
 
121
149
  def get_free_vm_id
150
+ # to avoid collisions in multi-vm setups
151
+ sleep (rand(1..3) + 0.1 * rand(0..9))
122
152
  response = get "/cluster/resources?type=vm"
123
153
  allowed_vm_ids = vm_id_range.to_set
124
154
  used_vm_ids = response[:data].map { |vm| vm[:vmid] }
@@ -126,6 +156,12 @@ module VagrantPlugins
126
156
  free_vm_ids.empty? ? raise(VagrantPlugins::Proxmox::Errors::NoVmIdAvailable) : free_vm_ids.first
127
157
  end
128
158
 
159
+ def get_qemu_template_id template
160
+ response = get "/cluster/resources?type=vm"
161
+ found_ids = response[:data].select { |vm| vm[:type] == 'qemu' }.select { |vm| vm[:template] == 1 }.select { |vm| vm[:name] == template }.map { |vm| vm[:vmid] }
162
+ found_ids.empty? ? raise(VagrantPlugins::Proxmox::Errors::NoTemplateAvailable) : found_ids.first
163
+ end
164
+
129
165
  def upload_file file, content_type: required('content_type'), node: required('node'), storage: required('storage'), replace: false
130
166
  delete_file(filename: file, content_type: content_type, node: node, storage: storage) if replace
131
167
  unless is_file_in_storage? filename: file, node: node, storage: storage
@@ -144,6 +180,15 @@ module VagrantPlugins
144
180
  res[:data].map { |e| e[:volid] }
145
181
  end
146
182
 
183
+ def get_node_ip node, interface
184
+ begin
185
+ response = get "/nodes/#{node}/network/#{interface}"
186
+ response[:data][:address]
187
+ rescue ApiError::ServerError
188
+ :not_created
189
+ end
190
+ end
191
+
147
192
  # This is called every time to retrieve the node and vm_type, hence on large
148
193
  # installations this could be a huge amount of data. Probably an optimization
149
194
  # with a buffer for the machine info could be considered.
@@ -222,4 +267,5 @@ module VagrantPlugins
222
267
  end
223
268
  end
224
269
  end
225
- end
270
+ end
271
+
@@ -1,7 +1,7 @@
1
1
  module VagrantPlugins
2
2
  module Proxmox
3
3
 
4
- VERSION = '0.0.9'
4
+ VERSION = '0.0.10'
5
5
 
6
6
  end
7
7
  end
@@ -3,23 +3,26 @@ require 'vagrant-proxmox/provider'
3
3
 
4
4
  module VagrantPlugins::Proxmox
5
5
 
6
- describe Provider do
6
+ describe Provider do
7
7
 
8
- let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
9
- let(:machine) { environment.machine(environment.primary_machine_name, :proxmox) }
10
- let(:ui) { double('ui').as_null_object }
8
+ let(:machine) { environment.machine(environment.primary_machine_name, :proxmox) }
9
+ let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
10
+ let(:ui) { double('ui').as_null_object }
11
11
 
12
- subject { described_class.new(machine) }
12
+ subject { described_class.new(machine) }
13
13
 
14
- describe '#ssh_info', :need_box do
15
- it 'should call the appropriate actions and return the ssh info' do
16
- expect(Action::ConfigValidate).to be_called
17
- expect(Action::ConnectProxmox).to be_called
18
- expect(Action::ReadSSHInfo).to be_called { |env| env[:machine_ssh_info] = 'ssh_info'}
19
- expect(subject.ssh_info).to eq('ssh_info')
20
- end
21
- end
14
+ describe '#ssh_info', :need_box do
15
+ it 'should call the appropriate actions and return the ssh info' do
16
+ expect(Action::ConfigValidate).to be_called
17
+ expect(Action::ConnectProxmox).to be_called
18
+ expect(Action::GetNodeList).to be_called
19
+ expect(Action::SelectNode).to be_called
20
+ expect(Action::AdjustForwardedPortParams).to be_called
21
+ expect(Action::ReadSSHInfo).to be_called { |env| env[:machine_ssh_info] = 'ssh_info' }
22
+ expect(subject.ssh_info).to eq('ssh_info')
23
+ end
24
+ end
22
25
 
23
- end
26
+ end
24
27
 
25
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-proxmox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dirk Grappendorf
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-06-01 00:00:00.000000000 Z
13
+ date: 2016-03-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
@@ -58,16 +58,16 @@ dependencies:
58
58
  name: rake
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ">="
61
+ - - '='
62
62
  - !ruby/object:Gem::Version
63
- version: '0'
63
+ version: 10.5.0
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ">="
68
+ - - '='
69
69
  - !ruby/object:Gem::Version
70
- version: '0'
70
+ version: 10.5.0
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rspec
73
73
  requirement: !ruby/object:Gem::Requirement
@@ -221,7 +221,10 @@ files:
221
221
  - lib/sanity_checks.rb
222
222
  - lib/vagrant-proxmox.rb
223
223
  - lib/vagrant-proxmox/action.rb
224
+ - lib/vagrant-proxmox/action/adjust_forwarded_port_params.rb
224
225
  - lib/vagrant-proxmox/action/cleanup_after_destroy.rb
226
+ - lib/vagrant-proxmox/action/clone_vm.rb
227
+ - lib/vagrant-proxmox/action/config_clone.rb
225
228
  - lib/vagrant-proxmox/action/connect_proxmox.rb
226
229
  - lib/vagrant-proxmox/action/create_vm.rb
227
230
  - lib/vagrant-proxmox/action/destroy_vm.rb
@@ -312,48 +315,48 @@ required_rubygems_version: !ruby/object:Gem::Requirement
312
315
  version: '0'
313
316
  requirements: []
314
317
  rubyforge_project:
315
- rubygems_version: 2.4.6
318
+ rubygems_version: 2.4.8
316
319
  signing_key:
317
320
  specification_version: 4
318
321
  summary: Enables Vagrant to manage virtual machines on a Proxmox server.
319
322
  test_files:
320
- - spec/actions/message_already_running_action_spec.rb
321
- - spec/actions/destroy_vm_action_spec.rb
322
- - spec/actions/start_vm_action_spec.rb
323
+ - spec/config_spec.rb
324
+ - spec/spec_helpers/time_helpers.rb
325
+ - spec/spec_helpers/common_helpers.rb
326
+ - spec/actions/is_created_action_spec.rb
323
327
  - spec/actions/proxmox_action_shared.rb
324
- - spec/actions/sync_folders_action_spec.rb
325
- - spec/actions/connect_proxmox_action_spec.rb
326
- - spec/actions/cleanup_after_destroy_action_spec.rb
327
- - spec/actions/is_stopped_action_spec.rb
328
328
  - spec/actions/read_ssh_info_action_spec.rb
329
- - spec/actions/create_vm_action_spec.rb
330
- - spec/actions/proxmox_action_spec.rb
331
329
  - spec/actions/shutdown_vm_action_spec.rb
332
- - spec/actions/read_state_action_spec.rb
333
- - spec/actions/message_already_stopped_action_spec.rb
330
+ - spec/actions/destroy_vm_action_spec.rb
331
+ - spec/actions/cleanup_after_destroy_action_spec.rb
332
+ - spec/actions/select_node_spec.rb
334
333
  - spec/actions/stop_vm_action_spec.rb
334
+ - spec/actions/message_file_not_found_spec.rb
335
+ - spec/actions/read_state_action_spec.rb
336
+ - spec/actions/message_not_created_action_spec.rb
337
+ - spec/actions/create_vm_action_spec.rb
338
+ - spec/actions/start_vm_action_spec.rb
339
+ - spec/actions/message_already_running_action_spec.rb
340
+ - spec/actions/connect_proxmox_action_spec.rb
341
+ - spec/actions/get_node_list_action_spec.rb
335
342
  - spec/actions/upload_template_file_action_spec.rb
336
- - spec/actions/select_node_spec.rb
343
+ - spec/actions/message_not_running_action_spec.rb
344
+ - spec/actions/proxmox_action_spec.rb
337
345
  - spec/actions/upload_iso_file_action_spec.rb
338
- - spec/actions/message_not_created_action_spec.rb
346
+ - spec/actions/sync_folders_action_spec.rb
347
+ - spec/actions/is_stopped_action_spec.rb
348
+ - spec/actions/message_already_stopped_action_spec.rb
339
349
  - spec/actions/message_upload_server_error_spec.rb
340
- - spec/actions/message_not_running_action_spec.rb
341
- - spec/actions/get_node_list_action_spec.rb
342
- - spec/actions/message_file_not_found_spec.rb
343
- - spec/actions/is_created_action_spec.rb
344
- - spec/plugin_spec.rb
345
- - spec/spec_helper.rb
346
- - spec/sanity_checks_spec.rb
347
- - spec/proxmox/connection_spec.rb
348
- - spec/proxmox/rest_call_shared.rb
349
- - spec/commands/ssh_command_spec.rb
350
- - spec/commands/provision_command_spec.rb
351
350
  - spec/commands/up_command_spec.rb
352
- - spec/commands/destroy_command_spec.rb
353
- - spec/commands/ssh_run_command_spec.rb
354
351
  - spec/commands/halt_command_spec.rb
352
+ - spec/commands/provision_command_spec.rb
353
+ - spec/commands/ssh_run_command_spec.rb
354
+ - spec/commands/destroy_command_spec.rb
355
+ - spec/commands/ssh_command_spec.rb
355
356
  - spec/commands/status_command_spec.rb
356
- - spec/config_spec.rb
357
+ - spec/sanity_checks_spec.rb
358
+ - spec/spec_helper.rb
359
+ - spec/proxmox/connection_spec.rb
360
+ - spec/proxmox/rest_call_shared.rb
361
+ - spec/plugin_spec.rb
357
362
  - spec/provider_spec.rb
358
- - spec/spec_helpers/time_helpers.rb
359
- - spec/spec_helpers/common_helpers.rb