From 797da354117b4d5bf3d83524d2275c5d01fdfe7e Mon Sep 17 00:00:00 2001 From: Daniel Erez Date: Mon, 8 Jul 2019 09:57:37 +0300 Subject: [PATCH] core: import template - update disks size by qemu-img info When importing a VM template, query the 'virtual size' of each image using 'qemu-img info' and update the DB, as the size is saved in the OVF in GiB (rounded up). Change-Id: Ia39ce808576af2ad912fb10a2432147f8482f37b Bug-Url: https://bugzilla.redhat.com/1711691 Signed-off-by: Daniel Erez --- .../exportimport/ImportVmTemplateCommand.java | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/exportimport/ImportVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/exportimport/ImportVmTemplateCommand.java index 9f0fbdccb02..52d5ae4fbd8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/exportimport/ImportVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/exportimport/ImportVmTemplateCommand.java @@ -136,6 +136,7 @@ public class ImportVmTemplateCommand exten private StorageDomain sourceDomain; private Guid sourceDomainId = Guid.Empty; private Guid sourceTemplateId; + private Map diskImageInfoMap = new HashMap<>(); public ImportVmTemplateCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); @@ -367,6 +368,8 @@ private void initImportClonedTemplate() { private void initImportClonedTemplateDisks() { for (DiskImage image : getImages()) { + // Update the virtual size with value queried from 'qemu-img info' + updateDiskSizeByQcowImageInfo(image); if (getParameters().isImportAsNewEntity()) { generateNewDiskId(image); updateManagedDeviceMap(image, getVmTemplate().getManagedDeviceMap()); @@ -771,19 +774,34 @@ protected void initQcowVersionForDisks(Guid imageGroupId) { protected void setQcowCompat(DiskImage diskImage) { diskImage.setQcowCompat(QcowCompat.QCOW2_V2); - QemuImageInfo qemuImageInfo = - imagesHandler.getQemuImageInfoFromVdsm(diskImage.getStoragePoolId(), - diskImage.getStorageIds().get(0), - diskImage.getId(), - diskImage.getImageId(), - null, - true); + QemuImageInfo qemuImageInfo = getQemuImageInfo(diskImage, diskImage.getStorageIds().get(0)); if (qemuImageInfo != null) { diskImage.setQcowCompat(qemuImageInfo.getQcowCompat()); } imageDao.update(diskImage.getImage()); } + protected void updateDiskSizeByQcowImageInfo(DiskImage diskImage) { + QemuImageInfo qemuImageInfo = getQemuImageInfo(diskImage, getParameters().getSourceDomainId()); + if (qemuImageInfo != null) { + diskImage.setSize(qemuImageInfo.getSize()); + } + imageDao.update(diskImage.getImage()); + } + + private QemuImageInfo getQemuImageInfo(DiskImage diskImage, Guid storageId) { + if (!diskImageInfoMap.containsKey(diskImage.getId())) { + diskImageInfoMap.put(diskImage.getId(), + imagesHandler.getQemuImageInfoFromVdsm(diskImage.getStoragePoolId(), + storageId, + diskImage.getId(), + diskImage.getImageId(), + null, + true)); + } + return diskImageInfoMap.get(diskImage.getId()); + } + /** * Updating managed device map of VM, with the new disk {@link Guid}s.
* The update of managedDeviceMap is based on the newDiskIdForDisk map,