[virt-tools-list] [virt-manager v3]Add virtio-scsi disk bus option
Cole Robinson
crobinso at redhat.com
Wed Dec 5 15:23:04 UTC 2012
On 12/03/2012 05:25 AM, Chen Hanxiao wrote:
> From: ChenHanxiao <chenhanxiao at cn.fujitsu.com>
>
> This patch will add virtio-scsi bus option on "Add New Virtual
> Hardware" GUI page. It will support users to add a virtual disk
> using SCSI bus with a controller model virtio-scsi.
> If there is no SCSI controller existed, a new SCSI controller by
> model 'virtio-scsi' will be added automatically.
>
> Signed-off-by: ChenHanxiao <chenhanxiao at cn.fujitsu.com>
>
> diff --git a/src/virtManager/addhardware.py b/src/virtManager/addhardware.py
> index 4d894eb..f0b8319 100644
> --- a/src/virtManager/addhardware.py
> +++ b/src/virtManager/addhardware.py
> @@ -34,6 +34,7 @@ import virtManager.uihelpers as uihelpers
> from virtManager.asyncjob import vmmAsyncJob
> from virtManager.storagebrowse import vmmStorageBrowser
> from virtManager.baseclass import vmmGObjectUI
> +from virtinst.VirtualController import VirtualControllerSCSI
>
> PAGE_ERROR = 0
> PAGE_DISK = 1
> @@ -539,6 +540,8 @@ class vmmAddHardware(vmmGObjectUI):
> if self.vm.get_hv_type() == "kvm":
> add_dev("sata", virtinst.VirtualDisk.DEVICE_DISK, "SATA disk")
> add_dev("virtio", virtinst.VirtualDisk.DEVICE_DISK, "Virtio disk")
> + add_dev("virtio-scsi", virtinst.VirtualDisk.DEVICE_DISK,
> + "Virtio SCSI disk")
> if self.conn.is_xen():
> add_dev("xen", virtinst.VirtualDisk.DEVICE_DISK, "Virtual disk")
>
> @@ -1151,10 +1154,16 @@ class vmmAddHardware(vmmGObjectUI):
>
> self._dev.get_xml_config()
> logging.debug("Adding device:\n" + self._dev.get_xml_config())
> + if self.has_controller():
> + if self._controller is not None:
> + logging.debug("Adding controller:\n"
> + + self._controller.get_xml_config())
>
> # Hotplug device
> attach_err = False
> try:
> + if self.has_controller() and self._controller is not None:
> + self.vm.attach_device(self._controller)
> self.vm.attach_device(self._dev)
> except Exception, e:
> logging.debug("Device could not be hotplugged: %s", str(e))
> @@ -1176,6 +1185,13 @@ class vmmAddHardware(vmmGObjectUI):
> return (False, None)
>
> # Alter persistent config
> + if self.has_controller() and self._controller is not None:
> + try:
> + self.vm.add_device(self._controller)
> + except Excpetion, e:
> + self.err.show_err(_("Error adding device: %s" % str(e)))
> + return (True, None)
> +
Similar to the hotplug case, move the has_controller() bit into the same
exception block as the add_device() call below.
> try:
> self.vm.add_device(self._dev)
> except Exception, e:
> @@ -1184,6 +1200,14 @@ class vmmAddHardware(vmmGObjectUI):
>
> return (False, None)
>
> + #check whether device has attribute '_controller'
> + def has_controller(self):
> + try:
> + self._controller
> + except AttributeError:
> + return False
> + else:
> + return True
>
This is overkill, just replace instances of has_controller() with
getattr(self, "_controller", None)
Though I have another recommendation below
> ###########################
> # Page validation methods #
> @@ -1222,6 +1246,10 @@ class vmmAddHardware(vmmGObjectUI):
> bus, device = self.get_config_disk_target()
> cache = self.get_config_disk_cache()
> fmt = self.get_config_disk_format()
> + model = None
> + if bus == "virtio-scsi":
> + bus = "scsi"
> + model = "virtio-scsi"
>
> # Make sure default pool is running
> if self.is_default_storage():
> @@ -1271,6 +1299,7 @@ class vmmAddHardware(vmmGObjectUI):
> device=device,
> bus=bus,
> driverCache=cache,
> + model=model,
> format=fmt)
>
> if not fmt:
> @@ -1316,6 +1345,15 @@ class vmmAddHardware(vmmGObjectUI):
> uihelpers.check_path_search_for_qemu(self.topwin,
> self.conn, disk.path)
>
> + if disk.model == "virtio-scsi":
> + controllers = self.vm.get_controller_devices()
> + controller = VirtualControllerSCSI(conn = self.conn.vmm)
> + controller.set_model(disk.model)
> + self._controller = controller
> + for d in controllers:
> + if disk.model == d.model:
> + self._controller = None
> +
> self._dev = disk
> return True
>
>
If we drop the virtinst patch, you can still make all this work. Just stick
the 'model' value in disk.vmm__model and the controller in
disk.vmm__controller. It's kinda hacky, but it's also one of the nice things
about python is that you can just monkey patch everything.
This will actually solve a real bug: if someone adds a virtio-scsi disk,
self._controller is set. Then if the user later tries to add an audio device,
self._controller is still set and we will attempt to add it again.
Thanks,
Cole
More information about the virt-tools-list
mailing list