diff --git a/lib/vagrant-libvirt/config.rb b/lib/vagrant-libvirt/config.rb index fa2f638..f825901 100644 --- a/lib/vagrant-libvirt/config.rb +++ b/lib/vagrant-libvirt/config.rb @@ -99,6 +99,7 @@ module VagrantPlugins attr_accessor :machine_virtual_size attr_accessor :disk_bus attr_accessor :disk_device + attr_accessor :disk_controller_model attr_accessor :disk_driver_opts attr_accessor :nic_model_type attr_accessor :nested @@ -256,6 +257,7 @@ module VagrantPlugins @machine_virtual_size = UNSET_VALUE @disk_bus = UNSET_VALUE @disk_device = UNSET_VALUE + @disk_controller_model = UNSET_VALUE @disk_driver_opts = {} @nic_model_type = UNSET_VALUE @nested = UNSET_VALUE @@ -871,8 +873,15 @@ module VagrantPlugins @machine_type = nil if @machine_type == UNSET_VALUE @machine_arch = nil if @machine_arch == UNSET_VALUE @machine_virtual_size = nil if @machine_virtual_size == UNSET_VALUE - @disk_bus = 'virtio' if @disk_bus == UNSET_VALUE - @disk_device = 'vda' if @disk_device == UNSET_VALUE + @disk_device = @disk_bus == 'scsi' ? 'sda' : 'vda' if @disk_device == UNSET_VALUE + @disk_bus = @disk_device.start_with?('sd') ? 'scsi' : 'virtio' if @disk_bus == UNSET_VALUE + if @disk_controller_model == UNSET_VALUE + if @disk_bus == 'scsi' or @disk_device.start_with?('sd') == 'sd' + @disk_controller_model = 'virtio-scsi' + else + @disk_controller_model = nil + end + end @disk_driver_opts = {} if @disk_driver_opts == UNSET_VALUE @nic_model_type = nil if @nic_model_type == UNSET_VALUE @nested = false if @nested == UNSET_VALUE diff --git a/lib/vagrant-libvirt/templates/domain.xml.erb b/lib/vagrant-libvirt/templates/domain.xml.erb index 82fc84c..0e6ce8a 100644 --- a/lib/vagrant-libvirt/templates/domain.xml.erb +++ b/lib/vagrant-libvirt/templates/domain.xml.erb @@ -122,6 +122,11 @@ <%- end -%> +<%- if @disk_bus == "scsi" and @disk_controller_model != nil %> + <%- for idx in 0..(@domain_volumes.length / 7) do %> + + <%- end -%> +<%- end -%> <%# additional disks -%> <%- @disks.each_with_index do |d, index| -%> diff --git a/spec/unit/templates/domain_scsi_bus_storage.xml b/spec/unit/templates/domain_scsi_bus_storage.xml new file mode 100644 index 0000000..c1f6c54 --- /dev/null +++ b/spec/unit/templates/domain_scsi_bus_storage.xml @@ -0,0 +1,44 @@ + + + + + + + 1 + + + + + hvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/unit/templates/domain_scsi_device_storage.xml b/spec/unit/templates/domain_scsi_device_storage.xml new file mode 100644 index 0000000..d21be86 --- /dev/null +++ b/spec/unit/templates/domain_scsi_device_storage.xml @@ -0,0 +1,44 @@ + + + + + + + 1 + + + + + hvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/unit/templates/domain_scsi_multiple_controllers_storage.xml b/spec/unit/templates/domain_scsi_multiple_controllers_storage.xml new file mode 100644 index 0000000..48fb698 --- /dev/null +++ b/spec/unit/templates/domain_scsi_multiple_controllers_storage.xml @@ -0,0 +1,130 @@ + + + + + + + 1 + + + + + hvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec/unit/templates/domain_spec.rb b/spec/unit/templates/domain_spec.rb index 6214438..1c11e61 100644 --- a/spec/unit/templates/domain_spec.rb +++ b/spec/unit/templates/domain_spec.rb @@ -235,4 +235,68 @@ describe 'templates/domain' do end end end + + context 'scsi controller' do + context 'when disk device suggests scsi' do + let(:test_file) { 'domain_scsi_device_storage.xml' } + + before do + domain.disk_device = 'sda' + end + + it 'renders scsi controller in template' do + domain.finalize! + domain.domain_volumes.push({ + :cache => 'unsafe', + :bus => domain.disk_bus, + :absolute_path => '/var/lib/libvirt/images/test.qcow2' + }) + + resolve + expect(domain.to_xml('domain')).to eq xml_expected + end + end + + context 'when disk bus is scsi' do + let(:test_file) { 'domain_scsi_bus_storage.xml' } + + before do + domain.disk_bus = 'scsi' + end + + it 'renders scsi controller in template based on bus' do + domain.finalize! + domain.domain_volumes.push({ + :dev => 'vda', + :cache => 'unsafe', + :bus => domain.disk_bus, + :absolute_path => '/var/lib/libvirt/images/test.qcow2' + }) + resolve + expect(domain.to_xml('domain')).to eq xml_expected + end + end + + context 'when enough scsi disks are added' do + let(:test_file) { 'domain_scsi_multiple_controllers_storage.xml' } + + before do + domain.disk_bus = 'scsi' + domain.disk_controller_model = 'virtio-scsi' + end + + it 'should render with multiple scsi controllers' do + domain.finalize! + for idx in 1..15 do + domain.domain_volumes.push({ + :cache => 'unsafe', + :bus => domain.disk_bus, + :absolute_path => "/var/lib/libvirt/images/test-#{idx}.img" + }) + end + resolve + expect(domain.to_xml('domain')).to eq xml_expected + end + end + end end