[virt-tools-list] [PATCH] virtinst:Add sPAPR-vSCSI controller configuration correctly for pseries machine
Cole Robinson
crobinso at redhat.com
Thu Mar 29 14:13:34 UTC 2012
On 03/29/2012 03:44 AM, Li Zhang wrote:
> From: Qing Lin <qinglbj at linux.vnet.ibm.com>
>
> When installing OS from cdrom, we cannot change its address type
> to spapr-vio (Power support bus type) through GUI. So, it needs
> to change default cdrom disk type into vSCSI on pSeries machine.
> All the vSCSI disks share one sPAPR-vSCSI controller. So,
> when the first vSCSI disk is added, sPAPR-vSCSI controller
> should be added, if sPAPR-vSCSI controller is already existed,
> it's not necessary to add it.
>
> Signed-off-by: Qing Lin <qinglbj at linux.vnet.ibm.com>
> Signed-off-by: Li Zhang <zhlcindy at linux.vnet.ibm.com>
> ---
> tests/xmlconfig-xml/boot-many-devices.xml | 12 ++++++++--
> tests/xmlconfig.py | 4 +++
> virtinst/Guest.py | 28 ++++++++++++++++----------
> 3 files changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/tests/xmlconfig-xml/boot-many-devices.xml b/tests/xmlconfig-xml/boot-many-devices.xml
> index 043e291..58107be 100644
> --- a/tests/xmlconfig-xml/boot-many-devices.xml
> +++ b/tests/xmlconfig-xml/boot-many-devices.xml
> @@ -39,9 +39,12 @@
> <source file='/default-pool/testvol1.img'/>
> <target dev='sdb' bus='scsi'/>
> </disk>
> - <controller type='scsi' index='0'>
> - <address type='spapr-vio'/>
> - </controller>
> + <disk type='file' device='cdrom'>
> + <driver name='qemu' type='qcow2'/>
> + <source file='/default-pool/testvol2.img'/>
> + <target dev='sdc' bus='scsi'/>
> + <readonly/>
> + </disk>
> <controller type='ide' index='3'/>
> <controller type='virtio-serial' index='0' ports='32' vectors='17'/>
> <interface type='network'>
> @@ -93,6 +96,9 @@
> </source>
> </hostdev>
> <watchdog model='ib700' action='none'/>
> + <controller type='scsi' index='0'>
> + <address type='spapr-vio'/>
> + </controller>
> </devices>
> <seclabel type='static' model='selinux'>
> <label>foolabel</label>
> diff --git a/tests/xmlconfig.py b/tests/xmlconfig.py
> index 1dd447d..f237fb2 100644
> --- a/tests/xmlconfig.py
> +++ b/tests/xmlconfig.py
> @@ -716,6 +716,10 @@ class TestXMLConfig(unittest.TestCase):
> bus="scsi", driverName="qemu")
> d3.address.type = "spapr-vio"
> g.disks.append(d3)
> + d4 = VirtualDisk(conn=g.conn, path="/default-pool/testvol2.img", device="cdrom",
> + bus="scsi", driverName="qemu")
> + d4.address.type = "spapr-vio"
> + g.disks.append(d4)
>
> # Controller devices
> c1 = VirtualController.get_class_for_type(VirtualController.CONTROLLER_TYPE_IDE)(g.conn)
> diff --git a/virtinst/Guest.py b/virtinst/Guest.py
> index cd529aa..3d69b96 100644
> --- a/virtinst/Guest.py
> +++ b/virtinst/Guest.py
> @@ -870,21 +870,23 @@ class Guest(XMLBuilderDomain.XMLBuilderDomain):
> finally:
> if origpath:
> dev.path = origpath
> - def get_vscsi_ctrl_xml():
> - vscsi_class = virtinst.VirtualController.get_class_for_type(
> - virtinst.VirtualController.CONTROLLER_TYPE_SCSI)
> - ctrl = vscsi_class(self.conn)
> - ctrl.set_address("spapr-vio")
> - return ctrl.get_xml_config()
> -
> xml = self._get_emulator_xml()
> # Build XML
> + vscsi_need_add = False
> + vscsi_is_exist = False
> for dev in devs:
> xml = _util.xml_append(xml, get_dev_xml(dev))
> - if (dev.address.type == "spapr-vio" and
> - dev.virtual_device_type == virtinst.VirtualDevice.VIRTUAL_DEV_DISK):
> - xml = _util.xml_append(xml, get_vscsi_ctrl_xml())
> -
> + if (dev.virtual_device_type == virtinst.VirtualDevice.VIRTUAL_DEV_DISK and
> + dev.address.type == "spapr-vio"):
> + vscsi_need_add = True
> + if (dev.get_virtual_device_type() == VirtualDevice.VIRTUAL_DEV_CONTROLLER and
> + dev.address.type == "spapr-vio"):
> + vscsi_is_exist = True
> + if (vscsi_need_add and not vscsi_is_exist):
> + ctrl = virtinst.VirtualController.get_class_for_type(virtinst.VirtualController.CONTROLLER_TYPE_SCSI)(self.conn)
> + ctrl.set_address("spapr-vio")
> + self.add_device(ctrl)
> + xml = _util.xml_append(xml, ctrl.get_xml_config())
> return xml
>
Hmm, this is getting a little out of hand. We wouldn't need any of this if
libvirt was adding an implicit controller for us. Which I think is the correct
way forward here, since libvirt does it for just about everything else.
In fact I should have just rejected the original patch that changed this function.
Ideally what we would do here is just specify a cdrom device like
<disk type='file' device='cdrom'>
<source file='foobar'/>
</disk>
and libvirt could generate a device target, and fill in the default bus value.
Then users/apps wouldn't need to know the supported buses for each
hv+arch+machine combination. But that's for another day. Until then, the rest
of the patch is fine.
- Cole
> def _get_emulator_xml(self):
> @@ -1503,6 +1505,10 @@ class Guest(XMLBuilderDomain.XMLBuilderDomain):
> else:
> if self.installer.is_hvm():
> disk.bus = "ide"
> + if (self.installer.type == "kvm" and
> + self.installer.machine == "pseries"):
> + disk.bus = "scsi"
> + disk.set_address("spapr-vio")
> elif self.installer.is_xenpv():
> disk.bus = "xen"
> used_targets.append(disk.generate_target(used_targets))
More information about the virt-tools-list
mailing list