vagrant-libvirt 0.0.42 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +393 -147
  3. data/lib/vagrant-libvirt/action.rb +3 -2
  4. data/lib/vagrant-libvirt/action/create_domain.rb +87 -37
  5. data/lib/vagrant-libvirt/action/create_domain_volume.rb +19 -14
  6. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +9 -5
  7. data/lib/vagrant-libvirt/action/create_networks.rb +7 -2
  8. data/lib/vagrant-libvirt/action/destroy_domain.rb +1 -1
  9. data/lib/vagrant-libvirt/action/destroy_networks.rb +5 -0
  10. data/lib/vagrant-libvirt/action/forward_ports.rb +10 -8
  11. data/lib/vagrant-libvirt/action/halt_domain.rb +1 -1
  12. data/lib/vagrant-libvirt/action/handle_box_image.rb +26 -15
  13. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +9 -4
  14. data/lib/vagrant-libvirt/action/package_domain.rb +58 -12
  15. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +3 -9
  16. data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +19 -9
  17. data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +2 -2
  18. data/lib/vagrant-libvirt/action/remove_stale_volume.rb +17 -11
  19. data/lib/vagrant-libvirt/action/set_boot_order.rb +2 -2
  20. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +6 -9
  21. data/lib/vagrant-libvirt/action/start_domain.rb +2 -2
  22. data/lib/vagrant-libvirt/action/wait_till_up.rb +31 -16
  23. data/lib/vagrant-libvirt/cap/public_address.rb +16 -0
  24. data/lib/vagrant-libvirt/cap/synced_folder.rb +3 -3
  25. data/lib/vagrant-libvirt/config.rb +177 -29
  26. data/lib/vagrant-libvirt/driver.rb +31 -2
  27. data/lib/vagrant-libvirt/errors.rb +5 -1
  28. data/lib/vagrant-libvirt/plugin.rb +7 -2
  29. data/lib/vagrant-libvirt/templates/default_storage_pool.xml.erb +3 -3
  30. data/lib/vagrant-libvirt/templates/domain.xml.erb +48 -8
  31. data/lib/vagrant-libvirt/util.rb +1 -0
  32. data/lib/vagrant-libvirt/util/erb_template.rb +6 -7
  33. data/lib/vagrant-libvirt/util/network_util.rb +33 -13
  34. data/lib/vagrant-libvirt/util/nfs.rb +17 -0
  35. data/lib/vagrant-libvirt/util/storage_util.rb +27 -0
  36. data/lib/vagrant-libvirt/version.rb +1 -1
  37. data/locales/en.yml +8 -4
  38. data/spec/support/environment_helper.rb +1 -1
  39. data/spec/support/libvirt_context.rb +1 -1
  40. data/spec/support/sharedcontext.rb +2 -2
  41. data/spec/unit/action/destroy_domain_spec.rb +2 -2
  42. data/spec/unit/action/set_name_of_domain_spec.rb +3 -3
  43. data/spec/unit/config_spec.rb +173 -0
  44. data/spec/unit/templates/domain_all_settings.xml +20 -4
  45. data/spec/unit/templates/domain_custom_cpu_model.xml +48 -0
  46. data/spec/unit/templates/domain_defaults.xml +2 -0
  47. data/spec/unit/templates/domain_spec.rb +26 -2
  48. metadata +24 -32
  49. data/.coveralls.yml +0 -1
  50. data/.github/issue_template.md +0 -37
  51. data/.gitignore +0 -21
  52. data/.travis.yml +0 -24
  53. data/Gemfile +0 -26
  54. data/Rakefile +0 -8
  55. data/example_box/README.md +0 -29
  56. data/example_box/Vagrantfile +0 -60
  57. data/example_box/metadata.json +0 -5
  58. data/tools/create_box.sh +0 -130
  59. data/tools/prepare_redhat_for_box.sh +0 -119
  60. data/vagrant-libvirt.gemspec +0 -54
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderLibvirt
3
+ module Cap
4
+ class PublicAddress
5
+ def self.public_address(machine)
6
+ # This does not need to be a globally routable address, it
7
+ # only needs to be accessible from the machine running
8
+ # Vagrant.
9
+ ssh_info = machine.ssh_info
10
+ return nil if !ssh_info
11
+ ssh_info[:host]
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -20,7 +20,7 @@ module VagrantPlugins
20
20
  end
21
21
 
22
22
  def usable?(machine, _raise_error = false)
23
- # bail now if not using libvirt since checking version would throw error
23
+ # bail now if not using Libvirt since checking version would throw error
24
24
  return false unless machine.provider_name == :libvirt
25
25
 
26
26
  # <filesystem/> support in device attach/detach introduced in 1.2.2
@@ -30,7 +30,7 @@ module VagrantPlugins
30
30
  end
31
31
 
32
32
  def prepare(machine, folders, _opts)
33
- raise Vagrant::Errors::Error('No libvirt connection') if machine.provider.driver.connection.nil?
33
+ raise Vagrant::Errors::Error('No Libvirt connection') if machine.provider.driver.connection.nil?
34
34
  @conn = machine.provider.driver.connection.client
35
35
 
36
36
  begin
@@ -89,7 +89,7 @@ module VagrantPlugins
89
89
 
90
90
  def cleanup(machine, _opts)
91
91
  if machine.provider.driver.connection.nil?
92
- raise Vagrant::Errors::Error('No libvirt connection')
92
+ raise Vagrant::Errors::Error('No Libvirt connection')
93
93
  end
94
94
  @conn = machine.provider.driver.connection.client
95
95
  begin
@@ -20,12 +20,12 @@ module VagrantPlugins
20
20
  # A hypervisor name to access via Libvirt.
21
21
  attr_accessor :driver
22
22
 
23
- # The name of the server, where libvirtd is running.
23
+ # The name of the server, where Libvirtd is running.
24
24
  attr_accessor :host
25
25
 
26
26
  # If use ssh tunnel to connect to Libvirt.
27
27
  attr_accessor :connect_via_ssh
28
- # Path towards the libvirt socket
28
+ # Path towards the Libvirt socket
29
29
  attr_accessor :socket
30
30
 
31
31
  # The username to access Libvirt.
@@ -40,11 +40,16 @@ module VagrantPlugins
40
40
  # Libvirt storage pool name, where box image and instance snapshots will
41
41
  # be stored.
42
42
  attr_accessor :storage_pool_name
43
+ attr_accessor :storage_pool_path
44
+
45
+ # Libvirt storage pool where the base image snapshot shall be stored
46
+ attr_accessor :snapshot_pool_name
43
47
 
44
48
  # Turn on to prevent hostname conflicts
45
49
  attr_accessor :random_hostname
46
50
 
47
51
  # Libvirt default network
52
+ attr_accessor :management_network_device
48
53
  attr_accessor :management_network_name
49
54
  attr_accessor :management_network_address
50
55
  attr_accessor :management_network_mode
@@ -53,24 +58,35 @@ module VagrantPlugins
53
58
  attr_accessor :management_network_autostart
54
59
  attr_accessor :management_network_pci_bus
55
60
  attr_accessor :management_network_pci_slot
61
+ attr_accessor :management_network_domain
62
+
63
+ # System connection information
64
+ attr_accessor :system_uri
56
65
 
57
66
  # Default host prefix (alternative to use project folder name)
58
67
  attr_accessor :default_prefix
59
68
 
60
69
  # Domain specific settings used while creating new domain.
70
+ attr_accessor :title
71
+ attr_accessor :description
61
72
  attr_accessor :uuid
62
73
  attr_accessor :memory
74
+ attr_accessor :nodeset
63
75
  attr_accessor :memory_backing
64
76
  attr_accessor :channel
65
77
  attr_accessor :cpus
78
+ attr_accessor :cpuset
66
79
  attr_accessor :cpu_mode
67
80
  attr_accessor :cpu_model
68
81
  attr_accessor :cpu_fallback
69
82
  attr_accessor :cpu_features
70
83
  attr_accessor :cpu_topology
84
+ attr_accessor :shares
71
85
  attr_accessor :features
86
+ attr_accessor :features_hyperv
72
87
  attr_accessor :numa_nodes
73
88
  attr_accessor :loader
89
+ attr_accessor :nvram
74
90
  attr_accessor :boot_order
75
91
  attr_accessor :machine_type
76
92
  attr_accessor :machine_arch
@@ -126,6 +142,9 @@ module VagrantPlugins
126
142
  # Watchdog device
127
143
  attr_accessor :watchdog_dev
128
144
 
145
+ # USB controller
146
+ attr_accessor :usbctl_dev
147
+
129
148
  # USB device passthrough
130
149
  attr_accessor :usbs
131
150
 
@@ -148,6 +167,12 @@ module VagrantPlugins
148
167
  # Additional qemuargs arguments
149
168
  attr_accessor :qemu_args
150
169
 
170
+ # Additional qemuenv arguments
171
+ attr_accessor :qemu_env
172
+
173
+ # Use QEMU session instead of system
174
+ attr_accessor :qemu_use_session
175
+
151
176
  def initialize
152
177
  @uri = UNSET_VALUE
153
178
  @driver = UNSET_VALUE
@@ -157,7 +182,9 @@ module VagrantPlugins
157
182
  @password = UNSET_VALUE
158
183
  @id_ssh_key_file = UNSET_VALUE
159
184
  @storage_pool_name = UNSET_VALUE
185
+ @snapshot_pool_name = UNSET_VALUE
160
186
  @random_hostname = UNSET_VALUE
187
+ @management_network_device = UNSET_VALUE
161
188
  @management_network_name = UNSET_VALUE
162
189
  @management_network_address = UNSET_VALUE
163
190
  @management_network_mode = UNSET_VALUE
@@ -166,20 +193,31 @@ module VagrantPlugins
166
193
  @management_network_autostart = UNSET_VALUE
167
194
  @management_network_pci_slot = UNSET_VALUE
168
195
  @management_network_pci_bus = UNSET_VALUE
196
+ @management_network_domain = UNSET_VALUE
197
+
198
+ # System connection information
199
+ @system_uri = UNSET_VALUE
169
200
 
170
201
  # Domain specific settings.
202
+ @title = UNSET_VALUE
203
+ @description = UNSET_VALUE
171
204
  @uuid = UNSET_VALUE
172
205
  @memory = UNSET_VALUE
206
+ @nodeset = UNSET_VALUE
173
207
  @memory_backing = UNSET_VALUE
174
208
  @cpus = UNSET_VALUE
209
+ @cpuset = UNSET_VALUE
175
210
  @cpu_mode = UNSET_VALUE
176
211
  @cpu_model = UNSET_VALUE
177
212
  @cpu_fallback = UNSET_VALUE
178
213
  @cpu_features = UNSET_VALUE
179
214
  @cpu_topology = UNSET_VALUE
215
+ @shares = UNSET_VALUE
180
216
  @features = UNSET_VALUE
217
+ @features_hyperv = UNSET_VALUE
181
218
  @numa_nodes = UNSET_VALUE
182
219
  @loader = UNSET_VALUE
220
+ @nvram = UNSET_VALUE
183
221
  @machine_type = UNSET_VALUE
184
222
  @machine_arch = UNSET_VALUE
185
223
  @machine_virtual_size = UNSET_VALUE
@@ -231,6 +269,9 @@ module VagrantPlugins
231
269
  # Watchdog device
232
270
  @watchdog_dev = UNSET_VALUE
233
271
 
272
+ # USB controller
273
+ @usbctl_dev = UNSET_VALUE
274
+
234
275
  # USB device passthrough
235
276
  @usbs = UNSET_VALUE
236
277
 
@@ -250,7 +291,13 @@ module VagrantPlugins
250
291
  # Attach mgmt network
251
292
  @mgmt_attach = UNSET_VALUE
252
293
 
253
- @qemu_args = []
294
+ # Additional QEMU commandline arguments
295
+ @qemu_args = UNSET_VALUE
296
+
297
+ # Additional QEMU commandline environment variables
298
+ @qemu_env = UNSET_VALUE
299
+
300
+ @qemu_use_session = UNSET_VALUE
254
301
  end
255
302
 
256
303
  def boot(device)
@@ -282,7 +329,7 @@ module VagrantPlugins
282
329
  end
283
330
  end
284
331
 
285
- # is it better to raise our own error, or let libvirt cause the exception?
332
+ # is it better to raise our own error, or let Libvirt cause the exception?
286
333
  raise 'Only four cdroms may be attached at a time'
287
334
  end
288
335
 
@@ -321,6 +368,17 @@ module VagrantPlugins
321
368
  policy: options[:policy])
322
369
  end
323
370
 
371
+ def hyperv_feature(options = {})
372
+ if options[:name].nil? || options[:state].nil?
373
+ raise 'Feature name AND state must be specified'
374
+ end
375
+
376
+ @features_hyperv = [] if @features_hyperv == UNSET_VALUE
377
+
378
+ @features_hyperv.push(name: options[:name],
379
+ state: options[:state])
380
+ end
381
+
324
382
  def cputopology(options = {})
325
383
  if options[:sockets].nil? || options[:cores].nil? || options[:threads].nil?
326
384
  raise 'CPU topology must have all of sockets, cores and threads specified'
@@ -332,7 +390,7 @@ module VagrantPlugins
332
390
 
333
391
  @cpu_topology[:sockets] = options[:sockets]
334
392
  @cpu_topology[:cores] = options[:cores]
335
- @cpu_topology[:threads] = options[:threads]
393
+ @cpu_topology[:threads] = options[:threads]
336
394
  end
337
395
 
338
396
  def memorybacking(option, config = {})
@@ -400,7 +458,14 @@ module VagrantPlugins
400
458
 
401
459
  @pcis = [] if @pcis == UNSET_VALUE
402
460
 
403
- @pcis.push(bus: options[:bus],
461
+ if options[:domain].nil?
462
+ pci_domain = '0x0000'
463
+ else
464
+ pci_domain = options[:domain]
465
+ end
466
+
467
+ @pcis.push(domain: pci_domain,
468
+ bus: options[:bus],
404
469
  slot: options[:slot],
405
470
  function: options[:function])
406
471
  end
@@ -419,6 +484,19 @@ module VagrantPlugins
419
484
  end
420
485
 
421
486
 
487
+ def usb_controller(options = {})
488
+ if options[:model].nil?
489
+ raise 'USB controller model must be specified.'
490
+ end
491
+
492
+ if @usbctl_dev == UNSET_VALUE
493
+ @usbctl_dev = {}
494
+ end
495
+
496
+ @usbctl_dev[:model] = options[:model]
497
+ @usbctl_dev[:ports] = options[:ports]
498
+ end
499
+
422
500
  def usb(options = {})
423
501
  if (options[:bus].nil? || options[:device].nil?) && options[:vendor].nil? && options[:product].nil?
424
502
  raise 'Bus and device and/or vendor and/or product must be specified. Check `lsusb` for these.'
@@ -447,9 +525,9 @@ module VagrantPlugins
447
525
  @redirfilters = [] if @redirfilters == UNSET_VALUE
448
526
 
449
527
  @redirfilters.push(class: options[:class] || -1,
450
- vendor: options[:class] || -1,
451
- product: options[:class] || -1,
452
- version: options[:class] || -1,
528
+ vendor: options[:vendor] || -1,
529
+ product: options[:product] || -1,
530
+ version: options[:version] || -1,
453
531
  allow: options[:allow])
454
532
  end
455
533
 
@@ -526,23 +604,41 @@ module VagrantPlugins
526
604
  cache: options[:cache] || 'default',
527
605
  allow_existing: options[:allow_existing],
528
606
  shareable: options[:shareable],
529
- serial: options[:serial]
607
+ serial: options[:serial],
608
+ wwn: options[:wwn]
530
609
  }
531
610
 
532
611
  @disks << disk # append
533
612
  end
534
613
 
535
614
  def qemuargs(options = {})
615
+ @qemu_args = [] if @qemu_args == UNSET_VALUE
616
+
536
617
  @qemu_args << options if options[:value]
537
618
  end
538
619
 
539
- # code to generate URI from a config moved out of the connect action
540
- def _generate_uri
541
- # builds the libvirt connection URI from the given driver config
620
+ def qemuenv(options = {})
621
+ @qemu_env = {} if @qemu_env == UNSET_VALUE
622
+
623
+ @qemu_env.merge!(options)
624
+ end
625
+
626
+ # code to generate URI from from either the LIBVIRT_URI environment
627
+ # variable or a config moved out of the connect action
628
+ def _generate_uri(qemu_use_session)
629
+
630
+ # If the LIBVIRT_DEFAULT_URI var is set, we'll use that
631
+ if ENV.fetch('LIBVIRT_DEFAULT_URI', '') != ""
632
+ return ENV['LIBVIRT_DEFAULT_URI']
633
+ end
634
+
635
+ # builds the Libvirt connection URI from the given driver config
542
636
  # Setup connection uri.
543
637
  uri = @driver.dup
544
638
  virt_path = case uri
545
- when 'qemu', 'openvz', 'uml', 'phyp', 'parallels', 'kvm'
639
+ when 'qemu', 'kvm'
640
+ qemu_use_session ? '/session' : '/system'
641
+ when 'openvz', 'uml', 'phyp', 'parallels'
546
642
  '/system'
547
643
  when '@en', 'esx'
548
644
  '/'
@@ -552,38 +648,44 @@ module VagrantPlugins
552
648
  raise "Require specify driver #{uri}"
553
649
  end
554
650
  if uri == 'kvm'
555
- uri = 'qemu' # use qemu uri for kvm domain type
651
+ uri = 'qemu' # use QEMU uri for KVM domain type
556
652
  end
557
653
 
558
654
  if @connect_via_ssh
559
655
  uri << '+ssh://'
560
656
  uri << @username + '@' if @username
561
657
 
562
- uri << if @host
563
- @host
564
- else
565
- 'localhost'
566
- end
658
+ uri << ( @host ? @host : 'localhost' )
567
659
  else
568
660
  uri << '://'
569
661
  uri << @host if @host
570
662
  end
571
663
 
572
664
  uri << virt_path
573
- uri << '?no_verify=1'
665
+
666
+ params = {'no_verify' => '1'}
574
667
 
575
668
  if @id_ssh_key_file
576
- # set ssh key for access to libvirt host
577
- uri << "\&keyfile="
669
+ # set ssh key for access to Libvirt host
578
670
  # if no slash, prepend $HOME/.ssh/
579
- @id_ssh_key_file.prepend("#{`echo ${HOME}`.chomp}/.ssh/") if @id_ssh_key_file !~ /\A\//
580
- uri << @id_ssh_key_file
671
+ @id_ssh_key_file.prepend("#{ENV['HOME']}/.ssh/") if @id_ssh_key_file !~ /\A\//
672
+ params['keyfile'] = @id_ssh_key_file
581
673
  end
582
- # set path to libvirt socket
583
- uri << "\&socket=" + @socket if @socket
674
+ # set path to Libvirt socket
675
+ params['socket'] = @socket if @socket
676
+
677
+ uri << "?" + params.map{|pair| pair.join('=')}.join('&')
584
678
  uri
585
679
  end
586
680
 
681
+ def _parse_uri(uri)
682
+ begin
683
+ URI.parse(uri)
684
+ rescue
685
+ raise "@uri set to invalid uri '#{uri}'"
686
+ end
687
+ end
688
+
587
689
  def finalize!
588
690
  @driver = 'kvm' if @driver == UNSET_VALUE
589
691
  @host = nil if @host == UNSET_VALUE
@@ -592,7 +694,10 @@ module VagrantPlugins
592
694
  @password = nil if @password == UNSET_VALUE
593
695
  @id_ssh_key_file = 'id_rsa' if @id_ssh_key_file == UNSET_VALUE
594
696
  @storage_pool_name = 'default' if @storage_pool_name == UNSET_VALUE
697
+ @snapshot_pool_name = @storage_pool_name if @snapshot_pool_name == UNSET_VALUE
698
+ @storage_pool_path = nil if @storage_pool_path == UNSET_VALUE
595
699
  @random_hostname = false if @random_hostname == UNSET_VALUE
700
+ @management_network_device = 'virbr0' if @management_network_device == UNSET_VALUE
596
701
  @management_network_name = 'vagrant-libvirt' if @management_network_name == UNSET_VALUE
597
702
  @management_network_address = '192.168.121.0/24' if @management_network_address == UNSET_VALUE
598
703
  @management_network_mode = 'nat' if @management_network_mode == UNSET_VALUE
@@ -601,27 +706,51 @@ module VagrantPlugins
601
706
  @management_network_autostart = false if @management_network_autostart == UNSET_VALUE
602
707
  @management_network_pci_bus = nil if @management_network_pci_bus == UNSET_VALUE
603
708
  @management_network_pci_slot = nil if @management_network_pci_slot == UNSET_VALUE
709
+ @management_network_domain = nil if @management_network_domain == UNSET_VALUE
710
+ @system_uri = 'qemu:///system' if @system_uri == UNSET_VALUE
711
+
712
+ # If uri isn't set then let's build one from various sources.
713
+ # Default to passing false for qemu_use_session if it's not set.
714
+ if @uri == UNSET_VALUE
715
+ @uri = _generate_uri(@qemu_use_session == UNSET_VALUE ? false : @qemu_use_session)
716
+ end
604
717
 
605
- # generate a URI if none is supplied
606
- @uri = _generate_uri if @uri == UNSET_VALUE
718
+ # Set qemu_use_session based on the URI if it wasn't set by the user
719
+ if @qemu_use_session == UNSET_VALUE
720
+ uri = _parse_uri(@uri)
721
+ if (uri.scheme.start_with? "qemu") && (uri.path.include? "session")
722
+ @qemu_use_session = true
723
+ else
724
+ @qemu_use_session = false
725
+ end
726
+ end
607
727
 
608
728
  # Domain specific settings.
729
+ @title = '' if @title == UNSET_VALUE
730
+ @description = '' if @description == UNSET_VALUE
609
731
  @uuid = '' if @uuid == UNSET_VALUE
610
732
  @memory = 512 if @memory == UNSET_VALUE
733
+ @nodeset = nil if @nodeset == UNSET_VALUE
611
734
  @memory_backing = [] if @memory_backing == UNSET_VALUE
612
735
  @cpus = 1 if @cpus == UNSET_VALUE
736
+ @cpuset = nil if @cpuset == UNSET_VALUE
613
737
  @cpu_mode = 'host-model' if @cpu_mode == UNSET_VALUE
614
738
  @cpu_model = if (@cpu_model == UNSET_VALUE) && (@cpu_mode == 'custom')
615
739
  'qemu64'
616
740
  elsif @cpu_mode != 'custom'
617
741
  ''
742
+ else
743
+ @cpu_model
618
744
  end
619
745
  @cpu_topology = {} if @cpu_topology == UNSET_VALUE
620
746
  @cpu_fallback = 'allow' if @cpu_fallback == UNSET_VALUE
621
747
  @cpu_features = [] if @cpu_features == UNSET_VALUE
748
+ @shares = nil if @shares == UNSET_VALUE
622
749
  @features = ['acpi','apic','pae'] if @features == UNSET_VALUE
750
+ @features_hyperv = [] if @features_hyperv == UNSET_VALUE
623
751
  @numa_nodes = @numa_nodes == UNSET_VALUE ? nil : _generate_numa
624
752
  @loader = nil if @loader == UNSET_VALUE
753
+ @nvram = nil if @nvram == UNSET_VALUE
625
754
  @machine_type = nil if @machine_type == UNSET_VALUE
626
755
  @machine_arch = nil if @machine_arch == UNSET_VALUE
627
756
  @machine_virtual_size = nil if @machine_virtual_size == UNSET_VALUE
@@ -684,6 +813,9 @@ module VagrantPlugins
684
813
  # Watchdog device
685
814
  @watchdog_dev = {} if @watchdog_dev == UNSET_VALUE
686
815
 
816
+ # USB controller
817
+ @usbctl_dev = {} if @usbctl_dev == UNSET_VALUE
818
+
687
819
  # USB device passthrough
688
820
  @usbs = [] if @usbs == UNSET_VALUE
689
821
 
@@ -703,12 +835,24 @@ module VagrantPlugins
703
835
  # Attach mgmt network
704
836
  @mgmt_attach = true if @mgmt_attach == UNSET_VALUE
705
837
 
838
+ # Additional QEMU commandline arguments
706
839
  @qemu_args = [] if @qemu_args == UNSET_VALUE
840
+
841
+ # Additional QEMU commandline environment variables
842
+ @qemu_env = {} if @qemu_env == UNSET_VALUE
707
843
  end
708
844
 
709
845
  def validate(machine)
710
846
  errors = _detected_errors
711
847
 
848
+ # The @uri and @qemu_use_session should not conflict
849
+ uri = _parse_uri(@uri)
850
+ if (uri.scheme.start_with? "qemu") && (uri.path.include? "session")
851
+ if @qemu_use_session != true
852
+ errors << "the URI and qemu_use_session configuration conflict: uri:'#{@uri}' qemu_use_session:'#{@qemu_use_session}'"
853
+ end
854
+ end
855
+
712
856
  machine.provider_config.disks.each do |disk|
713
857
  if disk[:path] && (disk[:path][0] == '/')
714
858
  errors << "absolute volume paths like '#{disk[:path]}' not yet supported"
@@ -739,6 +883,10 @@ module VagrantPlugins
739
883
  c = cdroms.dup
740
884
  c += other.cdroms
741
885
  result.cdroms = c
886
+
887
+ c = qemu_env != UNSET_VALUE ? qemu_env.dup : {}
888
+ c.merge!(other.qemu_env) if other.qemu_env != UNSET_VALUE
889
+ result.qemu_env = c
742
890
  end
743
891
  end
744
892
  end