vagrant-libvirt 0.6.3 → 0.8.1

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -13
  3. data/lib/vagrant-libvirt/action/cleanup_on_failure.rb +76 -0
  4. data/lib/vagrant-libvirt/action/create_domain.rb +56 -10
  5. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +5 -1
  6. data/lib/vagrant-libvirt/action/create_networks.rb +24 -0
  7. data/lib/vagrant-libvirt/action/destroy_domain.rb +106 -21
  8. data/lib/vagrant-libvirt/action/destroy_networks.rb +1 -1
  9. data/lib/vagrant-libvirt/action/forward_ports.rb +12 -11
  10. data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +1 -1
  11. data/lib/vagrant-libvirt/action/start_domain.rb +36 -0
  12. data/lib/vagrant-libvirt/action/wait_till_up.rb +6 -32
  13. data/lib/vagrant-libvirt/action.rb +72 -83
  14. data/lib/vagrant-libvirt/config.rb +85 -30
  15. data/lib/vagrant-libvirt/driver.rb +11 -9
  16. data/lib/vagrant-libvirt/errors.rb +12 -0
  17. data/lib/vagrant-libvirt/templates/domain.xml.erb +228 -218
  18. data/lib/vagrant-libvirt/templates/private_network.xml.erb +4 -1
  19. data/lib/vagrant-libvirt/util/network_util.rb +15 -3
  20. data/lib/vagrant-libvirt/util/nfs.rb +2 -0
  21. data/lib/vagrant-libvirt/util/resolvers.rb +80 -0
  22. data/lib/vagrant-libvirt/version +1 -1
  23. data/locales/en.yml +17 -0
  24. data/spec/spec_helper.rb +36 -23
  25. data/spec/support/libvirt_context.rb +7 -4
  26. data/spec/support/sharedcontext.rb +1 -1
  27. data/spec/unit/action/cleanup_on_failure_spec.rb +131 -0
  28. data/spec/unit/action/create_domain_spec/additional_disks_domain.xml +6 -18
  29. data/spec/unit/action/create_domain_spec/custom_disk_settings.xml +43 -0
  30. data/spec/unit/action/create_domain_spec/default_domain.xml +6 -18
  31. data/spec/unit/action/create_domain_spec/two_disk_settings.xml +49 -0
  32. data/spec/unit/action/create_domain_spec.rb +51 -7
  33. data/spec/unit/action/create_domain_volume_spec.rb +5 -3
  34. data/spec/unit/action/destroy_domain_spec/additional_disks_domain.xml +47 -0
  35. data/spec/unit/action/destroy_domain_spec/box_multiple_disks.xml +55 -0
  36. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks.xml +72 -0
  37. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_and_custom_disks_no_aliases.xml +67 -0
  38. data/spec/unit/action/destroy_domain_spec/box_multiple_disks_and_additional_disks.xml +67 -0
  39. data/spec/unit/action/destroy_domain_spec/cdrom_domain.xml +48 -0
  40. data/spec/unit/action/destroy_domain_spec.rb +134 -30
  41. data/spec/unit/action/forward_ports_spec.rb +10 -2
  42. data/spec/unit/action/prepare_nfs_settings_spec.rb +59 -0
  43. data/spec/unit/action/shutdown_domain_spec.rb +1 -1
  44. data/spec/unit/action/start_domain_spec/clock_timer_rtc.xml +6 -18
  45. data/spec/unit/action/start_domain_spec/default.xml +6 -18
  46. data/spec/unit/action/start_domain_spec/default_added_tpm_path.xml +6 -18
  47. data/spec/unit/action/start_domain_spec/default_added_tpm_version.xml +6 -18
  48. data/spec/unit/action/start_domain_spec/existing.xml +1 -1
  49. data/spec/unit/action/wait_till_up_spec.rb +4 -43
  50. data/spec/unit/action_spec.rb +2 -0
  51. data/spec/unit/config_spec.rb +133 -26
  52. data/spec/unit/driver_spec.rb +154 -10
  53. data/spec/unit/templates/domain_all_settings.xml +56 -77
  54. data/spec/unit/templates/domain_cpu_mode_passthrough.xml +39 -0
  55. data/spec/unit/templates/domain_custom_cpu_model.xml +6 -18
  56. data/spec/unit/templates/domain_defaults.xml +6 -18
  57. data/spec/unit/templates/domain_spec.rb +39 -13
  58. data/spec/unit/templates/tpm/version_1.2.xml +6 -18
  59. data/spec/unit/templates/tpm/version_2.0.xml +6 -18
  60. data/spec/unit/util/resolvers_spec.rb +116 -0
  61. metadata +40 -41
@@ -4,6 +4,8 @@ require 'spec_helper'
4
4
  require 'support/sharedcontext'
5
5
  require 'support/libvirt_context'
6
6
 
7
+ require 'fog/libvirt/models/compute/volume'
8
+
7
9
  require 'vagrant-libvirt/action/destroy_domain'
8
10
  require 'vagrant-libvirt/util/byte_number'
9
11
 
@@ -14,11 +16,9 @@ describe VagrantPlugins::ProviderLibvirt::Action::CreateDomainVolume do
14
16
  include_context 'unit'
15
17
  include_context 'libvirt'
16
18
 
17
- let(:libvirt_domain) { double('libvirt_domain') }
18
- let(:libvirt_client) { double('libvirt_client') }
19
19
  let(:volumes) { double('volumes') }
20
20
  let(:all) { double('all') }
21
- let(:box_volume) { double('box_volume') }
21
+ let(:box_volume) { instance_double(::Fog::Libvirt::Compute::Volume) }
22
22
 
23
23
  def read_test_file(name)
24
24
  File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), name))
@@ -35,6 +35,8 @@ describe VagrantPlugins::ProviderLibvirt::Action::CreateDomainVolume do
35
35
  allow(box_volume).to receive(:id).and_return(nil)
36
36
  env[:domain_name] = 'test'
37
37
 
38
+ allow(machine.provider_config).to receive(:qemu_use_session).and_return(false)
39
+
38
40
  allow(logger).to receive(:debug)
39
41
  end
40
42
 
@@ -0,0 +1,47 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <driver name='qemu' type='qcow2' cache='default'/>
27
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
28
+ <target dev='vda' bus='virtio'/>
29
+ </disk>
30
+ <disk type='file' device='disk'>
31
+ <driver name='qemu' type='qcow2' cache='default'/>
32
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2'/>
33
+ <target dev='vdb' bus='virtio'/>
34
+ </disk>
35
+ <serial type='pty'>
36
+ <target port='0'/>
37
+ </serial>
38
+ <console type='pty'>
39
+ <target port='0'/>
40
+ </console>
41
+ <input type='mouse' bus='ps2'/>
42
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
43
+ <video>
44
+ <model type='cirrus' vram='16384' heads='1'/>
45
+ </video>
46
+ </devices>
47
+ </domain>
@@ -0,0 +1,55 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <alias name='ua-box-volume-0'/>
27
+ <driver name='qemu' type='qcow2' cache='default'/>
28
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
29
+ <target dev='vda' bus='virtio'/>
30
+ </disk>
31
+ <disk type='file' device='disk'>
32
+ <alias name='ua-box-volume-1'/>
33
+ <driver name='qemu' type='qcow2' cache='default'/>
34
+ <source file='/var/lib/libvirt/images/vagrant-test_default_1.img'/>
35
+ <target dev='vdb' bus='virtio'/>
36
+ </disk>
37
+ <disk type='file' device='disk'>
38
+ <alias name='ua-box-volume-2'/>
39
+ <driver name='qemu' type='qcow2' cache='default'/>
40
+ <source file='/var/lib/libvirt/images/vagrant-test_default_2.img'/>
41
+ <target dev='vdc' bus='virtio'/>
42
+ </disk>
43
+ <serial type='pty'>
44
+ <target port='0'/>
45
+ </serial>
46
+ <console type='pty'>
47
+ <target port='0'/>
48
+ </console>
49
+ <input type='mouse' bus='ps2'/>
50
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
51
+ <video>
52
+ <model type='cirrus' vram='16384' heads='1'/>
53
+ </video>
54
+ </devices>
55
+ </domain>
@@ -0,0 +1,72 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <alias name='ua-box-volume-0'/>
27
+ <driver name='qemu' type='qcow2' cache='default'/>
28
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
29
+ <target dev='vda' bus='virtio'/>
30
+ </disk>
31
+ <disk type='file' device='disk'>
32
+ <alias name='ua-box-volume-1'/>
33
+ <driver name='qemu' type='qcow2' cache='default'/>
34
+ <source file='/var/lib/libvirt/images/vagrant-test_default_1.img'/>
35
+ <target dev='vdb' bus='virtio'/>
36
+ </disk>
37
+ <disk type='file' device='disk'>
38
+ <alias name='ua-box-volume-2'/>
39
+ <driver name='qemu' type='qcow2' cache='default'/>
40
+ <source file='/var/lib/libvirt/images/vagrant-test_default_2.img'/>
41
+ <target dev='vdc' bus='virtio'/>
42
+ </disk>
43
+ <disk type='file' device='disk'>
44
+ <alias name='ua-disk-volume-0'/>
45
+ <driver name='qemu' type='qcow2' cache='default'/>
46
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdd.qcow2'/>
47
+ <target dev='vdd' bus='virtio'/>
48
+ </disk>
49
+ <disk type='file' device='disk'>
50
+ <alias name='ua-disk-volume-1'/>
51
+ <driver name='qemu' type='qcow2' cache='default'/>
52
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vde.qcow2'/>
53
+ <target dev='vde' bus='virtio'/>
54
+ </disk>
55
+ <disk type='file' device='disk'>
56
+ <driver name='qemu' type='qcow2' cache='default'/>
57
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdf.qcow2'/>
58
+ <target dev='vdf' bus='virtio'/>
59
+ </disk>
60
+ <serial type='pty'>
61
+ <target port='0'/>
62
+ </serial>
63
+ <console type='pty'>
64
+ <target port='0'/>
65
+ </console>
66
+ <input type='mouse' bus='ps2'/>
67
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
68
+ <video>
69
+ <model type='cirrus' vram='16384' heads='1'/>
70
+ </video>
71
+ </devices>
72
+ </domain>
@@ -0,0 +1,67 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <driver name='qemu' type='qcow2' cache='default'/>
27
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
28
+ <target dev='vda' bus='virtio'/>
29
+ </disk>
30
+ <disk type='file' device='disk'>
31
+ <driver name='qemu' type='qcow2' cache='default'/>
32
+ <source file='/var/lib/libvirt/images/vagrant-test_default_1.img'/>
33
+ <target dev='vdb' bus='virtio'/>
34
+ </disk>
35
+ <disk type='file' device='disk'>
36
+ <driver name='qemu' type='qcow2' cache='default'/>
37
+ <source file='/var/lib/libvirt/images/vagrant-test_default_2.img'/>
38
+ <target dev='vdc' bus='virtio'/>
39
+ </disk>
40
+ <disk type='file' device='disk'>
41
+ <driver name='qemu' type='qcow2' cache='default'/>
42
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdd.qcow2'/>
43
+ <target dev='vdd' bus='virtio'/>
44
+ </disk>
45
+ <disk type='file' device='disk'>
46
+ <driver name='qemu' type='qcow2' cache='default'/>
47
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vde.qcow2'/>
48
+ <target dev='vde' bus='virtio'/>
49
+ </disk>
50
+ <disk type='file' device='disk'>
51
+ <driver name='qemu' type='qcow2' cache='default'/>
52
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdf.qcow2'/>
53
+ <target dev='vdf' bus='virtio'/>
54
+ </disk>
55
+ <serial type='pty'>
56
+ <target port='0'/>
57
+ </serial>
58
+ <console type='pty'>
59
+ <target port='0'/>
60
+ </console>
61
+ <input type='mouse' bus='ps2'/>
62
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
63
+ <video>
64
+ <model type='cirrus' vram='16384' heads='1'/>
65
+ </video>
66
+ </devices>
67
+ </domain>
@@ -0,0 +1,67 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <alias name='ua-box-volume-0'/>
27
+ <driver name='qemu' type='qcow2' cache='default'/>
28
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
29
+ <target dev='vda' bus='virtio'/>
30
+ </disk>
31
+ <disk type='file' device='disk'>
32
+ <alias name='ua-box-volume-1'/>
33
+ <driver name='qemu' type='qcow2' cache='default'/>
34
+ <source file='/var/lib/libvirt/images/vagrant-test_default_1.img'/>
35
+ <target dev='vdb' bus='virtio'/>
36
+ </disk>
37
+ <disk type='file' device='disk'>
38
+ <alias name='ua-box-volume-2'/>
39
+ <driver name='qemu' type='qcow2' cache='default'/>
40
+ <source file='/var/lib/libvirt/images/vagrant-test_default_2.img'/>
41
+ <target dev='vdc' bus='virtio'/>
42
+ </disk>
43
+ <disk type='file' device='disk'>
44
+ <alias name='ua-disk-volume-0'/>
45
+ <driver name='qemu' type='qcow2' cache='default'/>
46
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vdd.qcow2'/>
47
+ <target dev='vdd' bus='virtio'/>
48
+ </disk>
49
+ <disk type='file' device='disk'>
50
+ <alias name='ua-disk-volume-1'/>
51
+ <driver name='qemu' type='qcow2' cache='default'/>
52
+ <source file='/var/lib/libvirt/images/vagrant-test_default-vde.qcow2'/>
53
+ <target dev='vde' bus='virtio'/>
54
+ </disk>
55
+ <serial type='pty'>
56
+ <target port='0'/>
57
+ </serial>
58
+ <console type='pty'>
59
+ <target port='0'/>
60
+ </console>
61
+ <input type='mouse' bus='ps2'/>
62
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us'/>
63
+ <video>
64
+ <model type='cirrus' vram='16384' heads='1'/>
65
+ </video>
66
+ </devices>
67
+ </domain>
@@ -0,0 +1,48 @@
1
+ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
2
+ <name>vagrant-test_default</name>
3
+ <title></title>
4
+ <description>Source: /rootpath/Vagrantfile</description>
5
+ <uuid></uuid>
6
+ <memory>524288</memory>
7
+ <vcpu>1</vcpu>
8
+ <cpu mode='host-model'>
9
+ <model fallback='allow'></model>
10
+ </cpu>
11
+ <os>
12
+ <type>hvm</type>
13
+ <kernel></kernel>
14
+ <initrd></initrd>
15
+ <cmdline></cmdline>
16
+ </os>
17
+ <features>
18
+ <acpi/>
19
+ <apic/>
20
+ <pae/>
21
+ </features>
22
+ <clock offset='utc'>
23
+ </clock>
24
+ <devices>
25
+ <disk type='file' device='disk'>
26
+ <driver name='qemu' type='qcow2' cache='default'/>
27
+ <source file='/var/lib/libvirt/images/vagrant-test_default.img'/>
28
+ <target dev='vda' bus='virtio'/>
29
+ </disk>
30
+ <disk type='file' device='cdrom'>
31
+ <driver name='qemu' type='raw'/>
32
+ <source file='/home/test/images/os.iso'/>
33
+ <target dev='hdd' bus='ide'/>
34
+ <readonly/>
35
+ </disk>
36
+ <serial type='pty'>
37
+ <target port='0'/>
38
+ </serial>
39
+ <console type='pty'>
40
+ <target port='0'/>
41
+ </console>
42
+ <input type='mouse' bus='ps2'/>
43
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' keymap='en-us' />
44
+ <video>
45
+ <model type='cirrus' vram='16384' heads='1'/>
46
+ </video>
47
+ </devices>
48
+ </domain>
@@ -17,9 +17,12 @@ describe VagrantPlugins::ProviderLibvirt::Action::DestroyDomain do
17
17
  let(:libvirt_client) { double('libvirt_client') }
18
18
  let(:servers) { double('servers') }
19
19
 
20
+ let(:domain_xml) { File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), domain_xml_file)) }
21
+
20
22
  before do
21
23
  allow(machine.provider).to receive('driver').and_return(driver)
22
24
  allow(driver).to receive(:connection).and_return(connection)
25
+ allow(logger).to receive(:info)
23
26
  end
24
27
 
25
28
  describe '#call' do
@@ -27,8 +30,10 @@ describe VagrantPlugins::ProviderLibvirt::Action::DestroyDomain do
27
30
  allow(connection).to receive(:client).and_return(libvirt_client)
28
31
  allow(libvirt_client).to receive(:lookup_domain_by_uuid)
29
32
  .and_return(libvirt_domain)
33
+ allow(libvirt_domain).to receive(:name).and_return('vagrant-test_default')
30
34
  allow(connection).to receive(:servers).and_return(servers)
31
35
  allow(servers).to receive(:get).and_return(domain)
36
+
32
37
  # always see this at the start of #call
33
38
  expect(ui).to receive(:info).with('Removing domain...')
34
39
  end
@@ -39,59 +44,158 @@ describe VagrantPlugins::ProviderLibvirt::Action::DestroyDomain do
39
44
  before do
40
45
  allow(libvirt_domain).to receive(:list_snapshots).and_return([])
41
46
  allow(libvirt_domain).to receive(:has_managed_save?).and_return(nil)
42
- allow(root_disk).to receive(:name).and_return('test.img')
47
+ allow(root_disk).to receive(:name).and_return('vagrant-test_default.img')
43
48
  end
44
49
 
45
- context 'when only has root disk' do
50
+ context 'when box only has one root disk' do
46
51
  it 'calls fog to destroy volumes' do
47
52
  expect(domain).to receive(:destroy).with(destroy_volumes: true)
48
53
  expect(subject.call(env)).to be_nil
49
54
  end
50
- end
51
55
 
52
- context 'when has additional disks' do
53
- let(:vagrantfile) do
54
- <<-EOF
55
- Vagrant.configure('2') do |config|
56
- config.vm.define :test
57
- config.vm.provider :libvirt do |libvirt|
58
- libvirt.storage :file
59
- end
56
+ context 'when has additional disks' do
57
+ let(:vagrantfile_providerconfig) do
58
+ <<-EOF
59
+ libvirt.storage :file
60
+ EOF
60
61
  end
61
- EOF
62
- end
62
+ let(:domain_xml_file) { 'additional_disks_domain.xml' }
63
+ let(:extra_disk) { double('libvirt_extra_disk') }
63
64
 
64
- let(:extra_disk) { double('libvirt_extra_disk') }
65
- before do
66
- allow(extra_disk).to receive(:name).and_return('test-vdb.qcow2')
65
+ before do
66
+ allow(extra_disk).to receive(:name).and_return('vagrant-test_default-vdb.qcow2')
67
+ allow(domain).to receive(:volumes).and_return([root_disk, extra_disk])
68
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
69
+ end
70
+
71
+ it 'destroys disks individually' do
72
+ expect(domain).to receive(:destroy).with(destroy_volumes: false)
73
+ expect(extra_disk).to receive(:destroy) # extra disk remove
74
+ expect(root_disk).to receive(:destroy) # root disk remove
75
+ expect(subject.call(env)).to be_nil
76
+ end
67
77
  end
78
+ end
68
79
 
69
- it 'destroys disks individually' do
70
- allow(libvirt_domain).to receive(:name).and_return('test')
71
- allow(domain).to receive(:volumes).and_return([extra_disk], [root_disk])
80
+ context 'when box has multiple disks' do
81
+ let(:domain_xml_file) { 'box_multiple_disks.xml' }
72
82
 
73
- expect(domain).to receive(:destroy).with(destroy_volumes: false)
74
- expect(extra_disk).to receive(:destroy) # extra disk remove
75
- expect(root_disk).to receive(:destroy) # root disk remove
83
+ it 'calls fog to destroy volumes' do
84
+ expect(domain).to receive(:destroy).with(destroy_volumes: true)
76
85
  expect(subject.call(env)).to be_nil
77
86
  end
87
+
88
+ context 'when has additional disks' do
89
+ let(:domain_xml_file) { 'box_multiple_disks_and_additional_disks.xml' }
90
+ let(:vagrantfile_providerconfig) do
91
+ <<-EOF
92
+ libvirt.storage :file
93
+ libvirt.storage :file
94
+ EOF
95
+ end
96
+ let(:domain_disks) {[
97
+ [double('box-disk-1'), 'vagrant-test_default.img'],
98
+ [double('box-disk-2'), 'vagrant-test_default_1.img'],
99
+ [double('box-disk-3'), 'vagrant-test_default_2.img'],
100
+ [double('additional-disk-1'), 'vagrant-test_default-vdd.qcow2'],
101
+ [double('additional-disk-2'), 'vagrant-test_default-vde.qcow2'],
102
+ ]}
103
+
104
+ before do
105
+ allow(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
106
+ allow(domain).to receive(:volumes).and_return(domain_disks.map { |a| a.first })
107
+ end
108
+
109
+ it 'destroys disks individually' do
110
+ domain_disks.each do |disk, name|
111
+ expect(disk).to receive(:name).and_return(name).at_least(:once)
112
+ expect(disk).to receive(:destroy)
113
+ end
114
+ expect(domain).to receive(:destroy).with(destroy_volumes: false)
115
+ expect(subject.call(env)).to be_nil
116
+ end
117
+
118
+ context 'when has disks added via custom virsh commands' do
119
+ let(:domain_xml_file) { 'box_multiple_disks_and_additional_and_custom_disks.xml' }
120
+ let(:domain_disks) {[
121
+ [double('box-disk-1'), 'vagrant-test_default.img'],
122
+ [double('box-disk-2'), 'vagrant-test_default_1.img'],
123
+ [double('box-disk-3'), 'vagrant-test_default_2.img'],
124
+ [double('additional-disk-1'), 'vagrant-test_default-vdd.qcow2'],
125
+ [double('additional-disk-2'), 'vagrant-test_default-vde.qcow2'],
126
+ [double('custom-disk-1'), 'vagrant-test_default-vdf.qcow2'],
127
+ ]}
128
+
129
+ it 'only destroys expected disks' do
130
+ expect(ui).to receive(:warn).with(/Unexpected number of volumes detected.*/)
131
+ domain_disks.each do |disk, name|
132
+ expect(disk).to receive(:name).and_return(name).at_least(:once)
133
+ next if disk == domain_disks.last.first
134
+ expect(disk).to receive(:destroy)
135
+ end
136
+ expect(domain).to receive(:destroy).with(destroy_volumes: false)
137
+ expect(subject.call(env)).to be_nil
138
+ end
139
+
140
+ context 'without aliases' do
141
+ let(:domain_xml_file) { 'box_multiple_disks_and_additional_and_custom_disks_no_aliases.xml' }
142
+
143
+ it 'only destroys expected disks' do
144
+ expect(ui).to receive(:warn).with(/Destroying machine that was originally created without device aliases.*/)
145
+ expect(ui).to receive(:warn).with(/Unexpected number of volumes detected/)
146
+ expect(ui).to receive(:warn).with(/box metadata not available to get volume list during destroy, assuming inferred list/)
147
+ domain_disks.each do |disk, name|
148
+ expect(disk).to receive(:name).and_return(name).at_least(:once)
149
+ # ignore box disks 2 and 3 and the last custom disk
150
+ next if domain_disks.last.first == disk
151
+ expect(disk).to receive(:destroy)
152
+ end
153
+ expect(domain).to receive(:destroy).with(destroy_volumes: false)
154
+ expect(subject.call(env)).to be_nil
155
+ end
156
+
157
+ context 'with box metadata' do
158
+ let(:box) { instance_double(::Vagrant::Box) }
159
+ before do
160
+ allow(env[:machine]).to receive(:box).and_return(box)
161
+ allow(box).to receive(:metadata).and_return(Hash[
162
+ 'disks' => [
163
+ {:name => 'box-disk-1'},
164
+ {:name => 'box-disk-2'},
165
+ {:name => 'box-disk-3'},
166
+ ]
167
+ ])
168
+ end
169
+
170
+ it 'only destroys expected disks' do
171
+ expect(ui).to receive(:warn).with(/Destroying machine that was originally created without device aliases.*/)
172
+ expect(ui).to receive(:warn).with(/Unexpected number of volumes detected/)
173
+ domain_disks.each do |disk, name|
174
+ expect(disk).to receive(:name).and_return(name).at_least(:once)
175
+ # ignore box disks 2 and 3 and the last custom disk
176
+ next if domain_disks.last.first == disk
177
+ expect(disk).to receive(:destroy)
178
+ end
179
+ expect(domain).to receive(:destroy).with(destroy_volumes: false)
180
+ expect(subject.call(env)).to be_nil
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
78
186
  end
79
187
 
80
188
  context 'when has CDROMs attached' do
81
- let(:vagrantfile) do
189
+ let(:vagrantfile_providerconfig) do
82
190
  <<-EOF
83
- Vagrant.configure('2') do |config|
84
- config.vm.define :test
85
- config.vm.provider :libvirt do |libvirt|
86
191
  libvirt.storage :file, :device => :cdrom
87
- end
88
- end
89
192
  EOF
90
193
  end
194
+ let(:domain_xml_file) { 'cdrom_domain.xml' }
91
195
 
92
196
  it 'uses explicit removal of disks' do
93
- allow(libvirt_domain).to receive(:name).and_return('test')
94
- allow(domain).to receive(:volumes).and_return([root_disk, nil])
197
+ expect(domain).to receive(:volumes).and_return([root_disk, nil])
198
+ expect(libvirt_domain).to receive(:xml_desc).and_return(domain_xml)
95
199
 
96
200
  expect(domain).to_not receive(:destroy).with(destroy_volumes: true)
97
201
  expect(root_disk).to receive(:destroy) # root disk remove
@@ -132,7 +132,11 @@ describe VagrantPlugins::ProviderLibvirt::Action::ForwardPorts do
132
132
  it 'should spawn ssh to setup forwarding' do
133
133
  expect(env).to receive(:[]).with(:forwarded_ports).and_return([port_options])
134
134
  expect(ui).to receive(:info).with("#{port_options[:guest]} (guest) => #{port_options[:host]} (host) (adapter eth0)")
135
- expect(subject).to receive(:spawn).with(/ssh -n -o User=vagrant -o Port=22.*-L \*:8080:192.168.1.121:80 -N localhost/, anything).and_return(9999)
135
+ expect(subject).to receive(:spawn) do |*args, **kwargs|
136
+ pargs = RUBY_VERSION < "2.7" ? args[0...-1] : args
137
+ expect(pargs).to start_with('ssh', '-o', 'User=vagrant', '-o', 'Port=22')
138
+ expect(pargs).to end_with('-n', '-L', '*:8080:192.168.1.121:80', '-N', 'localhost')
139
+ end.and_return(9999)
136
140
 
137
141
  expect(subject.forward_ports(env)).to eq([port_options])
138
142
 
@@ -148,7 +152,11 @@ describe VagrantPlugins::ProviderLibvirt::Action::ForwardPorts do
148
152
  expect(ui).to receive(:info).with("#{port_options[:guest]} (guest) => #{port_options[:host]} (host) (adapter eth0)")
149
153
  expect(ui).to receive(:info).with('Requesting sudo for host port(s) <= 1024')
150
154
  expect(subject).to receive(:system).with('sudo -v').and_return(true)
151
- expect(subject).to receive(:spawn).with(/sudo ssh -n -o User=vagrant -o Port=22.*-L \*:80:192.168.1.121:80 -N localhost/, anything).and_return(10000)
155
+ expect(subject).to receive(:spawn) do |*args, **kwargs|
156
+ pargs = RUBY_VERSION < "2.7" ? args[0...-1] : args
157
+ expect(pargs).to start_with('sudo', 'ssh', '-o', 'User=vagrant', '-o', 'Port=22')
158
+ expect(pargs).to end_with('-n', '-L', '*:80:192.168.1.121:80', '-N', 'localhost')
159
+ end.and_return(10000)
152
160
 
153
161
  expect(subject.forward_ports(env)).to eq([port_options])
154
162