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