From: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
support to create a VM from a scsi pool template.
From the libvirt document:
we can create a lun disk for vm by
two format:
<disk type='volume' device='disk'>
<driver name='qemu' type='raw'/>
<source pool='scsi-pool' volume='unit:0:0:0' />
<target dev='vda' bus='virtio'/>
</disk>
and
<disk type='block' device='lun'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/disk'/>
<target dev='sda' bus='scsi'/>
</disk>
The later, VM disk is "block" and the device "lun", except that
generic SCSI commands from the guest are accepted and passed through to
the physical device, and this will only be recognized for actual raw devices.
This is high performance than the former.
But later, disk device='lun' is only valid for block type disk source.
It does not support a volume from a pool formate like:
<source pool='scsi-pool' volume='unit:0:0:0' />
So I assign the disk source is block instead of volume from a pool
in both passthrough or non-passthrough.
1. how to test this patch:
create a scsi pool named "my-scsi" by virsh
2.get the volumes name of this pool:
$ sudo virsh vol-list my-scsi
Name Path
-----------------------------------------
unit:0:0:0 /dev/disk/by-id/wwn-0x60014056aefaef96d4e4033953d9627d
3. create a template with this pool like this:
$ curl -u <user> -H "Content-Type: application/json" \
-H "Accept: application/json" \
http://localhost:8000/templates/ -X POST -d '
{
"cpus": 1,
"cdrom":"/home/shhfeng/iso/f17.iso",
"name":"F17-SCSI",
"storagepool":"/storagepools/my-scsi",
"disks":[
{
"index":0,
"volume":"unit:0:0:0"
}
]
}'
4. create a VM with this template and start it.
Signed-off-by: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
---
src/kimchi/model/vms.py | 2 +-
src/kimchi/vmtemplate.py | 11 ++++++++---
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 483b9ae..ef1d617 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -184,7 +184,7 @@ class VMsModel(object):
# If storagepool is SCSI, volumes will be LUNs and must be passed by
# the user from UI or manually.
vol_list = []
- if t._get_storage_type() == "iscsi":
+ if t._get_storage_type() in ["iscsi", "scsi"]:
vol_list = []
elif t._get_storage_type() in READONLY_POOL_TYPE:
if not params.get('volumes'):
diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py
index 4ecba6e..e753ec2 100644
--- a/src/kimchi/vmtemplate.py
+++ b/src/kimchi/vmtemplate.py
@@ -181,7 +181,10 @@ class VMTemplate(object):
graphics_xml = graphics_xml + spicevmc_xml
return graphics_xml
- def _get_scsi_disks_xml(self, luns):
+ def _get_scsi_disks_xml(self):
+ luns = [disk['volume'] for disk in self.info.get('disks', {})
+ if 'volume' in disk]
+
ret = ""
# Passthrough configuration
disk_xml = """
@@ -193,8 +196,10 @@ class VMTemplate(object):
if not self.fc_host_support:
disk_xml = disk_xml.replace('volume','block')
+ pool = self._storage_validate()
# Creating disk xml for each lun passed
- for index,(lun, path) in enumerate(luns):
+ for index, lun in enumerate(luns):
+ path = pool.storageVolLookupByName(lun).path()
dev = "sd%s" % string.lowercase[index]
params = {'src': path, 'dev': dev}
ret = ret + disk_xml % params
@@ -309,7 +314,7 @@ class VMTemplate(object):
if storage_type == "iscsi":
params['disks'] = self._get_iscsi_disks_xml()
elif storage_type == "scsi":
- params['disks'] =
self._get_scsi_disks_xml(kwargs.get('volumes'))
+ params['disks'] = self._get_scsi_disks_xml()
else:
params['disks'] = self._get_disks_xml(vm_uuid)
--
1.8.5.3