Tomas Jelinek has uploaded a new change for review. Change subject: core: thin vm becomes clone ......................................................................
core: thin vm becomes clone Change-Id: Icd9782930cc3e3b76fd1cfd32cf78007171cad9e Signed-off-by: Tomas Jelinek <tjeli...@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/CloneVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java 4 files changed, 148 insertions(+), 31 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/32463/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 ae9e442..da3c078 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 @@ -335,8 +335,12 @@ protected void executeVmCommand() { super.executeVmCommand(); setVm(null); - getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID); + resetVmtGuid(); getVmStaticDao().update(getVm().getStaticData()); + } + + protected void resetVmtGuid() { + getVm().setVmtGuid(VmTemplateHandler.BLANK_VM_TEMPLATE_ID); } @Override @@ -394,11 +398,15 @@ @Override protected boolean addVmImages() { + return doCopyImages(getDiskImagesFromConfiguration(), diskInfoDestinationMap); + } + + protected boolean doCopyImages(Collection<DiskImage> diskInfos, Map<Guid, DiskImage> diskInfoDestinationMap) { int numberOfStartedCopyTasks = 0; try { - if (!getDiskImagesFromConfiguration().isEmpty()) { + if (!diskInfos.isEmpty()) { lockEntities(); - for (DiskImage diskImage : getDiskImagesFromConfiguration()) { + for (DiskImage diskImage : diskInfos) { // For illegal image check if it was snapshot as illegal (therefore // still exists at DB, or was it erased after snapshot - therefore the // query returned to UI an illegal image) 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 a5e491f..09a68b3 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 @@ -198,7 +198,7 @@ return locks; } - private String getTemplateSharedLockMessage() { + protected String getTemplateSharedLockMessage() { return new StringBuilder(VdcBllMessages.ACTION_TYPE_FAILED_TEMPLATE_IS_USED_FOR_CREATE_VM.name()) .append(String.format("$VmName %1$s", getVmName())) .toString(); @@ -716,7 +716,7 @@ return true; } - private DiskImage makeNewImage(Guid storageId, DiskImage image) { + protected DiskImage makeNewImage(Guid storageId, DiskImage image) { DiskImage newImage = new DiskImage(); newImage.setImageId(image.getImageId()); newImage.setDiskAlias(image.getDiskAlias()); @@ -864,7 +864,7 @@ * If both the instance type and the template is set, than all the devices has to be copied from instance type except the * disk devices which has to be copied from the template (since the instance type has no disks but the template does have). */ - private void copyDiskDevicesFromTemplate() { + protected void copyDiskDevicesFromTemplate() { List<VmDevice> disks = DbFacade.getInstance() .getVmDeviceDao() @@ -981,24 +981,28 @@ } protected boolean addVmImages() { + return doAddImagesFromTemplate(getImagesToCheckDestinationStorageDomains(), diskInfoDestinationMap); + } + + protected boolean doAddImagesFromTemplate(Collection<DiskImage> diskImages, Map<Guid, DiskImage> diskToDestination) { if (vmDisksSource.getDiskTemplateMap().size() > 0) { if (getVm().getStatus() != VMStatus.Down) { log.error("Cannot add images. VM is not Down"); throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL); } VmHandler.lockVm(getVmId()); - for (DiskImage dit : getImagesToCheckDestinationStorageDomains()) { + for (DiskImage dit : diskImages) { CreateSnapshotFromTemplateParameters tempVar = new CreateSnapshotFromTemplateParameters( dit.getImageId(), getParameters().getVmStaticData().getId()); - tempVar.setDestStorageDomainId(diskInfoDestinationMap.get(dit.getId()).getStorageIds().get(0)); - tempVar.setDiskAlias(diskInfoDestinationMap.get(dit.getId()).getDiskAlias()); + tempVar.setDestStorageDomainId(diskToDestination.get(dit.getId()).getStorageIds().get(0)); + tempVar.setDiskAlias(diskToDestination.get(dit.getId()).getDiskAlias()); tempVar.setStorageDomainId(dit.getStorageIds().get(0)); tempVar.setVmSnapshotId(getVmSnapshotId()); - tempVar.setParentCommand(VdcActionType.AddVm); + tempVar.setParentCommand(getParentActionType()); tempVar.setEntityInfo(getParameters().getEntityInfo()); tempVar.setParentParameters(getParameters()); - tempVar.setQuotaId(diskInfoDestinationMap.get(dit.getId()).getQuotaId()); - tempVar.setDiskProfileId(diskInfoDestinationMap.get(dit.getId()).getDiskProfileId()); + tempVar.setQuotaId(diskToDestination.get(dit.getId()).getQuotaId()); + tempVar.setDiskProfileId(diskToDestination.get(dit.getId()).getDiskProfileId()); VdcReturnValueBase result = runInternalActionWithTasksContext(VdcActionType.CreateSnapshotFromTemplate, tempVar); /** @@ -1016,6 +1020,10 @@ return true; } + protected VdcActionType getParentActionType() { + return VdcActionType.AddVm; + } + @Override public AuditLogType getAuditLogTypeValue() { switch (getActionState()) { 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 e269b3a..1b5a04e 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 @@ -49,12 +49,34 @@ oldVmId = getParameters().getVmId(); setVmName(getParameters().getVm().getName()); + setVmTemplateId(getParameters().getVm().getVmtGuid()); // init the parameters only at first instantiation (not subsequent for end action) if (Guid.isNullOrEmpty(parameters.getNewVmGuid())) { setupParameters(); } + } + + @Override + protected boolean addVmImages() { + VmTemplateHandler.updateDisksFromDb(getVmTemplate()); + + if (!isTemplateDependent()) { + return super.addVmImages(); + } else { + return doAddImagesFromTemplate(getVmTemplate().getDiskImageMap().values(), diskInfoDestinationMap) && + doCopyImages(getDiskImagesFromConfiguration(), diskInfoDestinationMap); + } + } + + @Override + protected void copyVmDevices() { + super.copyVmDevices(); + + if (isTemplateDependent()) { + copyDiskDevicesFromTemplate(); + } } @Override @@ -77,6 +99,11 @@ protected Map<String, Pair<String, String>> getSharedLocks() { Map<String, Pair<String, String>> locks = new HashMap<>(); + if (isTemplateDependent()) { + locks.put(getVmTemplateId().toString(), + LockMessagesMatchUtil.makeLockingPair(LockingGroup.TEMPLATE, getTemplateSharedLockMessage())); + } + for (DiskImage image: getImagesToCheckDestinationStorageDomains()) { locks.put(image.getId().toString(), LockMessagesMatchUtil.makeLockingPair(LockingGroup.DISK, getDiskSharedLockMessage())); @@ -88,21 +115,55 @@ return locks; } + /** + * This is called only by the AddVmAndCloneImageCommand to find the disk images to be cloned (not by AddVmCommand to find the images to be snapshotted) + * + * It returns all the disk images which are not based on the tamplate + */ protected Collection<DiskImage> getDiskImagesFromConfiguration() { + if (diskImagesFromConfiguration != null) { + return diskImagesFromConfiguration; + } + + Collection<DiskImage> vmImages = getAllVmDisks(); + + Collection<DiskImage> templateImages = getVmTemplate().getDiskTemplateMap().values(); + + diskImagesFromConfiguration = new ArrayList<>(); + for (DiskImage vmImage : vmImages){ + if (!dependentOnTemplate(templateImages, vmImage)) { + diskImagesFromConfiguration.add(vmImage); + } + + } + + return diskImagesFromConfiguration; + } + + private Collection<DiskImage> getAllVmDisks() { VdcQueryReturnValue vdcReturnValue = runInternalQuery( VdcQueryType.GetAllDisksByVmId, new IdQueryParameters(oldVmId)); - List<Disk> loadedImages = vdcReturnValue.getReturnValue() != null ? (List<Disk>) vdcReturnValue.getReturnValue() : new ArrayList<Disk>(); + Collection<Disk> vmDisks = vdcReturnValue.getReturnValue() != null ? (List<Disk>) vdcReturnValue.getReturnValue() : new ArrayList<Disk>(); + return ImagesHandler.filterImageDisks(vmDisks, + false, + true, + true); + } - if (diskImagesFromConfiguration == null) { - diskImagesFromConfiguration = - ImagesHandler.filterImageDisks(loadedImages, - false, - true, - true); + private boolean dependentOnTemplate(Collection<DiskImage> templateImages, DiskImage vmImage) { + return findTemplateImage(templateImages, vmImage) != null; + } + + private DiskImage findTemplateImage(Collection<DiskImage> templateImages, DiskImage vmImage) { + for (DiskImage templateImage : templateImages) { + if (vmImage.getImageTemplateId().equals(templateImage.getImageId())) { + return templateImage; + } } - return diskImagesFromConfiguration; + + return null; } @Override @@ -135,24 +196,37 @@ @Override public VM getVm() { if (vm == null) { - vm = getVmDAO().get(oldVmId); - VmDeviceUtils.setVmDevices(vm.getStaticData()); - VmHandler.updateDisksFromDb(vm); - VmHandler.updateVmGuestAgentVersion(vm); - VmHandler.updateNetworkInterfacesFromDb(vm); - VmHandler.updateVmInitFromDB(vm.getStaticData(), true); + if (Guid.isNullOrEmpty(getParameters().getNewVmGuid())) { + vm = getVmDAO().get(oldVmId); + VmDeviceUtils.setVmDevices(vm.getStaticData()); + VmHandler.updateDisksFromDb(vm); + VmHandler.updateVmGuestAgentVersion(vm); + VmHandler.updateNetworkInterfacesFromDb(vm); + VmHandler.updateVmInitFromDB(vm.getStaticData(), true); - vm.setName(getParameters().getNewName()); - vm.setId(getVmId()); + vm.setName(getParameters().getNewName()); + vm.setId(getVmId()); + } else { + // this is the end-action stage. At this point the VM is actually saved and the getVm() is supposed to return it + vm = getVmDAO().get(getParameters().getNewVmGuid()); + } + } return vm; } private void fillDisksToParameters() { + Collection<DiskImage> templateImages = getVmTemplate().getDiskTemplateMap().values(); - for (Disk image : getDiskImagesFromConfiguration()) { - diskInfoDestinationMap.put(image.getId(), (DiskImage) image); + // fills all - both taken from template and directly added to VM + for (DiskImage image : getAllVmDisks()) { + DiskImage templateImage = findTemplateImage(templateImages, image); + if (templateImage != null) { + diskInfoDestinationMap.put(templateImage.getId(), templateImage); + } else { + diskInfoDestinationMap.put(image.getId(), image); + } } getParameters().setDiskInfoDestinationMap(diskInfoDestinationMap); @@ -165,7 +239,6 @@ } private void attachDisks() { - VdcQueryReturnValue vdcReturnValue = runInternalQuery( VdcQueryType.GetAllDisksByVmId, new IdQueryParameters(oldVmId)); @@ -254,4 +327,31 @@ vmStatic.setOriginalTemplateGuid(getVm().getOriginalTemplateGuid()); vmStatic.setOriginalTemplateName(getVm().getOriginalTemplateName()); } + + @Override + protected void resetVmtGuid() { + // no need to reset it - the value taken from the VM in DB is already correct + } + + @Override + protected Collection<DiskImage> getImagesToCheckDestinationStorageDomains() { + Collection<DiskImage> allDisks = new ArrayList<>(); + + // add the VM disks + allDisks.addAll(getDiskImagesFromConfiguration()); + + // add template disks + allDisks.addAll(getVmTemplate().getDiskTemplateMap().values()); + + return allDisks; + } + + @Override + protected VdcActionType getParentActionType() { + return VdcActionType.CloneVm; + } + + private boolean isTemplateDependent() { + return !Guid.Empty.equals(getSourceVmFromDb().getVmtGuid()); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java index f0fcec5..dcd87d5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java @@ -303,6 +303,7 @@ @Override protected void endSuccessfully() { + endVmCommand(); } -- To view, visit http://gerrit.ovirt.org/32463 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icd9782930cc3e3b76fd1cfd32cf78007171cad9e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Tomas Jelinek <tjeli...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches