Maor Lipchuk has uploaded a new change for review. Change subject: core: Sync VM disks with new guid when importing a VM. ......................................................................
core: Sync VM disks with new guid when importing a VM. Currently ImportVmCommand use three different kinds of containers when importing a VM: image id, disk id, and the new disk which is about to be added to the DB. The use of those containers has dependency with each other, and should be reflected in only one container so it will remain in sync. the following fix, put those parameters into one map, and use this map when copying a new disk into the Data Center. Change-Id: I5e25c75b95e08bbb5955b4d96a17baff59336e68 Bug-Url: https://bugzilla.redhat.com/970485 Signed-off-by: Maor Lipchuk <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java 1 file changed, 40 insertions(+), 19 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/17169/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index c3f8508..636dc3c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -99,8 +99,12 @@ private static VmStatic vmStaticForDefaultValues = new VmStatic(); private List<DiskImage> imageList; - private final List<Guid> diskGuidList = new ArrayList<Guid>(); - private final List<Guid> imageGuidList = new ArrayList<Guid>(); + + /** + * Map which contains the disk id (new generated id if the disk is cloned) and the disk parameters from the export + * domain. + */ + private final Map<Guid, DiskImage> newDiskIdForDisk = new HashMap<>(); private final List<String> macsAdded = new ArrayList<String>(); private final SnapshotsManager snapshotsManager = new SnapshotsManager(); @@ -720,11 +724,10 @@ @Override protected void moveOrCopyAllImageGroups(Guid containerID, Iterable<DiskImage> disks) { - int i = 0; for (DiskImage disk : disks) { VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction( VdcActionType.CopyImageGroup, - buildMoveOrCopyImageGroupParametersForDisk(disk, containerID, i++), + buildMoveOrCopyImageGroupParametersForDisk(disk, containerID), ExecutionHandler.createDefaultContexForTasks(getExecutionContext())); if (!vdcRetValue.getSucceeded()) { throw new VdcBLLException(vdcRetValue.getFault().getError(), @@ -735,11 +738,12 @@ } } - private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForDisk(DiskImage disk, Guid containerID, int i) { - Guid destinationDomain = imageToDestinationDomainMap.get(diskGuidList.get(i)); + private MoveOrCopyImageGroupParameters buildMoveOrCopyImageGroupParametersForDisk(DiskImage disk, Guid containerID) { + Guid originalDiskId = newDiskIdForDisk.get(disk.getId()).getId(); + Guid destinationDomain = imageToDestinationDomainMap.get(originalDiskId); MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(containerID, - diskGuidList.get(i), - imageGuidList.get(i), + originalDiskId, + newDiskIdForDisk.get(disk.getId()).getImageId(), disk.getId(), disk.getImageId(), destinationDomain, getMoveOrCopyImageOperation()); @@ -753,9 +757,9 @@ params.setEntityInfo(new EntityInfo(VdcObjectType.VM, getVm().getId())); params.setQuotaId(disk.getQuotaId() != null ? disk.getQuotaId() : getParameters().getQuotaId()); if (getParameters().getVm().getDiskMap() != null - && getParameters().getVm().getDiskMap().containsKey(diskGuidList.get(i))) { + && getParameters().getVm().getDiskMap().containsKey(originalDiskId)) { DiskImageBase diskImageBase = - (DiskImageBase) getParameters().getVm().getDiskMap().get(diskGuidList.get(i)); + (DiskImageBase) getParameters().getVm().getDiskMap().get(originalDiskId); params.setVolumeType(diskImageBase.getVolumeType()); params.setVolumeFormat(diskImageBase.getVolumeFormat()); } @@ -785,14 +789,10 @@ } setDiskStorageDomainInfo(disk); - diskGuidList.add(disk.getId()); - imageGuidList.add(disk.getImageId()); if (getParameters().isImportAsNewEntity()) { - disk.setId(Guid.newGuid()); - disk.setImageId(Guid.newGuid()); - for (int i = 0; i < diskList.size() - 1; i++) { - diskList.get(i).setId(disk.getId()); - } + generateNewDiskId(diskList, disk); + } else { + newDiskIdForDisk.put(disk.getId(), disk); } disk.setCreationDate(new Date()); saveImage(disk); @@ -818,8 +818,7 @@ int aliasCounter = 0; for (List<DiskImage> diskList : images.values()) { DiskImage disk = getActiveVolumeDisk(diskList); - diskGuidList.add(disk.getId()); - imageGuidList.add(disk.getImageId()); + newDiskIdForDisk.put(disk.getId(), disk); snapshotId = disk.getVmSnapshotId(); disk.setActive(true); ImagesHandler.setDiskAlias(disk, getVm(), ++aliasCounter); @@ -832,6 +831,28 @@ } } + /** + * Cloning a new disk with a new generated id, with the same volumes and parameters as <code>disk</code>. Also + * adding the disk to <code>newDiskGuidForDisk</code> map, so we will be able to link between the new cloned disk + * and the old disk id. + * + * @param diskList + * - All the disk volumes + * @param disk + * - The disk which is about to be cloned + */ + private void generateNewDiskId(List<DiskImage> diskList, DiskImage disk) { + Guid newGuidForDisk = Guid.newGuid(); + + // Copy the disk so it will preserve the old disk id and image id. + newDiskIdForDisk.put(newGuidForDisk, DiskImage.copyOf(disk)); + disk.setId(newGuidForDisk); + disk.setImageId(Guid.newGuid()); + for (int i = 0; i < diskList.size() - 1; i++) { + diskList.get(i).setId(disk.getId()); + } + } + private static DiskImage getActiveVolumeDisk(List<DiskImage> diskList) { return diskList.get(diskList.size() - 1); } -- To view, visit http://gerrit.ovirt.org/17169 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5e25c75b95e08bbb5955b4d96a17baff59336e68 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Maor Lipchuk <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
