
Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> Question: Do you know what is needed to have it working for iscsi and scsi pools? On 07/20/2014 12:08 PM, lvroyce0210@gmail.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Creating volume base on backing store so that we can create vm from this cow volume. Also change volume xml generation method to lxml.
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- src/kimchi/i18n.py | 1 + src/kimchi/model/vms.py | 1 + src/kimchi/vmtemplate.py | 31 +++++++++++++++++++------------ 3 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py index f872bee..1f70767 100644 --- a/src/kimchi/i18n.py +++ b/src/kimchi/i18n.py @@ -126,6 +126,7 @@ messages = { "KCHTMPL0021E": _("Unable to delete template due error: %(err)s"), "KCHTMPL0022E": _("Disk size must be greater than 1GB."), "KCHTMPL0023E": _("Template base image must be a valid local image file"), + "KCHTMPL0024E": _("Cannot identify base image %(path)s format"),
"KCHPOOL0001E": _("Storage pool %(name)s already exists"), "KCHPOOL0002E": _("Storage pool %(name)s does not exist"), diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py index 8c0dcb1..7d975b2 100644 --- a/src/kimchi/model/vms.py +++ b/src/kimchi/model/vms.py @@ -201,6 +201,7 @@ class VMsModel(object): # 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: vol_list = t.fork_vm_storage(vm_uuid) diff --git a/src/kimchi/vmtemplate.py b/src/kimchi/vmtemplate.py index 9e8ed3d..b17e3ff 100644 --- a/src/kimchi/vmtemplate.py +++ b/src/kimchi/vmtemplate.py @@ -265,19 +265,26 @@ drive=drive-%(bus)s0-1-0,id=%(bus)s0-1-0'/> 'type': 'disk', 'format': fmt, 'path': '%s/%s' % (storage_path, volume)} - info['allocation'] = 0 if fmt == 'qcow2' else info['capacity'] - info['xml'] = """ - <volume> - <name>%(name)s</name> - <allocation unit="G">%(allocation)s</allocation> - <capacity unit="G">%(capacity)s</capacity> - <target> - <format type='%(format)s'/> - <path>%(path)s</path> - </target> - </volume> - """ % info + + if 'base' in d: + info['base'] = dict() + base_fmt = probe_img_info(d['base'])['format'] + if base_fmt is None: + raise InvalidParameter("KCHTMPL0024E", {'path': d['base']}) + info['base']['path'] = d['base'] + info['base']['format'] = base_fmt + + v_tree = E.volume(E.name(info['name'])) + v_tree.append(E.allocation(str(info['allocation']), unit='G')) + v_tree.append(E.capacity(str(info['capacity']), unit='G')) + target = E.target( + E.format(type=info['format']), E.path(info['path'])) + if 'base' in d: + v_tree.append(E.backingStore( + E.path(info['base']['path']), E.format(type=info['base']['format']))) + v_tree.append(target) + info['xml'] = etree.tostring(v_tree) ret.append(info) return ret