vagrant-libvirt 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +134 -23
  3. data/lib/vagrant-libvirt/action/clean_machine_folder.rb +4 -0
  4. data/lib/vagrant-libvirt/action/create_domain.rb +11 -3
  5. data/lib/vagrant-libvirt/action/create_domain_volume.rb +7 -2
  6. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +8 -2
  7. data/lib/vagrant-libvirt/action/create_networks.rb +12 -8
  8. data/lib/vagrant-libvirt/action/destroy_domain.rb +2 -0
  9. data/lib/vagrant-libvirt/action/destroy_networks.rb +2 -0
  10. data/lib/vagrant-libvirt/action/forward_ports.rb +7 -5
  11. data/lib/vagrant-libvirt/action/halt_domain.rb +4 -34
  12. data/lib/vagrant-libvirt/action/handle_box_image.rb +18 -13
  13. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +7 -1
  14. data/lib/vagrant-libvirt/action/is_created.rb +2 -0
  15. data/lib/vagrant-libvirt/action/is_running.rb +2 -0
  16. data/lib/vagrant-libvirt/action/is_suspended.rb +2 -0
  17. data/lib/vagrant-libvirt/action/message_already_created.rb +2 -0
  18. data/lib/vagrant-libvirt/action/message_not_created.rb +2 -0
  19. data/lib/vagrant-libvirt/action/message_not_running.rb +2 -0
  20. data/lib/vagrant-libvirt/action/message_not_suspended.rb +2 -0
  21. data/lib/vagrant-libvirt/action/message_will_not_destroy.rb +2 -0
  22. data/lib/vagrant-libvirt/action/package_domain.rb +133 -68
  23. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +2 -0
  24. data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +2 -0
  25. data/lib/vagrant-libvirt/action/prune_nfs_exports.rb +2 -0
  26. data/lib/vagrant-libvirt/action/read_mac_addresses.rb +2 -0
  27. data/lib/vagrant-libvirt/action/remove_libvirt_image.rb +2 -0
  28. data/lib/vagrant-libvirt/action/remove_stale_volume.rb +2 -0
  29. data/lib/vagrant-libvirt/action/resume_domain.rb +2 -0
  30. data/lib/vagrant-libvirt/action/set_boot_order.rb +8 -2
  31. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +3 -1
  32. data/lib/vagrant-libvirt/action/share_folders.rb +2 -0
  33. data/lib/vagrant-libvirt/action/shutdown_domain.rb +49 -0
  34. data/lib/vagrant-libvirt/action/start_domain.rb +26 -17
  35. data/lib/vagrant-libvirt/action/suspend_domain.rb +2 -0
  36. data/lib/vagrant-libvirt/action/wait_till_up.rb +2 -0
  37. data/lib/vagrant-libvirt/action.rb +34 -4
  38. data/lib/vagrant-libvirt/cap/mount_9p.rb +2 -0
  39. data/lib/vagrant-libvirt/cap/mount_virtiofs.rb +2 -0
  40. data/lib/vagrant-libvirt/cap/nic_mac_addresses.rb +2 -0
  41. data/lib/vagrant-libvirt/cap/public_address.rb +2 -0
  42. data/lib/vagrant-libvirt/cap/synced_folder_9p.rb +5 -2
  43. data/lib/vagrant-libvirt/cap/synced_folder_virtiofs.rb +5 -2
  44. data/lib/vagrant-libvirt/config.rb +58 -24
  45. data/lib/vagrant-libvirt/driver.rb +67 -12
  46. data/lib/vagrant-libvirt/errors.rb +2 -0
  47. data/lib/vagrant-libvirt/plugin.rb +2 -0
  48. data/lib/vagrant-libvirt/provider.rb +2 -0
  49. data/lib/vagrant-libvirt/templates/domain.xml.erb +4 -2
  50. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +1 -0
  51. data/lib/vagrant-libvirt/util/byte_number.rb +71 -0
  52. data/lib/vagrant-libvirt/util/collection.rb +2 -0
  53. data/lib/vagrant-libvirt/util/erb_template.rb +2 -0
  54. data/lib/vagrant-libvirt/util/error_codes.rb +2 -0
  55. data/lib/vagrant-libvirt/util/network_util.rb +3 -0
  56. data/lib/vagrant-libvirt/util/nfs.rb +2 -0
  57. data/lib/vagrant-libvirt/util/storage_util.rb +1 -0
  58. data/lib/vagrant-libvirt/util/timer.rb +2 -0
  59. data/lib/vagrant-libvirt/util/ui.rb +1 -0
  60. data/lib/vagrant-libvirt/util.rb +2 -0
  61. data/lib/vagrant-libvirt/version +1 -1
  62. data/lib/vagrant-libvirt/version.rb +2 -0
  63. data/lib/vagrant-libvirt.rb +2 -0
  64. data/locales/en.yml +2 -0
  65. data/spec/spec_helper.rb +2 -0
  66. data/spec/support/binding_proc.rb +2 -0
  67. data/spec/support/environment_helper.rb +2 -0
  68. data/spec/support/libvirt_context.rb +2 -0
  69. data/spec/support/matchers/have_file_content.rb +2 -0
  70. data/spec/support/sharedcontext.rb +3 -0
  71. data/spec/support/temporary_dir.rb +12 -0
  72. data/spec/unit/action/clean_machine_folder_spec.rb +16 -4
  73. data/spec/unit/action/create_domain_spec/additional_disks_domain.xml +61 -0
  74. data/spec/unit/action/create_domain_spec/default_domain.xml +55 -0
  75. data/spec/unit/action/create_domain_spec.rb +68 -32
  76. data/spec/unit/action/create_domain_volume_spec/one_disk_in_storage.xml +1 -1
  77. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_0.xml +1 -1
  78. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_1.xml +1 -1
  79. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_2.xml +1 -1
  80. data/spec/unit/action/create_domain_volume_spec.rb +10 -4
  81. data/spec/unit/action/destroy_domain_spec.rb +8 -2
  82. data/spec/unit/action/forward_ports_spec.rb +2 -0
  83. data/spec/unit/action/halt_domain_spec.rb +30 -57
  84. data/spec/unit/action/handle_box_image_spec.rb +104 -24
  85. data/spec/unit/action/package_domain_spec.rb +304 -0
  86. data/spec/unit/action/set_name_of_domain_spec.rb +2 -0
  87. data/spec/unit/action/shutdown_domain_spec.rb +131 -0
  88. data/spec/unit/action/start_domain_spec/existing.xml +62 -0
  89. data/spec/unit/action/start_domain_spec.rb +18 -28
  90. data/spec/unit/action/wait_till_up_spec.rb +2 -0
  91. data/spec/unit/action_spec.rb +96 -0
  92. data/spec/unit/config_spec.rb +56 -3
  93. data/spec/unit/driver_spec.rb +155 -0
  94. data/spec/unit/templates/domain_all_settings.xml +4 -0
  95. data/spec/unit/templates/domain_spec.rb +2 -0
  96. data/spec/unit/util/byte_number_spec.rb +28 -0
  97. metadata +59 -38
@@ -0,0 +1,62 @@
1
+ <domain type='qemu'>
2
+ <name>vagrant-libvirt_default</name>
3
+ <uuid>881a931b-0110-4d10-81aa-47a1a19f5726</uuid>
4
+ <description>Source: /home/test/vagrant-libvirt/Vagrantfile</description>
5
+ <memory unit='KiB'>2097152</memory>
6
+ <currentMemory unit='KiB'>2097152</currentMemory>
7
+ <vcpu placement='static'>2</vcpu>
8
+ <os>
9
+ <type arch='x86_64' machine='pc-i440fx-6.0'>hvm</type>
10
+ <boot dev='hd'/>
11
+ </os>
12
+ <features>
13
+ <acpi/>
14
+ <apic/>
15
+ <pae/>
16
+ </features>
17
+ <cpu mode='host-model' check='partial'/>
18
+ <clock offset='utc'/>
19
+ <on_poweroff>destroy</on_poweroff>
20
+ <on_reboot>restart</on_reboot>
21
+ <on_crash>destroy</on_crash>
22
+ <devices>
23
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
24
+ <disk type='file' device='disk'>
25
+ <driver name='qemu' type='qcow2'/>
26
+ <source file='/var/lib/libvirt/images/vagrant-libvirt_default.img'/>
27
+ <target dev='vda' bus='virtio'/>
28
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
29
+ </disk>
30
+ <controller type='usb' index='0' model='piix3-uhci'>
31
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
32
+ </controller>
33
+ <controller type='pci' index='0' model='pci-root'/>
34
+ <interface type='network'>
35
+ <mac address='52:54:00:7d:14:0e'/>
36
+ <source network='vagrant-libvirt'/>
37
+ <model type='virtio'/>
38
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
39
+ </interface>
40
+ <serial type='pty'>
41
+ <target type='isa-serial' port='0'>
42
+ <model name='isa-serial'/>
43
+ </target>
44
+ </serial>
45
+ <console type='pty'>
46
+ <target type='serial' port='0'/>
47
+ </console>
48
+ <input type='mouse' bus='ps2'/>
49
+ <input type='keyboard' bus='ps2'/>
50
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'>
51
+ <listen type='address' address='127.0.0.1'/>
52
+ </graphics>
53
+ <audio id='1' type='none'/>
54
+ <video>
55
+ <model type='cirrus' vram='9216' heads='1' primary='yes'/>
56
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
57
+ </video>
58
+ <memballoon model='virtio'>
59
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
60
+ </memballoon>
61
+ </devices>
62
+ </domain>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'support/sharedcontext'
3
5
  require 'support/libvirt_context'
@@ -19,6 +21,8 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
19
21
  let(:updated_domain_xml) { File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), updated_test_file)) }
20
22
 
21
23
  describe '#call' do
24
+ let(:test_file) { 'default.xml' }
25
+
22
26
  before do
23
27
  allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver)
24
28
  .to receive(:connection).and_return(connection)
@@ -28,23 +32,29 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
28
32
  allow(connection).to receive(:servers).and_return(servers)
29
33
  allow(servers).to receive(:get).and_return(domain)
30
34
 
35
+ allow(logger).to receive(:debug)
31
36
  expect(logger).to receive(:info)
32
37
  expect(ui).to_not receive(:error)
38
+
39
+ allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
40
+
41
+ allow(libvirt_domain).to receive(:max_memory).and_return(512*1024)
42
+ allow(libvirt_domain).to receive(:num_vcpus).and_return(1)
33
43
  end
34
44
 
35
- context 'default config' do
36
- let(:test_file) { 'default.xml' }
45
+ it 'should execute without changing' do
46
+ allow(libvirt_domain).to receive(:undefine)
47
+ expect(libvirt_domain).to receive(:autostart=)
48
+ expect(domain).to receive(:start)
37
49
 
38
- before do
39
- allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
50
+ expect(subject.call(env)).to be_nil
51
+ end
40
52
 
41
- allow(libvirt_domain).to receive(:max_memory).and_return(512*1024)
42
- allow(libvirt_domain).to receive(:num_vcpus).and_return(1)
43
- end
53
+ context 'when previously running default config' do
54
+ let(:test_file) { 'existing.xml' }
44
55
 
45
56
  it 'should execute without changing' do
46
57
  allow(libvirt_domain).to receive(:undefine)
47
- expect(logger).to_not receive(:debug)
48
58
  expect(libvirt_domain).to receive(:autostart=)
49
59
  expect(domain).to receive(:start)
50
60
 
@@ -53,15 +63,6 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
53
63
  end
54
64
 
55
65
  context 'tpm' do
56
- let(:test_file) { 'default.xml' }
57
-
58
- before do
59
- allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
60
-
61
- allow(libvirt_domain).to receive(:max_memory).and_return(512*1024)
62
- allow(libvirt_domain).to receive(:num_vcpus).and_return(1)
63
- end
64
-
65
66
  context 'passthrough tpm added' do
66
67
  let(:updated_test_file) { 'default_added_tpm_path.xml' }
67
68
  let(:vagrantfile_providerconfig) do
@@ -116,7 +117,6 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
116
117
  end
117
118
 
118
119
  it 'should execute without changing' do
119
- expect(logger).to_not receive(:debug)
120
120
  expect(libvirt_domain).to receive(:autostart=)
121
121
  expect(domain).to receive(:start)
122
122
 
@@ -136,7 +136,6 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
136
136
  end
137
137
 
138
138
  it 'should execute without changing' do
139
- expect(logger).to_not receive(:debug)
140
139
  expect(libvirt_domain).to receive(:autostart=)
141
140
  expect(domain).to receive(:start)
142
141
 
@@ -170,13 +169,6 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
170
169
  context 'clock_timers' do
171
170
  let(:test_file) { 'clock_timer_rtc.xml' }
172
171
 
173
- before do
174
- allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
175
-
176
- allow(libvirt_domain).to receive(:max_memory).and_return(512*1024)
177
- allow(libvirt_domain).to receive(:num_vcpus).and_return(1)
178
- end
179
-
180
172
  context 'timers unchanged' do
181
173
  let(:vagrantfile_providerconfig) do
182
174
  <<-EOF
@@ -214,8 +206,6 @@ describe VagrantPlugins::ProviderLibvirt::Action::StartDomain do
214
206
  end
215
207
 
216
208
  context 'timers removed' do
217
- let(:updated_test_file) { 'default.xml' }
218
-
219
209
  it 'should modify the domain' do
220
210
  expect(libvirt_domain).to receive(:undefine)
221
211
  expect(logger).to receive(:debug).with('clock timers config changed')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'vagrant-libvirt/action/wait_till_up'
2
4
  require 'vagrant-libvirt/errors'
3
5
 
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'support/sharedcontext'
5
+
6
+ require 'vagrant/action/runner'
7
+
8
+ require 'vagrant-libvirt/action'
9
+
10
+
11
+ describe VagrantPlugins::ProviderLibvirt::Action do
12
+ subject { described_class }
13
+
14
+ include_context 'libvirt'
15
+ include_context 'unit'
16
+
17
+ let(:libvirt_domain) { double('libvirt_domain') }
18
+ let(:runner) { Vagrant::Action::Runner.new(env) }
19
+ let(:state) { double('state') }
20
+
21
+ before do
22
+ allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver)
23
+ .to receive(:connection).and_return(connection)
24
+ allow(machine).to receive(:id).and_return('test-machine-id')
25
+ allow(machine).to receive(:state).and_return(state)
26
+
27
+ allow(logger).to receive(:info)
28
+ allow(logger).to receive(:debug)
29
+ allow(logger).to receive(:error)
30
+ end
31
+
32
+ def allow_action_env_result(action, *responses)
33
+ results = responses.dup
34
+
35
+ allow_any_instance_of(action).to receive(:call) do |cls, env|
36
+ app = cls.instance_variable_get(:@app)
37
+
38
+ env[:result] = results[0]
39
+ if results.length > 1
40
+ results.shift
41
+ end
42
+
43
+ app.call(env)
44
+ end
45
+ end
46
+
47
+ describe '#action_halt' do
48
+ context 'not created' do
49
+ before do
50
+ expect(state).to receive(:id).and_return(:not_created)
51
+ end
52
+
53
+ it 'should execute without error' do
54
+ expect(ui).to receive(:info).with('Domain is not created. Please run `vagrant up` first.')
55
+
56
+ expect { runner.run(subject.action_halt) }.not_to raise_error
57
+ end
58
+ end
59
+
60
+ context 'running' do
61
+ before do
62
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsCreated, true)
63
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsSuspended, false)
64
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true)
65
+ end
66
+
67
+ context 'when shutdown domain works' do
68
+ before do
69
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::ShutdownDomain, true)
70
+ allow_action_env_result(Vagrant::Action::Builtin::GracefulHalt, true)
71
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::IsRunning, true, false)
72
+ end
73
+
74
+ it 'should skip calling HaltDomain' do
75
+ expect(ui).to_not receive(:info).with('Domain is not created. Please run `vagrant up` first.')
76
+ expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::HaltDomain).to_not receive(:call)
77
+
78
+ expect { runner.run(subject.action_halt) }.not_to raise_error
79
+ end
80
+ end
81
+
82
+ context 'when shutdown domain fails' do
83
+ before do
84
+ allow_action_env_result(VagrantPlugins::ProviderLibvirt::Action::ShutdownDomain, false)
85
+ allow_action_env_result(Vagrant::Action::Builtin::GracefulHalt, false)
86
+ end
87
+
88
+ it 'should call halt' do
89
+ expect_any_instance_of(VagrantPlugins::ProviderLibvirt::Action::HaltDomain).to receive(:call)
90
+
91
+ expect { runner.run(subject.action_halt) }.not_to raise_error
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'support/binding_proc'
2
4
 
3
5
  require 'spec_helper'
@@ -190,14 +192,14 @@ describe VagrantPlugins::ProviderLibvirt::Config do
190
192
  ],
191
193
  [ # when username explicitly set without ssh
192
194
  {:username => 'my_user' },
193
- {:uri => 'qemu:///system'},
195
+ {:uri => 'qemu:///system', :username => 'my_user'},
194
196
  {
195
197
  :env => {'LIBVIRT_DEFAULT_URI' => 'qemu://session'},
196
198
  }
197
199
  ],
198
200
  [ # when username explicitly set with host but without ssh
199
201
  {:username => 'my_user', :host => 'remote'},
200
- {:uri => 'qemu://remote/system'},
202
+ {:uri => 'qemu://remote/system', :username => 'my_user'},
201
203
  {
202
204
  :env => {'LIBVIRT_DEFAULT_URI' => 'qemu://session'},
203
205
  }
@@ -358,6 +360,10 @@ describe VagrantPlugins::ProviderLibvirt::Config do
358
360
  {:connect_via_ssh => true, :host => 'remote', :username => 'myuser'},
359
361
  "ssh 'remote' -l 'myuser' -W %h:%p",
360
362
  ],
363
+ [ # remote contains port
364
+ {:connect_via_ssh => true, :host => 'remote:2222'},
365
+ "ssh 'remote' -p 2222 -W %h:%p",
366
+ ],
361
367
  [ # include user and default ssh key exists
362
368
  {:connect_via_ssh => true, :host => 'remote', :username => 'myuser'},
363
369
  "ssh 'remote' -l 'myuser' -i '/home/tests/.ssh/id_rsa' -W %h:%p",
@@ -390,7 +396,6 @@ describe VagrantPlugins::ProviderLibvirt::Config do
390
396
  [
391
397
  {:uri => 'qemu+ssh://remote/system?keyfile=/some/path/to/keyfile'},
392
398
  "ssh 'remote' -i '/some/path/to/keyfile' -W %h:%p",
393
- {:allow_failure => "keyfile not yet inferred from uri"},
394
399
  ],
395
400
 
396
401
  # provide custom template
@@ -430,6 +435,54 @@ describe VagrantPlugins::ProviderLibvirt::Config do
430
435
  end
431
436
  end
432
437
  end
438
+
439
+ context '@usbctl_dev' do
440
+ it 'should be empty by default' do
441
+ subject.finalize!
442
+
443
+ expect(subject.usbctl_dev).to eq({})
444
+ end
445
+
446
+ context 'when usb devices added' do
447
+ it 'should inject a default controller' do
448
+ subject.usb :vendor => '0x1234', :product => '0xabcd'
449
+
450
+ subject.finalize!
451
+
452
+ expect(subject.usbctl_dev).to eq({:model => 'qemu-xhci'})
453
+ end
454
+
455
+ context 'when user specified a controller' do
456
+ it 'should retain the user setting' do
457
+ subject.usb :vendor => '0x1234', :product => '0xabcd'
458
+ subject.usb_controller :model => 'pii3-uchi'
459
+
460
+ subject.finalize!
461
+ expect(subject.usbctl_dev).to eq({:model => 'pii3-uchi'})
462
+ end
463
+ end
464
+ end
465
+
466
+ context 'when redirdevs entries added' do
467
+ it 'should inject a default controller' do
468
+ subject.redirdev :type => 'spicevmc'
469
+
470
+ subject.finalize!
471
+
472
+ expect(subject.usbctl_dev).to eq({:model => 'qemu-xhci'})
473
+ end
474
+
475
+ context 'when user specified a controller' do
476
+ it 'should retain the user setting' do
477
+ subject.redirdev :type => 'spicevmc'
478
+ subject.usb_controller :model => 'pii3-uchi'
479
+
480
+ subject.finalize!
481
+ expect(subject.usbctl_dev).to eq({:model => 'pii3-uchi'})
482
+ end
483
+ end
484
+ end
485
+ end
433
486
  end
434
487
 
435
488
  def assert_invalid
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'support/binding_proc'
5
+ require 'support/sharedcontext'
6
+
7
+ require 'vagrant-libvirt/driver'
8
+
9
+ describe VagrantPlugins::ProviderLibvirt::Driver do
10
+ include_context 'unit'
11
+
12
+ subject { described_class.new(machine) }
13
+
14
+ let(:vagrantfile) do
15
+ <<-EOF
16
+ Vagrant.configure('2') do |config|
17
+ config.vm.define :test1 do |node|
18
+ node.vm.provider :libvirt do |domain|
19
+ domain.uri = "qemu+ssh://user@remote1/system"
20
+ end
21
+ end
22
+ config.vm.define :test2 do |node|
23
+ node.vm.provider :libvirt do |domain|
24
+ domain.uri = "qemu+ssh://vms@remote2/system"
25
+ end
26
+ end
27
+ end
28
+ EOF
29
+ end
30
+ # need to override the default package iso_env as using a different
31
+ # name for the test machines above.
32
+ let(:machine) { iso_env.machine(:test1, :libvirt) }
33
+ let(:machine2) { iso_env.machine(:test2, :libvirt) }
34
+ let(:connection1) { double("connection 1") }
35
+ let(:connection2) { double("connection 2") }
36
+ let(:system_connection1) { double("system connection 1") }
37
+ let(:system_connection2) { double("system connection 2") }
38
+
39
+ describe '#connection' do
40
+ it 'should configure a separate connection per machine' do
41
+ expect(Fog::Compute).to receive(:new).with(
42
+ hash_including({:libvirt_uri => 'qemu+ssh://user@remote1/system'})).and_return(connection1)
43
+ expect(Fog::Compute).to receive(:new).with(
44
+ hash_including({:libvirt_uri => 'qemu+ssh://vms@remote2/system'})).and_return(connection2)
45
+
46
+ expect(machine.provider.driver.connection).to eq(connection1)
47
+ expect(machine2.provider.driver.connection).to eq(connection2)
48
+ end
49
+
50
+ it 'should configure the connection once' do
51
+ expect(Fog::Compute).to receive(:new).once().and_return(connection1)
52
+
53
+ expect(machine.provider.driver.connection).to eq(connection1)
54
+ expect(machine.provider.driver.connection).to eq(connection1)
55
+ expect(machine.provider.driver.connection).to eq(connection1)
56
+ end
57
+ end
58
+
59
+ describe '#system_connection' do
60
+ # note that the urls for the two tests are currently
61
+ # incorrect here as they should be the following:
62
+ # qemu+ssh://user@remote1/system
63
+ # qemu+ssh://vms@remote2/system
64
+ #
65
+ # In that the system uri should be resolved based on
66
+ # the provider uri so that for:
67
+ # uri => qemu+ssh://user@remote1/session
68
+ # system_uri should be 'qemu+ssh://user@remote1/system'
69
+ # and not 'qemu:///system'.
70
+ it 'should configure a separate connection per machine' do
71
+ expect(Libvirt).to receive(:open).with('qemu:///system').and_return(system_connection1)
72
+ expect(Libvirt).to receive(:open).with('qemu:///system').and_return(system_connection2)
73
+
74
+ expect(machine.provider.driver.system_connection).to eq(system_connection1)
75
+ expect(machine2.provider.driver.system_connection).to eq(system_connection2)
76
+ end
77
+
78
+ it 'should configure the connection once' do
79
+ expect(Libvirt).to receive(:open).with('qemu:///system').and_return(system_connection1)
80
+
81
+ expect(machine.provider.driver.system_connection).to eq(system_connection1)
82
+ expect(machine.provider.driver.system_connection).to eq(system_connection1)
83
+ expect(machine.provider.driver.system_connection).to eq(system_connection1)
84
+ end
85
+ end
86
+
87
+ describe '#state' do
88
+ let(:domain) { double('domain') }
89
+
90
+ before do
91
+ allow(subject).to receive(:get_domain).and_return(domain)
92
+ end
93
+
94
+ [
95
+ [
96
+ 'not found',
97
+ :not_created,
98
+ {
99
+ :setup => ProcWithBinding.new do
100
+ expect(subject).to receive(:get_domain).and_return(nil)
101
+ end,
102
+ }
103
+ ],
104
+ [
105
+ 'libvirt error',
106
+ :not_created,
107
+ {
108
+ :setup => ProcWithBinding.new do
109
+ expect(subject).to receive(:get_domain).and_raise(Libvirt::RetrieveError, 'missing')
110
+ end,
111
+ }
112
+ ],
113
+ [
114
+ 'terminated',
115
+ :not_created,
116
+ {
117
+ :setup => ProcWithBinding.new do
118
+ expect(domain).to receive(:state).and_return('terminated')
119
+ end,
120
+ }
121
+ ],
122
+ [
123
+ 'no IP returned',
124
+ :inaccessible,
125
+ {
126
+ :setup => ProcWithBinding.new do
127
+ expect(domain).to receive(:state).and_return('running').twice()
128
+ expect(subject).to receive(:get_domain_ipaddress).and_raise(Fog::Errors::TimeoutError)
129
+ end,
130
+ }
131
+ ],
132
+ [
133
+ 'running',
134
+ :running,
135
+ {
136
+ :setup => ProcWithBinding.new do
137
+ expect(domain).to receive(:state).and_return('running').twice()
138
+ expect(subject).to receive(:get_domain_ipaddress).and_return('192.168.121.2')
139
+ end,
140
+ }
141
+ ],
142
+ ].each do |name, expected, options|
143
+ opts = {}
144
+ opts.merge!(options) if options
145
+
146
+ it "should handle '#{name}' by returning '#{expected}'" do
147
+ if !opts[:setup].nil?
148
+ opts[:setup].apply_binding(binding)
149
+ end
150
+
151
+ expect(subject.state(machine)).to eq(expected)
152
+ end
153
+ end
154
+ end
155
+ end
@@ -44,21 +44,25 @@
44
44
  <devices>
45
45
  <emulator>/usr/bin/kvm-spice</emulator>
46
46
  <disk type='file' device='disk'>
47
+ <alias name='ua-box-volume-0'/>
47
48
  <driver name='qemu' type='qcow2' cache='unsafe' io='threads' copy_on_read='on' discard='unmap' detect_zeroes='on'/>
48
49
  <source file='/var/lib/libvirt/images/test.qcow2'/>
49
50
  <target dev='vda' bus='ide'/>
50
51
  </disk>
51
52
  <disk type='file' device='disk'>
53
+ <alias name='ua-box-volume-1'/>
52
54
  <driver name='qemu' type='qcow2' cache='unsafe' io='threads' copy_on_read='on' discard='unmap' detect_zeroes='on'/>
53
55
  <source file='/var/lib/libvirt/images/test2.qcow2'/>
54
56
  <target dev='vdb' bus='ide'/>
55
57
  </disk>
56
58
  <disk type='file' device='disk'>
59
+ <alias name='ua-disk-volume-0'/>
57
60
  <driver name='qemu' type='qcow2' cache='default'/>
58
61
  <source file='/var/lib/libvirt/images/test-disk1.qcow2'/>
59
62
  <target dev='vdb' bus='virtio'/>
60
63
  </disk>
61
64
  <disk type='file' device='disk'>
65
+ <alias name='ua-disk-volume-1'/>
62
66
  <driver name='qemu' type='qcow2' cache='default' io='threads' copy_on_read='on' discard='unmap' detect_zeroes='on'/>
63
67
  <source file='/var/lib/libvirt/images/test-disk2.qcow2'/>
64
68
  <target dev='vdc' bus='virtio'/>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'support/sharedcontext'
2
4
 
3
5
  require 'vagrant-libvirt/config'
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require 'vagrant-libvirt/util/byte_number'
6
+
7
+
8
+ describe ByteNumber do
9
+ describe '#ByteNumber to Gigrabyte' do
10
+ it 'should return bigger size' do
11
+ expect( ByteNumber.new("10737423360").to_GB).to eq(11)
12
+ expect( ByteNumber.new("737423360").to_GB).to eq(1)
13
+ expect( ByteNumber.new("110737423360").to_GB).to eq(104)
14
+ end
15
+ end
16
+
17
+ describe '#ByteNumber from Gigrabyte' do
18
+ it 'should convert' do
19
+ expect( ByteNumber.from_GB(5).to_i).to eq(5368709120)
20
+ end
21
+ end
22
+
23
+ describe '#ByteNumber pow' do
24
+ it 'should be work like interger' do
25
+ expect( ByteNumber.new(5).pow(5).to_i).to eq(5**5)
26
+ end
27
+ end
28
+ end