vagrant-libvirt 0.1.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +530 -100
  3. data/lib/vagrant-libvirt/action.rb +7 -1
  4. data/lib/vagrant-libvirt/action/clean_machine_folder.rb +28 -0
  5. data/lib/vagrant-libvirt/action/create_domain.rb +78 -22
  6. data/lib/vagrant-libvirt/action/create_domain_volume.rb +57 -57
  7. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +1 -3
  8. data/lib/vagrant-libvirt/action/create_networks.rb +11 -4
  9. data/lib/vagrant-libvirt/action/destroy_domain.rb +1 -1
  10. data/lib/vagrant-libvirt/action/forward_ports.rb +40 -40
  11. data/lib/vagrant-libvirt/action/halt_domain.rb +25 -9
  12. data/lib/vagrant-libvirt/action/handle_box_image.rb +163 -72
  13. data/lib/vagrant-libvirt/action/is_running.rb +1 -3
  14. data/lib/vagrant-libvirt/action/is_suspended.rb +4 -4
  15. data/lib/vagrant-libvirt/action/package_domain.rb +10 -4
  16. data/lib/vagrant-libvirt/action/start_domain.rb +86 -29
  17. data/lib/vagrant-libvirt/action/wait_till_up.rb +8 -52
  18. data/lib/vagrant-libvirt/cap/{mount_p9.rb → mount_9p.rb} +2 -2
  19. data/lib/vagrant-libvirt/cap/mount_virtiofs.rb +37 -0
  20. data/lib/vagrant-libvirt/cap/public_address.rb +16 -0
  21. data/lib/vagrant-libvirt/cap/{synced_folder.rb → synced_folder_9p.rb} +4 -5
  22. data/lib/vagrant-libvirt/cap/synced_folder_virtiofs.rb +109 -0
  23. data/lib/vagrant-libvirt/config.rb +257 -34
  24. data/lib/vagrant-libvirt/driver.rb +49 -32
  25. data/lib/vagrant-libvirt/errors.rb +24 -1
  26. data/lib/vagrant-libvirt/plugin.rb +19 -5
  27. data/lib/vagrant-libvirt/provider.rb +2 -9
  28. data/lib/vagrant-libvirt/templates/domain.xml.erb +40 -10
  29. data/lib/vagrant-libvirt/templates/private_network.xml.erb +1 -1
  30. data/lib/vagrant-libvirt/templates/public_interface.xml.erb +5 -1
  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 +21 -3
  34. data/lib/vagrant-libvirt/util/ui.rb +23 -0
  35. data/lib/vagrant-libvirt/version +1 -0
  36. data/lib/vagrant-libvirt/version.rb +72 -1
  37. data/locales/en.yml +12 -0
  38. data/spec/spec_helper.rb +37 -3
  39. data/spec/support/binding_proc.rb +24 -0
  40. data/spec/support/libvirt_context.rb +3 -1
  41. data/spec/support/matchers/have_file_content.rb +63 -0
  42. data/spec/support/sharedcontext.rb +7 -3
  43. data/spec/unit/action/clean_machine_folder_spec.rb +48 -0
  44. data/spec/unit/action/create_domain_spec.rb +166 -0
  45. data/spec/unit/action/create_domain_spec/default_system_storage_pool.xml +17 -0
  46. data/spec/unit/action/create_domain_spec/default_user_storage_pool.xml +17 -0
  47. data/spec/unit/action/create_domain_volume_spec.rb +102 -0
  48. data/spec/unit/action/create_domain_volume_spec/one_disk_in_storage.xml +21 -0
  49. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_0.xml +21 -0
  50. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_1.xml +21 -0
  51. data/spec/unit/action/create_domain_volume_spec/three_disks_in_storage_disk_2.xml +21 -0
  52. data/spec/unit/action/destroy_domain_spec.rb +3 -3
  53. data/spec/unit/action/forward_ports_spec.rb +202 -0
  54. data/spec/unit/action/halt_domain_spec.rb +90 -0
  55. data/spec/unit/action/handle_box_image_spec.rb +363 -0
  56. data/spec/unit/action/set_name_of_domain_spec.rb +2 -2
  57. data/spec/unit/action/start_domain_spec.rb +231 -0
  58. data/spec/unit/action/start_domain_spec/clock_timer_rtc.xml +50 -0
  59. data/spec/unit/action/start_domain_spec/default.xml +48 -0
  60. data/spec/unit/action/start_domain_spec/default_added_tpm_path.xml +48 -0
  61. data/spec/unit/action/start_domain_spec/default_added_tpm_version.xml +48 -0
  62. data/spec/unit/action/wait_till_up_spec.rb +22 -21
  63. data/spec/unit/config_spec.rb +438 -0
  64. data/spec/unit/provider_spec.rb +11 -0
  65. data/spec/unit/templates/domain_all_settings.xml +16 -3
  66. data/spec/unit/templates/domain_custom_cpu_model.xml +4 -1
  67. data/spec/unit/templates/domain_defaults.xml +4 -1
  68. data/spec/unit/templates/domain_spec.rb +102 -3
  69. data/spec/unit/templates/tpm/version_1.2.xml +54 -0
  70. data/spec/unit/templates/tpm/version_2.0.xml +53 -0
  71. metadata +108 -16
  72. data/lib/vagrant-libvirt/action/halt_confirm.rb +0 -20
@@ -0,0 +1,23 @@
1
+
2
+ module VagrantPlugins
3
+ module ProviderLibvirt
4
+ module Util
5
+ module Ui
6
+ # Since v2.2.8 Vagrant support --no-tty option, which silences
7
+ # progress bars and other interactive elements for cleaner logs
8
+ # in scripts, but requires a slight change in UI object handling.
9
+ # This helper allows the vagrant-libvirt plugin to stay compatible
10
+ # with the older Vagrant versions.
11
+ # See: https://github.com/hashicorp/vagrant/pull/11465/
12
+ def rewriting(ui)
13
+ if ui.respond_to?(:rewriting)
14
+ ui.rewriting {|rw| yield rw}
15
+ else
16
+ yield ui
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1 @@
1
+ 0.5.0
@@ -1,5 +1,76 @@
1
+ require 'open3'
2
+ require 'tmpdir'
3
+
1
4
  module VagrantPlugins
2
5
  module ProviderLibvirt
3
- VERSION = '0.1.2'.freeze
6
+ VERSION_FILE = File.dirname(__FILE__) + "/version"
7
+
8
+ GIT_ARCHIVE_VERSION = "$Format:%H %D$"
9
+
10
+ HOMEPAGE = 'https://github.com/vagrant-libvirt/vagrant-libvirt'
11
+
12
+ def self.get_version
13
+ if File.exist?(VERSION_FILE)
14
+ # built gem
15
+ version = File.read(VERSION_FILE)
16
+ elsif self.inside_git_repository
17
+ # local repo
18
+ git_version = `git describe --tags`
19
+ version = self.version_from_describe(git_version)
20
+ elsif !GIT_ARCHIVE_VERSION.start_with?('$Format')
21
+ # archive - format string replaced during export
22
+ hash, refs = GIT_ARCHIVE_VERSION.split(' ', 2)
23
+
24
+ tag = refs.split(',').select { |ref| ref.strip.start_with?("tag:") }.first
25
+ if tag != nil
26
+ # tagged
27
+ version = tag.strip.split(' ').last
28
+ else
29
+ version = ""
30
+ # arbitrary branch/commit
31
+ Dir.mktmpdir do |dir|
32
+ stdout_and_stderr, status = Open3.capture2e("git -C #{dir} clone --bare #{HOMEPAGE}")
33
+ raise "failed to clone original to resolve version: #{stdout_and_stderr}" unless status.success?
34
+
35
+ stdout_and_stderr, status = Open3.capture2e("git --git-dir=#{dir}/vagrant-libvirt.git describe --tags #{hash}")
36
+ raise "failed to determine version for #{hash}: #{stdout_and_stderr}" unless status.success?
37
+
38
+ version = version_from_describe(stdout_and_stderr)
39
+ end
40
+
41
+ # in this case write the version file to avoid cloning a second time
42
+ File.write(VERSION_FILE, version)
43
+ end
44
+ else
45
+ # no idea
46
+ version = "9999"
47
+ end
48
+
49
+ return version.freeze
50
+ end
51
+
52
+ def self.write_version
53
+ File.write(VERSION_FILE, self.get_version)
54
+ end
55
+
56
+ private
57
+
58
+ def self.inside_git_repository
59
+ _, status = Open3.capture2e("git rev-parse --git-dir")
60
+
61
+ status.success?
62
+ end
63
+
64
+ def self.version_from_describe(describe)
65
+ version_parts = describe.split('-').first(2) # drop the git sha if it exists
66
+ if version_parts.length > 1
67
+ # increment the patch number so that this is marked as a pre-release of the
68
+ # next possible release
69
+ main_version_parts = Gem::Version.new(version_parts[0]).segments
70
+ main_version_parts[-1] = main_version_parts.last + 1
71
+ version_parts = main_version_parts + ["pre", version_parts[1]]
72
+ end
73
+ version = version_parts.join(".")
74
+ end
4
75
  end
5
76
  end
data/locales/en.yml CHANGED
@@ -72,6 +72,14 @@ en:
72
72
  no_storage_pool: |-
73
73
  No usable storage pool found! Please check if storage pool is
74
74
  created and available.
75
+ box_format_duplicate_volume: |-
76
+ Encountered a duplicate volume name '%{volume}' generated for disk '%{new_disk}', due to already allocated for disk '%{orig_disk}'.
77
+ box_format_missing_attribute: |-
78
+ Invalid box metadata, missing expected attribute: '%{attribute}'
79
+ bad_box_image: |-
80
+ Received error when query the box image details from '%{image}'.
81
+ Stdout: %{out}
82
+ Stderr: %{err}
75
83
  no_box_volume: |-
76
84
  Volume for box image is missing in storage pools. Try to run vagrant
77
85
  again, or check if storage volume is accessible.
@@ -92,10 +100,14 @@ en:
92
100
  Error: %{stderr}
93
101
  no_box_virtual_size: |-
94
102
  No image virtual size specified for box.
103
+ no_disk_virtual_size: |-
104
+ No image virtual size specified for disk with index %{disk_index}.
95
105
  no_box_format: |-
96
106
  No image format specified for box.
97
107
  wrong_box_format: |-
98
108
  Wrong image format specified for box.
109
+ wrong_disk_format: |-
110
+ Wrong image format specified for disk with index %{disk_index}.
99
111
  fog_libvirt_connection_error: |-
100
112
  Error while connecting to Libvirt: %{error_message}
101
113
  fog_create_volume_error: |-
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,43 @@
1
- require 'coveralls'
2
- Coveralls.wear!
1
+ require 'simplecov'
2
+ require 'simplecov-lcov'
3
+
4
+ # patch simplecov configuration
5
+ if ! SimpleCov::Configuration.method_defined? :branch_coverage?
6
+ module SimpleCov
7
+ module Configuration
8
+ def branch_coverage?
9
+ return false
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ SimpleCov::Formatter::LcovFormatter.config do |config|
16
+ config.report_with_single_file = true
17
+ config.single_report_path = 'coverage/lcov.info'
18
+ end
19
+
20
+ SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new(
21
+ [
22
+ SimpleCov::Formatter::HTMLFormatter,
23
+ SimpleCov::Formatter::LcovFormatter,
24
+ ]
25
+ )
26
+ SimpleCov.start do
27
+ add_filter 'spec/'
28
+ end
3
29
 
4
30
  require 'vagrant-libvirt'
5
31
  require 'support/environment_helper'
6
32
  require 'vagrant-spec/unit'
7
33
 
8
- RSpec.configure do |spec|
34
+ Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each { |f| require f }
35
+
36
+ RSpec.configure do |config|
37
+ # ensure that setting of LIBVIRT_DEFAULT_URI in the environment is not picked
38
+ # up directly by tests, instead they must set as needed. Some build envs will
39
+ # may have it set to 'qemu:///session'.
40
+ config.before(:suite) do
41
+ ENV.delete('LIBVIRT_DEFAULT_URI')
42
+ end
9
43
  end
@@ -0,0 +1,24 @@
1
+ ##
2
+ # A simple extension of the Proc class that supports setting a custom binding
3
+ # and evaluates everything in the Proc using the new binding.
4
+
5
+ class ProcWithBinding < Proc
6
+ ##
7
+ # Set the binding for this instance
8
+
9
+ def apply_binding(bind, *args)
10
+ @binding = bind
11
+ instance_exec(*args, &self)
12
+ end
13
+
14
+ def method_missing(method, *args)
15
+ begin
16
+ method_from_binding = eval("method(#{method.inspect})", @binding)
17
+ return method_from_binding.call(*args)
18
+ rescue NameError
19
+ # fall through on purpose
20
+ end
21
+
22
+ super
23
+ end
24
+ end
@@ -7,6 +7,7 @@ shared_context 'libvirt' do
7
7
  let(:id) { 'dummy-vagrant_dummy' }
8
8
  let(:connection) { double('connection') }
9
9
  let(:domain) { double('domain') }
10
+ let(:logger) { double('logger') }
10
11
 
11
12
  def connection_result(options = {})
12
13
  result = options.fetch(:result, nil)
@@ -25,6 +26,7 @@ shared_context 'libvirt' do
25
26
  # return some information for domain when needed
26
27
  allow(domain).to receive(:mac).and_return('9C:D5:53:F1:5A:E7')
27
28
 
28
- machine.stub(id: id)
29
+ allow(machine).to receive(:id).and_return(id)
30
+ allow(Log4r::Logger).to receive(:new).and_return(logger)
29
31
  end
30
32
  end
@@ -0,0 +1,63 @@
1
+ require "rspec/expectations/version"
2
+ #
3
+ # Taken from https://github.com/cucumber/aruba/blob/main/lib/aruba/matchers/file/have_file_content.rb
4
+ # with minor modifications
5
+ #
6
+ # @!method have_file_content(content)
7
+ # This matchers checks if <file> has content. `content` can be a string,
8
+ # regexp or an RSpec matcher.
9
+ #
10
+ # @param [String, Regexp, Matcher] content
11
+ # Specifies the content of the file
12
+ #
13
+ # @return [Boolean] The result
14
+ #
15
+ # false:
16
+ # * if file does not exist
17
+ # * if file content is not equal string
18
+ # * if file content does not include regexp
19
+ # * if file content does not match the content specification
20
+ #
21
+ # true:
22
+ # * if file content includes regexp
23
+ # * if file content is equal string
24
+ # * if file content matches the content specification
25
+ #
26
+ # @example Use matcher with string
27
+ #
28
+ # RSpec.describe do
29
+ # it { expect(file1).to have_file_content('a') }
30
+ # end
31
+ #
32
+ # @example Use matcher with regexp
33
+ #
34
+ # RSpec.describe do
35
+ # it { expect(file1).to have_file_content(/a/) }
36
+ # end
37
+ #
38
+ # @example Use matcher with an RSpec matcher
39
+ #
40
+ # RSpec.describe do
41
+ # it { expect(file1).to have_file_content(a_string_starting_with 'a') }
42
+ # it { expect(files1).to include a_file_having_content(a_string_starting_with 'a') }
43
+ # end
44
+ RSpec::Matchers.define :have_file_content do |expected|
45
+ match do |actual|
46
+ next false unless File.exists?(actual)
47
+
48
+ @actual = File.read(actual).chomp
49
+ @expected = if expected.is_a? String
50
+ expected.chomp
51
+ else
52
+ expected
53
+ end
54
+
55
+ values_match?(@expected, @actual)
56
+ end
57
+
58
+ diffable if expected.is_a? String
59
+
60
+ description { "have file content: #{description_of expected}" }
61
+ end
62
+
63
+ RSpec::Matchers.alias_matcher :a_file_having_content, :have_file_content
@@ -3,10 +3,14 @@ require 'spec_helper'
3
3
  shared_context 'unit' do
4
4
  include_context 'vagrant-unit'
5
5
 
6
+ let(:vagrantfile_providerconfig) { '' }
6
7
  let(:vagrantfile) do
7
8
  <<-EOF
8
9
  Vagrant.configure('2') do |config|
9
10
  config.vm.define :test
11
+ config.vm.provider :libvirt do |libvirt|
12
+ #{vagrantfile_providerconfig}
13
+ end
10
14
  end
11
15
  EOF
12
16
  end
@@ -17,7 +21,7 @@ shared_context 'unit' do
17
21
  end
18
22
  let(:env) { { env: iso_env, machine: machine, ui: ui, root_path: '/rootpath' } }
19
23
  let(:conf) { Vagrant::Config::V2::DummyConfig.new }
20
- let(:ui) { Vagrant::UI::Basic.new }
24
+ let(:ui) { Vagrant::UI::Silent.new }
21
25
  let(:iso_env) { test_env.create_vagrant_env ui_class: Vagrant::UI::Basic }
22
26
  let(:machine) { iso_env.machine(:test, :libvirt) }
23
27
  # Mock the communicator to prevent SSH commands for being executed.
@@ -28,7 +32,7 @@ shared_context 'unit' do
28
32
  let(:plugin) { register_plugin }
29
33
 
30
34
  before (:each) do
31
- machine.stub(guest: guest)
32
- machine.stub(communicator: communicator)
35
+ allow(machine).to receive(:guest).and_return(guest)
36
+ allow(machine).to receive(:communicator).and_return(communicator)
33
37
  end
34
38
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'support/sharedcontext'
3
+
4
+ require 'vagrant-libvirt/action/clean_machine_folder'
5
+
6
+ describe VagrantPlugins::ProviderLibvirt::Action::CleanMachineFolder do
7
+ subject { described_class.new(app, env) }
8
+
9
+ include_context 'unit'
10
+
11
+ describe '#call' do
12
+ context 'with default options' do
13
+ it 'should verbosely remove the folder' do
14
+ expect(ui).to receive(:info).with('Deleting the machine folder')
15
+ expect(FileUtils).to receive(:rm_rf).with(machine.data_dir, {:secure => true})
16
+
17
+ expect(subject.call(env)).to be_nil
18
+ end
19
+ end
20
+
21
+ context 'when the data dir doesn\'t exist' do
22
+ before do
23
+ Dir.mktmpdir do |d|
24
+ # returns a temporary directory that has been already deleted when running
25
+ expect(machine).to receive(:data_dir).and_return(d.to_s).exactly(2).times
26
+ end
27
+ end
28
+
29
+ it 'should remove the folder' do
30
+ expect(ui).to receive(:info).with('Deleting the machine folder')
31
+ expect(FileUtils).to receive(:rm_rf).with(machine.data_dir, {:secure => true})
32
+
33
+ expect(subject.call(env)).to be_nil
34
+ end
35
+ end
36
+
37
+ context 'with quiet option enabled' do
38
+ subject { described_class.new(app, env, {:quiet => true}) }
39
+
40
+ it 'should quietly remove the folder' do
41
+ expect(ui).to_not receive(:info).with('Deleting the machine folder')
42
+ expect(FileUtils).to receive(:rm_rf).with(machine.data_dir, {:secure => true})
43
+
44
+ expect(subject.call(env)).to be_nil
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,166 @@
1
+ require 'spec_helper'
2
+ require 'support/sharedcontext'
3
+ require 'support/libvirt_context'
4
+
5
+ require 'vagrant-libvirt/errors'
6
+ require 'vagrant-libvirt/action/create_domain'
7
+
8
+ describe VagrantPlugins::ProviderLibvirt::Action::CreateDomain do
9
+ subject { described_class.new(app, env) }
10
+
11
+ include_context 'unit'
12
+ include_context 'libvirt'
13
+
14
+ let(:libvirt_client) { double('libvirt_client') }
15
+ let(:servers) { double('servers') }
16
+ let(:volumes) { double('volumes') }
17
+
18
+ let(:storage_pool_xml) { File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), test_file)) }
19
+ let(:libvirt_storage_pool) { double('storage_pool') }
20
+
21
+ describe '#call' do
22
+ before do
23
+ allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver)
24
+ .to receive(:connection).and_return(connection)
25
+ allow(connection).to receive(:client).and_return(libvirt_client)
26
+
27
+ allow(connection).to receive(:servers).and_return(servers)
28
+ allow(connection).to receive(:volumes).and_return(volumes)
29
+
30
+ allow(logger).to receive(:info)
31
+
32
+ env[:domain_name] = "vagrant-test_default"
33
+
34
+ env[:box_volumes] = []
35
+ env[:box_volumes].push({
36
+ :path=>"/test/box.img",
37
+ :name=>"test_vagrant_box_image_1.1.1_0.img",
38
+ :virtual_size=>5
39
+ })
40
+ # should be ignored for system session and used for user session
41
+ allow(Process).to receive(:uid).and_return(9999)
42
+ allow(Process).to receive(:gid).and_return(9999)
43
+ end
44
+
45
+ context 'connection => qemu:///system' do
46
+ context 'default pool' do
47
+ let(:test_file) { 'default_system_storage_pool.xml' }
48
+
49
+ it 'should execute correctly' do
50
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(libvirt_storage_pool)
51
+ expect(libvirt_storage_pool).to receive(:xml_desc).and_return(storage_pool_xml)
52
+ expect(servers).to receive(:create).and_return(machine)
53
+ expect(volumes).to_not receive(:create) # additional disks only
54
+
55
+ expect(subject.call(env)).to be_nil
56
+ end
57
+
58
+ context 'additional disks' do
59
+ let(:vagrantfile) do
60
+ <<-EOF
61
+ Vagrant.configure('2') do |config|
62
+ config.vm.define :test
63
+ config.vm.provider :libvirt do |libvirt|
64
+ libvirt.storage :file, :size => '20G'
65
+ end
66
+ end
67
+ EOF
68
+ end
69
+
70
+ context 'volume create failed' do
71
+ it 'should raise an exception' do
72
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(libvirt_storage_pool)
73
+ expect(libvirt_storage_pool).to receive(:xml_desc).and_return(storage_pool_xml)
74
+ expect(volumes).to receive(:create).and_raise(Libvirt::Error)
75
+
76
+ expect{ subject.call(env) }.to raise_error(VagrantPlugins::ProviderLibvirt::Errors::FogCreateDomainVolumeError)
77
+ end
78
+ end
79
+
80
+ context 'volume create succeeded' do
81
+ it 'should complete' do
82
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(libvirt_storage_pool)
83
+ expect(libvirt_storage_pool).to receive(:xml_desc).and_return(storage_pool_xml)
84
+ expect(volumes).to receive(:create).with(
85
+ hash_including(
86
+ :path => "/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2",
87
+ :owner => 0,
88
+ :group => 0,
89
+ :pool_name => "default",
90
+ )
91
+ )
92
+ expect(servers).to receive(:create).and_return(machine)
93
+
94
+ expect(subject.call(env)).to be_nil
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ context 'no default pool' do
101
+ it 'should raise an exception' do
102
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(nil)
103
+
104
+ expect{ subject.call(env) }.to raise_error(VagrantPlugins::ProviderLibvirt::Errors::NoStoragePool)
105
+ end
106
+ end
107
+ end
108
+
109
+ context 'connection => qemu:///session' do
110
+ let(:vagrantfile) do
111
+ <<-EOF
112
+ Vagrant.configure('2') do |config|
113
+ config.vm.define :test
114
+ config.vm.provider :libvirt do |libvirt|
115
+ libvirt.qemu_use_session = true
116
+ end
117
+ end
118
+ EOF
119
+ end
120
+
121
+ context 'default pool' do
122
+ let(:test_file) { 'default_user_storage_pool.xml' }
123
+
124
+ it 'should execute correctly' do
125
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(libvirt_storage_pool)
126
+ expect(libvirt_storage_pool).to receive(:xml_desc).and_return(storage_pool_xml)
127
+ expect(servers).to receive(:create).and_return(machine)
128
+
129
+ expect(subject.call(env)).to be_nil
130
+ end
131
+
132
+ context 'additional disks' do
133
+ let(:vagrantfile) do
134
+ <<-EOF
135
+ Vagrant.configure('2') do |config|
136
+ config.vm.define :test
137
+ config.vm.provider :libvirt do |libvirt|
138
+ libvirt.qemu_use_session = true
139
+ libvirt.storage :file, :size => '20G'
140
+ end
141
+ end
142
+ EOF
143
+ end
144
+
145
+ context 'volume create succeeded' do
146
+ it 'should complete' do
147
+ expect(libvirt_client).to receive(:lookup_storage_pool_by_name).and_return(libvirt_storage_pool)
148
+ expect(libvirt_storage_pool).to receive(:xml_desc).and_return(storage_pool_xml)
149
+ expect(volumes).to receive(:create).with(
150
+ hash_including(
151
+ :path => "/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2",
152
+ :owner => 9999,
153
+ :group => 9999,
154
+ :pool_name => "default",
155
+ )
156
+ )
157
+ expect(servers).to receive(:create).and_return(machine)
158
+
159
+ expect(subject.call(env)).to be_nil
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end