[Kimchi-devel] [PATCH] Update iSCSI volume XML when creating a VM from an iSCSI pool

Aline Manera alinefm at linux.vnet.ibm.com
Thu Aug 28 02:44:54 UTC 2014


When creating a VM using a iSCSI volume, the volume XML was like below:

<disk type='volume' device='disk'>
  <driver name='qemu' type='raw'/>
  <source pool='TEST-ISCSI1' volume='unit:0:0:2' mode='host'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

But to attach a new iSCSI volume, the XML is:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw'/>
  <source dev='/dev/disk/by-id/wwn-0x60000000000000000e00000000010001'/>
  <target dev='vdb' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>

We should keep the same XML structure in both cases to avoid problems
while listing the storage volumes and getting their information.
To solve that, this patch uses the latter XML also while creating a VM
from a iSCSI volume.

It eliminates the needs to have the authentication setting in the
volume, because that the _get_storage_auth() function was replaced by
_get_volume_path()

Signed-off-by: Aline Manera <alinefm at linux.vnet.ibm.com>
---
 src/kimchi/mockmodel.py       |  3 +++
 src/kimchi/model/templates.py | 15 ++++++---------
 src/kimchi/model/vms.py       |  6 +-----
 src/kimchi/vmtemplate.py      | 16 +++++-----------
 4 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index fc474de..1bd54cc 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -997,6 +997,9 @@ class MockVMTemplate(VMTemplate):
         pool = self._storage_validate()
         return pool.info['path']
 
+    def _get_volume_path(self, pool, vol):
+        return self.model.storagevolume_lookup(pool, vol)['path']
+
     def fork_vm_storage(self, vm_name):
         pool = self._storage_validate()
         volumes = self.to_volume_list(vm_name)
diff --git a/src/kimchi/model/templates.py b/src/kimchi/model/templates.py
index bf04304..9278cdc 100644
--- a/src/kimchi/model/templates.py
+++ b/src/kimchi/model/templates.py
@@ -29,7 +29,6 @@ from kimchi.kvmusertests import UserTests
 from kimchi.utils import pool_name_from_uri
 from kimchi.utils import probe_file_permission_as_user
 from kimchi.vmtemplate import VMTemplate
-from lxml import objectify
 
 
 class TemplatesModel(object):
@@ -243,15 +242,13 @@ class LibvirtVMTemplate(VMTemplate):
         xml = pool.XMLDesc(0)
         return xmlutils.xpath_get_text(xml, "/pool/@type")[0]
 
-    def _get_storage_auth(self):
+    def _get_volume_path(self, pool, vol):
         pool = self._storage_validate()
-        xml = pool.XMLDesc(0)
-        root = objectify.fromstring(xml)
-        auth = root.source.find("auth")
-        if auth is None:
-            return auth
-        au = auth.attrib
-        return au.update(auth.secret.attrib)
+        try:
+            return pool.storageVolLookupByName(vol).path()
+        except:
+            raise NotFoundError("KCHVOL0002E", {'name': vol,
+                                                'pool': pool})
 
     def fork_vm_storage(self, vm_uuid):
         # Provision storage:
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 5721b48..4787840 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -203,11 +203,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() in ["iscsi", "scsi"]:
-            # FIXME: iscsi and scsi storage work with base image needs to be
-            # fixed.
-            vol_list = []
-        else:
+        if t._get_storage_type() not in ["iscsi", "scsi"]:
             vol_list = t.fork_vm_storage(vm_uuid)
 
         graphics = params.get('graphics')
diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py
index ddb1f35..c5bb7b3 100644
--- a/src/kimchi/vmtemplate.py
+++ b/src/kimchi/vmtemplate.py
@@ -251,25 +251,19 @@ drive=drive-%(bus)s0-1-0,id=%(bus)s0-1-0'/>
 
     def _get_iscsi_disks_xml(self):
         def build_disk_xml(children=[]):
-            disk = E.disk(type='volume', device='disk')
+            disk = E.disk(type='block', device='disk')
             disk.extend(children)
             return etree.tostring(disk)
 
         ret = ""
         children = []
-        auth = self._get_storage_auth()
-        if auth:
-            etree_auth = E.auth(username=auth['username'])
-            etree_auth.append(E.secret(type=auth['type'],
-                              usage=auth['libvirtiscsi']))
-            children.append(etree_auth)
         children.append(E.driver(name='qemu', type='raw'))
         disk_bus = self.info['disk_bus']
         dev_prefix = self._bus_to_dev[disk_bus]
         pool_name = pool_name_from_uri(self.info['storagepool'])
         for i, d in enumerate(self.info['disks']):
-            source = E.source(pool=pool_name,
-                              volume=d.get('volume'), mode='host')
+            source = E.source(dev=self._get_volume_path(pool_name,
+                                                        d.get('volume')))
             # FIXME if more than 26 disks
             target = E.target(dev=dev_prefix + string.lowercase[i],
                               bus=disk_bus)
@@ -455,8 +449,8 @@ drive=drive-%(bus)s0-1-0,id=%(bus)s0-1-0'/>
     def _get_storage_type(self):
         return ''
 
-    def _get_storage_auth(self):
-        return None
+    def _get_volume_path(self):
+        return ''
 
     def _get_all_networks_name(self):
         return []
-- 
1.9.3




More information about the Kimchi-devel mailing list