Sergey Gotliv has uploaded a new change for review. Change subject: engine: Ties more consitently between vm disk device and disk entities. ......................................................................
engine: Ties more consitently between vm disk device and disk entities. VmDevice is the model entity on the Engine that ties between VM and the disk attached to this VM. Disk is not the only entity which tied to VM by VmDevice, but the only to be affected by this patch. VmDevice keeps a few very important characteristics of the underlying disk, for example address which ties the disk to specific slot of the controller. Without that information or if this information is not consistent disk may become useless after being introduced to the VM. During creating VM from a template with Disks A and B. Disk A => Disk A' Disk B => Disk B' So, if VMDevice A ties between Disk A and Template then VmDevice A' should tie between newly created VM and Disk A'. This patch make this process more consistent as till now, Engine was up to the order of disks in the Map or List as they were retrieved from UI or Database. Change-Id: I8bf284ea4e05f03fc0a7e94a1ec901aacbdc1ab1 Bug-Url: https://bugzilla.redhat.com/993776 Signed-off-by: Sergey Gotliv <sgot...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java 6 files changed, 56 insertions(+), 29 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/54/17854/1 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 b0c6ccb..47ad91a 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 @@ -69,7 +69,7 @@ diskImage.getId(), diskImage.getImageId(), parentCommandType); VdcReturnValueBase result = executeChildCopyingCommand(parameters); - handleCopyResult(newDiskImage, parameters, result); + handleCopyResult(diskImage, newDiskImage, parameters, result); } @Override @@ -160,23 +160,24 @@ /** * Handle the result of copying the image - * + * @param srcDiskImage + * disk image that represents the source image * @param copiedDiskImage - * disk image that represents the copied image at VDSM + * disk image that represents the copied image * @param parameters - * parameters for the child command that executes the copy at VDSM + * parameters for the child command that executes the copy * @param result * result of execution of child command */ - protected void handleCopyResult(DiskImage copiedDiskImage, - VdcActionParametersBase parameters, - VdcReturnValueBase result) { + private void handleCopyResult(DiskImage srcDiskImage, DiskImage copiedDiskImage, + VdcActionParametersBase parameters, VdcReturnValueBase result) { // If a copy cannot be made, abort if (!result.getSucceeded()) { throw new VdcBLLException(VdcBllErrors.VolumeCreationError); } else { ImagesHandler.addDiskImageWithNoVmDevice(copiedDiskImage); getTaskIdList().addAll(result.getInternalVdsmTaskIdList()); + srcDiskToTargetDiskMapping.put(srcDiskImage.getId(), copiedDiskImage.getId()); newDiskImages.add(copiedDiskImage); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index 6683dc7..1bebb0c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -87,6 +87,8 @@ */ protected List<DiskImage> newDiskImages = new ArrayList<DiskImage>(); + protected Map<Guid, Guid> srcDiskToTargetDiskMapping = new HashMap<>(); + public AddVmCommand(T parameters) { super(parameters); // if we came from EndAction the VmId is not null @@ -609,7 +611,7 @@ protected void copyVmDevices() { VmDeviceUtils.copyVmDevices(getVmTemplateId(), getVmId(), - newDiskImages, + srcDiskToTargetDiskMapping, _vmInterfaces, getParameters().isSoundDeviceEnabled(), getParameters().isConsoleEnabled()); @@ -735,7 +737,9 @@ throw new VdcBLLException(result.getFault().getError()); } else { getTaskIdList().addAll(result.getInternalVdsmTaskIdList()); - newDiskImages.add((DiskImage) result.getActionReturnValue()); + DiskImage newImage = (DiskImage) result.getActionReturnValue(); + srcDiskToTargetDiskMapping.put(dit.getId(), newImage.getId()); + newDiskImages.add(newImage); } } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java index b2c6ef8..4ae01e7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java @@ -245,7 +245,7 @@ getVm().getStaticData(), true, devices, - newDiskImages, + srcDiskToTargetDiskMapping, _vmInterfaces, getParameters().isSoundDeviceEnabled(), getParameters().isConsoleEnabled()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java index 70dc2ba..25e1059 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java @@ -88,7 +88,9 @@ throw new VdcBLLException(VdcBllErrors.VolumeCreationError); } else { getTaskIdList().addAll(result.getInternalVdsmTaskIdList()); - newDiskImages.add((DiskImage) result.getActionReturnValue()); + DiskImage newImage = (DiskImage) result.getActionReturnValue(); + srcDiskToTargetDiskMapping.put(disk.getId(), newImage.getId()); + newDiskImages.add(newImage); } } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java index 537116c..36c6a21 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java @@ -76,6 +76,12 @@ private final List<DiskImage> newDiskImages = new ArrayList<DiskImage>(); /** + * A mapping between source disk id and target disk id. + * This mapping is used when creating new devices for this template. + */ + private Map<Guid, Guid> srcDiskToTargetDiskMapping = new HashMap<>(); + + /** * Constructor for command creation when compensation is applied on startup * * @param commandId @@ -214,7 +220,12 @@ AddVmTemplateImages(); List<VmNetworkInterface> vmInterfaces = addVmInterfaces(); if (isVmInDb) { - VmDeviceUtils.copyVmDevices(getVmId(), getVmTemplateId(), newDiskImages, vmInterfaces, getParameters().isSoundDeviceEnabled(), getParameters().isConsoleEnabled()); + VmDeviceUtils.copyVmDevices(getVmId(), + getVmTemplateId(), + srcDiskToTargetDiskMapping, + vmInterfaces, + getParameters().isSoundDeviceEnabled(), + getParameters().isConsoleEnabled()); } else { // sending true for isVm in order to create basic devices needed VmDeviceUtils.copyVmDevices(getVmId(), @@ -223,7 +234,7 @@ getVmTemplate(), true, Collections.<VmDevice> emptyList(), - newDiskImages, + srcDiskToTargetDiskMapping, vmInterfaces, getParameters().isSoundDeviceEnabled(), getParameters().isConsoleEnabled()); @@ -461,6 +472,8 @@ } getReturnValue().getVdsmTaskIdList().addAll(retValue.getInternalVdsmTaskIdList()); + DiskImage newImage = (DiskImage) retValue.getActionReturnValue(); + srcDiskToTargetDiskMapping.put(diskImage.getId(), newImage.getId()); newDiskImages.add((DiskImage) retValue.getActionReturnValue()); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java index 16d7428..2524386 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java @@ -166,8 +166,8 @@ * * @param oldVm * @param newVmBase - * @param cluster compatibility version - * @param sound device enabled - if null, keep old state + * @param compatibilityVersion compatibility version + * @param isSoundDeviceEnabled device enabled - if null, keep old state */ public static void updateAudioDevice(VmBase oldVm, VmBase newVmBase, Version compatibilityVersion, Boolean isSoundDeviceEnabled) { boolean removeDevice = false; @@ -223,7 +223,16 @@ /** * Copy related data from the given VM/VmBase/VmDevice list to the destination VM/VmTemplate. */ - public static void copyVmDevices(Guid srcId, Guid dstId, VM vm, VmBase vmBase, boolean isVm, List<VmDevice> devicesDataToUse, List<DiskImage> disks, List<VmNetworkInterface> ifaces, boolean soundDeviceEnabled, boolean isConsoleEnabled) { + public static void copyVmDevices(Guid srcId, + Guid dstId, + VM vm, + VmBase vmBase, + boolean isVm, + List<VmDevice> devicesDataToUse, + Map<Guid, Guid> srcDiskToTargetDiskMapping, + List<VmNetworkInterface> ifaces, + boolean soundDeviceEnabled, + boolean isConsoleEnabled) { Guid id; int diskCount = 0; int ifaceCount = 0; @@ -254,9 +263,7 @@ switch(device.getType()) { case DISK: if (VmDeviceType.DISK.getName().equals(device.getDevice())) { - if (diskCount < disks.size()) { - id = (disks.get(diskCount++)).getId(); - } + id = srcDiskToTargetDiskMapping.get(device.getDeviceId()); } else if (VmDeviceType.CDROM.getName().equals(device.getDevice())) { // check here is source VM had CD (Vm from snapshot) String srcCdPath = (String) device.getSpecParams().get(VdsProperties.Path); @@ -373,23 +380,23 @@ null); } - /** - * Copies relevant entries on "Vm from Template" or "Template from VM" creation. - * - * @param srcId - * @param dstId - * @param disks - * The disks which were saved for the destination VM. - */ - public static void copyVmDevices(Guid srcId, Guid dstId, List<DiskImage> disks, List<VmNetworkInterface> ifaces, boolean soundDeviceEnabled, boolean isConsoleEnabled) { + public static void copyVmDevices(Guid srcId, + Guid dstId, + Map<Guid, Guid> srcDiskToTargetDiskMapping, + List<VmNetworkInterface> ifaces, + boolean soundDeviceEnabled, + boolean isConsoleEnabled) { VM vm = DbFacade.getInstance().getVmDao().get(dstId); VmBase vmBase = (vm != null) ? vm.getStaticData() : null; boolean isVm = (vmBase != null); + if (!isVm) { vmBase = DbFacade.getInstance().getVmTemplateDao().get(dstId); } + List<VmDevice> devices = dao.getVmDeviceByVmId(srcId); - copyVmDevices(srcId, dstId, vm, vmBase, isVm, devices, disks, ifaces, soundDeviceEnabled, isConsoleEnabled); + copyVmDevices(srcId, dstId, vm, vmBase, isVm, devices, srcDiskToTargetDiskMapping, + ifaces, soundDeviceEnabled, isConsoleEnabled); } private static void addVideoDevice(VmBase vm) { -- To view, visit http://gerrit.ovirt.org/17854 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8bf284ea4e05f03fc0a7e94a1ec901aacbdc1ab1 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sergey Gotliv <sgot...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches