From 9957082031a1352cc7437298d429a825c43fb4c2 Mon Sep 17 00:00:00 2001 From: Benny Zlotnik Date: Sun, 10 Nov 2019 09:46:36 +0200 Subject: [PATCH] core: correctly set parent and template ID Currently image tempalte was either missing or reset during the cloning of the VM. This patch fixes it by correctly setting template and parent IDs to ensure thin VMs are kept that way when cloned Change-Id: I4bc2437164d58a108e7cfdfd132b439ceb15b954 Signed-off-by: Benny Zlotnik --- .../ovirt/engine/core/bll/AddVmAndCloneImageCommand.java | 5 ++++- .../main/java/org/ovirt/engine/core/bll/CloneVmCommand.java | 1 + .../org/ovirt/engine/core/bll/CloneVmNoCollapseCommand.java | 3 +++ .../disk/image/CloneImageGroupVolumesStructureCommand.java | 6 +++--- .../engine/core/bll/storage/disk/image/ImagesHandler.java | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java index 7652a2b0609..441b91c871e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java @@ -322,7 +322,10 @@ protected DiskImage getDiskImageToRemoveByParam(MoveOrCopyImageGroupParameters p protected void executeVmCommand() { super.executeVmCommand(); setVm(null); - getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID); + if (getActionType() != ActionType.CloneVmNoCollapse) { + getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID); + } + vmStaticDao.update(getVm().getStaticData()); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java index 9dcc31db13f..dc39cc4e3f8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java @@ -303,6 +303,7 @@ protected boolean validate() { protected void updateOriginalTemplate(VmStatic vmStatic) { vmStatic.setOriginalTemplateGuid(getVm().getOriginalTemplateGuid()); vmStatic.setOriginalTemplateName(getVm().getOriginalTemplateName()); + vmStatic.setVmtGuid(getVm().getVmtGuid()); } private VmManagementParametersBase createUpdateVmParameters() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmNoCollapseCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmNoCollapseCommand.java index dbc24b4f7c4..bcaaba8f324 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmNoCollapseCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmNoCollapseCommand.java @@ -160,6 +160,9 @@ private VM initClonedVm(VM oldVm) { oldVm.setId(getVmId()); oldVm.setDiskMap(getVm().getDiskMap()); oldVm.setName(getVm().getName()); + oldVm.setOriginalTemplateGuid(getVm().getOriginalTemplateGuid()); + oldVm.setOriginalTemplateName(getVm().getOriginalTemplateName()); + oldVm.setVmtGuid(getVm().getVmtGuid()); oldVm.getInterfaces().forEach(iface -> { iface.setId(Guid.newGuid()); iface.setVmId(getVmId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/CloneImageGroupVolumesStructureCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/CloneImageGroupVolumesStructureCommand.java index 6f43cf539f1..86634a472f7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/CloneImageGroupVolumesStructureCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/CloneImageGroupVolumesStructureCommand.java @@ -121,13 +121,13 @@ public boolean performNextOperation(int completedChildren) { private Guid determineSourceImageGroup(DiskImage image) { if (Guid.Empty.equals(image.getParentId())) { return Guid.Empty; + } else if (image.getImageTemplateId().equals(image.getParentId())) { + return imageDao.get(image.getImageTemplateId()).getDiskId(); } else if (!getParameters().getDestImages().isEmpty()) { return getParameters().getDestImageGroupId(); } - return image.getImageTemplateId().equals(image.getParentId()) ? - imageDao.get(image.getImageTemplateId()).getDiskId() - : getParameters().getImageGroupID(); + return getParameters().getImageGroupID(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/ImagesHandler.java index 7fc7a5d27f4..2cee1f595be 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/disk/image/ImagesHandler.java @@ -1073,7 +1073,7 @@ public Map mapChainToNewIDs(Guid sourceImageGroupID, DbUser user) { List oldChain = diskImageDao.getAllSnapshotsForImageGroup(sourceImageGroupID); Map oldToNewChain = new HashMap<>(oldChain.size()); - Guid nextParentId = Guid.Empty; + Guid nextParentId = oldChain.get(0).getImageTemplateId() != Guid.Empty ? oldChain.get(0).getParentId() : Guid.Empty; sortImageList(oldChain); for (DiskImage diskImage : oldChain) {