mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Move the unit context to a name matching the other contexts. Remove some unnecessary entries from it that are unused, and remove references to the old name relying on spec helper to load all contexts.
309 lines
9.8 KiB
Ruby
309 lines
9.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
require 'fog/libvirt/models/compute/volume'
|
|
|
|
require 'vagrant-libvirt/errors'
|
|
require 'vagrant-libvirt/util/byte_number'
|
|
require 'vagrant-libvirt/action/create_domain'
|
|
|
|
describe VagrantPlugins::ProviderLibvirt::Action::CreateDomain do
|
|
subject { described_class.new(app, env) }
|
|
|
|
include_context 'unit'
|
|
include_context 'libvirt'
|
|
|
|
let(:servers) { double('servers') }
|
|
let(:volumes) { double('volumes') }
|
|
let(:domain_volume) { instance_double(::Fog::Libvirt::Compute::Volume) }
|
|
|
|
let(:domain_xml) { File.read(File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), domain_xml_file)) }
|
|
|
|
describe '#call' do
|
|
before do
|
|
allow(connection).to receive(:servers).and_return(servers)
|
|
allow(connection).to receive(:volumes).and_return(volumes)
|
|
allow(volumes).to receive(:all).and_return([domain_volume])
|
|
allow(domain_volume).to receive(:pool_name).and_return('default')
|
|
allow(domain_volume).to receive(:path).and_return('/var/lib/libvirt/images/vagrant-test_default.img')
|
|
allow(machine).to receive_message_chain("box.name") { 'vagrant-libvirt/test' }
|
|
|
|
allow(logger).to receive(:info)
|
|
allow(logger).to receive(:debug)
|
|
allow(ui).to receive(:info)
|
|
|
|
env[:domain_name] = "vagrant-test_default"
|
|
|
|
env[:domain_volumes] = []
|
|
env[:domain_volumes].push({
|
|
:device=>'vda',
|
|
:bus=>'virtio',
|
|
:cache=>'default',
|
|
:absolute_path=>'/var/lib/libvirt/images/vagrant-test_default.img',
|
|
:path=>"/test/box.img",
|
|
:name=>'test_vagrant_box_image_1.1.1_0.img',
|
|
:virtual_size=> ByteNumber.new(5),
|
|
:pool=>'default',
|
|
})
|
|
end
|
|
|
|
context 'connection => qemu:///system' do
|
|
let(:domain_xml_file) { 'default_domain.xml' }
|
|
|
|
before do
|
|
allow(machine.provider_config).to receive(:qemu_use_session).and_return(false)
|
|
end
|
|
|
|
it 'should execute correctly' do
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
expect(volumes).to_not receive(:create) # additional disks only
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
|
|
context 'graphics autoport disabled' do
|
|
let(:vagrantfile_providerconfig) do
|
|
<<-EOF
|
|
libvirt.graphics_port = 5900
|
|
EOF
|
|
end
|
|
|
|
it 'should emit the graphics port' do
|
|
expect(servers).to receive(:create).and_return(machine)
|
|
expect(volumes).to_not receive(:create) # additional disks only
|
|
expect(ui).to receive(:info).with(' -- Graphics Port: 5900')
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'additional disks' do
|
|
let(:disks) do
|
|
[
|
|
:device => 'vdb',
|
|
:cache => 'default',
|
|
:bus => 'virtio',
|
|
:type => 'qcow2',
|
|
:absolute_path => '/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2',
|
|
:virtual_size => ByteNumber.new(20*1024*1024*1024),
|
|
:pool => 'default',
|
|
]
|
|
end
|
|
|
|
before do
|
|
env[:disks] = disks
|
|
end
|
|
|
|
context 'volume create failed' do
|
|
it 'should raise an exception' do
|
|
expect(volumes).to receive(:create).and_raise(Libvirt::Error)
|
|
|
|
expect{ subject.call(env) }.to raise_error(VagrantPlugins::ProviderLibvirt::Errors::FogCreateDomainVolumeError)
|
|
end
|
|
end
|
|
|
|
context 'volume create succeeded' do
|
|
let(:domain_xml_file) { 'additional_disks_domain.xml' }
|
|
|
|
it 'should complete' do
|
|
expect(volumes).to receive(:create).with(
|
|
hash_including(
|
|
:path => "/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2",
|
|
:owner => 0,
|
|
:group => 0,
|
|
:pool_name => "default",
|
|
)
|
|
)
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with custom disk device setting' do
|
|
let(:domain_xml_file) { 'custom_disk_settings.xml' }
|
|
|
|
before do
|
|
env[:domain_volumes][0][:device] = 'sda'
|
|
end
|
|
|
|
it 'should set the domain device' do
|
|
expect(ui).to receive(:info).with(/ -- Image\(sda\):.*/)
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'with two domain disks' do
|
|
let(:domain_xml_file) { 'two_disk_settings.xml' }
|
|
let(:domain_volume_2) { double('domain_volume 2') }
|
|
|
|
before do
|
|
expect(volumes).to receive(:all).with(name: 'vagrant-test_default.img').and_return([domain_volume])
|
|
expect(volumes).to receive(:all).with(name: 'vagrant-test_default_1.img').and_return([domain_volume_2])
|
|
expect(domain_volume_2).to receive(:pool_name).and_return('default')
|
|
|
|
env[:domain_volumes].push({
|
|
:device=>'vdb',
|
|
:bus=>'virtio',
|
|
:cache=>'default',
|
|
:absolute_path=>'/var/lib/libvirt/images/vagrant-test_default_1.img',
|
|
:path=>"/test/box_1.img",
|
|
:name=>"test_vagrant_box_image_1.1.1_1.img",
|
|
:virtual_size=> ByteNumber.new(5),
|
|
:pool=>'default',
|
|
})
|
|
end
|
|
|
|
it 'should list multiple device entries' do
|
|
expect(ui).to receive(:info).with(/ -- Image\(vda\):.*/)
|
|
expect(ui).to receive(:info).with(/ -- Image\(vdb\):.*/)
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'with disk controller model virtio-scsi' do
|
|
before do
|
|
allow(machine.provider_config).to receive(:disk_controller_model).and_return('virtio-scsi')
|
|
expect(volumes).to receive(:all).with(name: 'vagrant-test_default.img').and_return([domain_volume])
|
|
|
|
env[:domain_volumes][0][:bus] = 'scsi'
|
|
end
|
|
|
|
it 'should add a virtio-scsi disk controller' do
|
|
expect(ui).to receive(:info).with(/ -- Image\(vda\):.*/)
|
|
expect(servers).to receive(:create) do |args|
|
|
expect(args[:xml]).to match(/<controller type='scsi' model='virtio-scsi' index='0'\/>/)
|
|
end.and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'sysinfo' do
|
|
let(:domain_xml_file) { 'sysinfo.xml' }
|
|
let(:vagrantfile_providerconfig) do
|
|
<<-EOF
|
|
libvirt.sysinfo = {
|
|
'bios': {
|
|
'vendor': 'Test Vendor',
|
|
'version': '',
|
|
},
|
|
'system': {
|
|
'manufacturer': 'Test Manufacturer',
|
|
'version': '0.1.0',
|
|
'serial': '',
|
|
},
|
|
'base board': {
|
|
'manufacturer': 'Test Manufacturer',
|
|
'version': '',
|
|
},
|
|
'chassis': {
|
|
'manufacturer': 'Test Manufacturer',
|
|
'serial': 'AABBCCDDEE',
|
|
'asset': '',
|
|
},
|
|
'oem strings': [
|
|
'app1: string1',
|
|
'app1: string2',
|
|
'app2: string1',
|
|
'app2: string2',
|
|
'',
|
|
'',
|
|
],
|
|
}
|
|
EOF
|
|
end
|
|
|
|
it 'should populate sysinfo as expected' do
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
|
|
context 'with block of empty entries' do
|
|
let(:domain_xml_file) { 'sysinfo_only_required.xml' }
|
|
let(:vagrantfile_providerconfig) do
|
|
<<-EOF
|
|
libvirt.sysinfo = {
|
|
'bios': {
|
|
'vendor': 'Test Vendor',
|
|
},
|
|
'system': {
|
|
'serial': '',
|
|
},
|
|
}
|
|
EOF
|
|
end
|
|
|
|
it 'should skip outputting the surrounding tags' do
|
|
expect(servers).to receive(:create).with(xml: domain_xml).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'connection => qemu:///session' do
|
|
before do
|
|
allow(machine.provider_config).to receive(:qemu_use_session).and_return(true)
|
|
end
|
|
|
|
it 'should execute correctly' do
|
|
expect(servers).to receive(:create).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
|
|
context 'additional disks' do
|
|
let(:vagrantfile_providerconfig) do
|
|
<<-EOF
|
|
libvirt.qemu_use_session = true
|
|
EOF
|
|
end
|
|
|
|
let(:disks) do
|
|
[
|
|
:device => 'vdb',
|
|
:cache => 'default',
|
|
:bus => 'virtio',
|
|
:type => 'qcow2',
|
|
:absolute_path => '/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2',
|
|
:virtual_size => ByteNumber.new(20*1024*1024*1024),
|
|
:pool => 'default',
|
|
]
|
|
end
|
|
|
|
before do
|
|
expect(Process).to receive(:uid).and_return(9999).at_least(:once)
|
|
expect(Process).to receive(:gid).and_return(9999).at_least(:once)
|
|
|
|
env[:disks] = disks
|
|
end
|
|
|
|
context 'volume create succeeded' do
|
|
it 'should complete' do
|
|
expect(volumes).to receive(:create).with(
|
|
hash_including(
|
|
:path => "/var/lib/libvirt/images/vagrant-test_default-vdb.qcow2",
|
|
:owner => 9999,
|
|
:group => 9999,
|
|
:pool_name => "default",
|
|
)
|
|
)
|
|
expect(servers).to receive(:create).and_return(machine)
|
|
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|