Files
vagrant-libvirt/spec/unit/config_spec.rb
Darragh Bailey 46e0d09ce6 Fix separate storage config blocks device assignment
Move device assignment for CDROM's and disk storage to occur during
finalize, to ensure that storage config blocks are merged before
assigning devices.

This ensures that defining multiple storage config blocks within the
same or different Vagrantfiles that are merged, works as expected to
create multiple separate storage devices without needing to explicitly
define the dev name.

Fixes #655
2016-11-25 17:14:54 +00:00

111 lines
3.3 KiB
Ruby

require "spec_helper"
require "support/sharedcontext"
require "vagrant-libvirt/config"
describe VagrantPlugins::ProviderLibvirt::Config do
include_context "unit"
def assert_invalid
errors = subject.validate(machine)
if errors.values.any? { |v| !v.empty? }
raise "No errors: #{errors.inspect}"
end
end
def assert_valid
errors = subject.validate(machine)
if !errors.values.all? { |v| v.empty? }
raise "Errors: #{errors.inspect}"
end
end
describe "#validate" do
it "is valid with defaults" do
assert_valid
end
it "is valid if relative path used for disk" do
subject.storage :file, :path => '../path/to/file.qcow2'
assert_valid
end
it "should be invalid if absolute path used for disk" do
subject.storage :file, :path => '/absolute/path/to/file.qcow2'
assert_invalid
end
context "with mac defined" do
let (:vm) { double("vm") }
let (:networks) { double("networks") }
before do
allow(vm).to receive(:networks).and_return(networks)
allow(machine.config).to receive(:vm).and_return(vm)
end
it "is valid with valid mac" do
allow(networks).to receive(:each).and_return([:public, {:mac => "aa:bb:cc:dd:ee:ff"}])
assert_valid
end
it "should be invalid if MAC not formatted correctly" do
allow(networks).to receive(:each).and_return([:public, {:mac => "aabbccddeeff"}])
assert_invalid
end
end
end
describe "#merge" do
let(:one) { described_class.new }
let(:two) { described_class.new }
subject { one.merge(two) }
context "storage" do
context "with disks" do
context "assigned specific devices" do
it "should merge disks with specific devices" do
one.storage(:file, :device => "vdb")
two.storage(:file, :device => "vdc")
subject.finalize!
expect(subject.disks).to include(include(:device => "vdb"),
include(:device => "vdc"))
end
end
context "without devices given" do
it "should merge disks with different devices assigned automatically" do
one.storage(:file)
two.storage(:file)
subject.finalize!
expect(subject.disks).to include(include(:device => "vdb"),
include(:device => "vdc"))
end
end
end
context "with cdroms only" do
context "assigned specific devs" do
it "should merge disks with specific devices" do
one.storage(:file, :device => :cdrom, :dev => "hda")
two.storage(:file, :device => :cdrom, :dev => "hdb")
subject.finalize!
expect(subject.cdroms).to include(include(:dev => "hda"),
include(:dev => "hdb"))
end
end
context "without devs given" do
it "should merge cdroms with different devs assigned automatically" do
one.storage(:file, :device => :cdrom)
two.storage(:file, :device => :cdrom)
subject.finalize!
expect(subject.cdroms).to include(include(:dev => "hda"),
include(:dev => "hdb"))
end
end
end
end
end
end