mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Re-enable handling of the disk_device domain volume setting to ensure it can be overridden from the default of vda to a value chosen. Provide a disk resolver to resolve devices after the box has been downloaded so that initial devices can be correctly allocated and avoid conflicts with additional disks added that would otherwise get assigned the same device. Removes hack for destroy domain when more than one disk, as now devices in the config are only present if provided by the configuration. Fixes: #1353
117 lines
3.8 KiB
Ruby
117 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
require 'vagrant-libvirt/util/resolvers'
|
|
|
|
describe VagrantPlugins::ProviderLibvirt::Util::DiskDeviceResolver do
|
|
subject { described_class.new }
|
|
|
|
def deep_clone_disks(disk_array)
|
|
new_array = []
|
|
disk_array.each do |disk|
|
|
new_array.push disk.dup
|
|
end
|
|
|
|
new_array
|
|
end
|
|
|
|
describe '#resolve!' do
|
|
context 'when using default prefix' do
|
|
[
|
|
[
|
|
[{:name => 'single-disk'}],
|
|
[{:name => 'single-disk', :device => 'vda'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1'}, {:name => 'disk2'}],
|
|
[{:name => 'disk1', :device => 'vda'}, {:name => 'disk2', :device => 'vdb'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1'}, {:name => 'disk2', :device => 'vdc'}],
|
|
[{:name => 'disk1', :device => 'vda'}, {:name => 'disk2', :device => 'vdc'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2', :device => 'vda'}],
|
|
],
|
|
].each do |input_disks, output_disks, options={}|
|
|
opts = {}.merge!(options)
|
|
it "should handle inputs: #{input_disks}" do
|
|
disks = deep_clone_disks(input_disks)
|
|
expect(subject.resolve!(disks)).to eq(output_disks)
|
|
expect(disks).to_not eq(input_disks)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when using different default prefix' do
|
|
let(:subject) { described_class.new('sd') }
|
|
[
|
|
[
|
|
[{:name => 'single-disk'}],
|
|
[{:name => 'single-disk', :device => 'sda'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1'}, {:name => 'disk2'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2', :device => 'sdb'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1'}, {:name => 'disk2', :device => 'vdc'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2', :device => 'vdc'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2', :device => 'sdb'}],
|
|
],
|
|
[
|
|
[{:name => 'disk1'}, {:name => 'disk2', :device => 'sda'}],
|
|
[{:name => 'disk1', :device => 'sdb'}, {:name => 'disk2', :device => 'sda'}],
|
|
],
|
|
].each do |input_disks, output_disks, options={}|
|
|
opts = {}.merge!(options)
|
|
it "should handle inputs: #{input_disks}" do
|
|
disks = deep_clone_disks(input_disks)
|
|
expect(subject.resolve!(disks)).to eq(output_disks)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when using custom prefix' do
|
|
[
|
|
[
|
|
[{:name => 'existing-disk', :device => 'vda'}],
|
|
[{:name => 'single-disk'}],
|
|
[{:name => 'single-disk', :device => 'sda'}],
|
|
{:prefix => 'sd'},
|
|
],
|
|
[
|
|
[{:name => 'existing-disk', :device => 'vda'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2'}],
|
|
[{:name => 'disk1', :device => 'sda'}, {:name => 'disk2', :device => 'sdb'}],
|
|
{:prefix => 'sd'},
|
|
],
|
|
].each do |existing, input_disks, output_disks, options={}|
|
|
opts = {}.merge!(options)
|
|
it "should handle inputs: #{input_disks} with opts: #{opts}" do
|
|
disks = deep_clone_disks(input_disks)
|
|
subject.resolve(existing)
|
|
expect(subject.resolve!(disks, opts)).to eq(output_disks)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#resolve' do
|
|
let(:input_disks) { [{:name => 'single-disk'}] }
|
|
let(:output_disks) { [{:name => 'single-disk', :device => 'vda'}] }
|
|
|
|
it "should resolve without modifying" do
|
|
disks = deep_clone_disks(input_disks)
|
|
expect(subject.resolve(disks)).to eq(output_disks)
|
|
expect(disks).to_not eq(output_disks)
|
|
expect(disks).to eq(input_disks)
|
|
end
|
|
end
|
|
end
|