Maor Lipchuk has uploaded a new change for review. Change subject: core: Introduce TryBackToAllCinderSnapshotsCommand ......................................................................
core: Introduce TryBackToAllCinderSnapshotsCommand Introduce new command for previewing all Cinder disks in a VM. Change-Id: I36d1c3278c4d251a15ee42b67d5c9fa8177c0e20 Bug-Url: https://bugzilla.redhat.com/1185826 Signed-off-by: Maor Lipchuk <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 3 files changed, 151 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/42061/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java index 6130319..0d9a3f2 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java @@ -5,12 +5,16 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; +import org.ovirt.engine.core.bll.storage.CINDERStorageHelper; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.validator.VmValidator; import org.ovirt.engine.core.bll.validator.storage.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.storage.DiskSnapshotsValidator; @@ -19,6 +23,7 @@ import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.CloneCinderDisksParameters; import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; import org.ovirt.engine.core.common.action.LockProperties; import org.ovirt.engine.core.common.action.LockProperties.Scope; @@ -29,7 +34,9 @@ import org.ovirt.engine.core.common.businessentities.Snapshot; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotStatus; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.errors.VdcBllMessages; @@ -114,7 +121,7 @@ setSucceeded(true); } - private void restoreVmConfigFromSnapshot() { + protected void restoreVmConfigFromSnapshot() { getSnapshotDao().updateStatus(getParameters().getDstSnapshotId(), SnapshotStatus.IN_PREVIEW); getSnapshotDao().updateStatus(getSnapshotDao().getId(getVm().getId(), SnapshotType.PREVIEW, @@ -130,6 +137,7 @@ @Override protected void executeVmCommand() { + boolean returnValue = true; final boolean restoreMemory = getParameters().isRestoreMemory() && FeatureSupported.memorySnapshot(getVm().getVdsGroupCompatibilityVersion()) && FeatureSupported.isMemorySnapshotSupportedByArchitecture( @@ -147,7 +155,7 @@ // Images list without those that are excluded from preview final List<DiskImage> filteredImages = (List<DiskImage>) CollectionUtils.subtract( images, getImagesExcludedFromPreview(images, previousActiveSnapshotId, newActiveSnapshotId)); - + final List<CinderDisk> cinderDisks = new ArrayList<>(); TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { @Override public Void runInTransaction() { @@ -184,6 +192,10 @@ @Override public Void runInTransaction() { for (DiskImage image : filteredImages) { + if (image.getDiskStorageType() == DiskStorageType.CINDER) { + cinderDisks.add((CinderDisk)image); + continue; + } VdcReturnValueBase vdcReturnValue = runInternalActionWithTasksContext(VdcActionType.TryBackToSnapshot, buildTryBackToSnapshotParameters(newActiveSnapshotId, image)); @@ -198,6 +210,10 @@ log.error("Cannot create snapshot"); throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL); } + } + if (!cinderDisks.isEmpty() && + !tryBackAllCinderDisks(cinderDisks, snapshotToBePreviewed.getId())) { + throw new VdcBLLException(VdcBllErrors.CINDER_ERROR); } return null; } @@ -214,15 +230,46 @@ } }); } - setSucceeded(true); + setSucceeded(returnValue); + } + + protected boolean tryBackAllCinderDisks( List<CinderDisk> cinderDisks, Guid snapshotToBePreviewedId) { + Future<VdcReturnValueBase> future = CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.TryBackToAllCinderSnapshots, + buildCinderChildCommandParameters(cinderDisks, snapshotToBePreviewedId), + cloneContextAndDetachFromParent(), + CINDERStorageHelper.getStorageEntities(cinderDisks)); + try { + VdcReturnValueBase vdcReturnValueBase = future.get(); + if (!vdcReturnValueBase.getSucceeded()) { + getReturnValue().setFault(vdcReturnValueBase.getFault()); + log.error("Error cloning Cinder disks for template"); + return false; + } + } catch (InterruptedException | ExecutionException e) { + log.error("Error cloning Cinder disks for template", e); + return false; + } + return true; + } + + private CloneCinderDisksParameters buildCinderChildCommandParameters(List<CinderDisk> cinderDisks, Guid vmSnapshotId) { + CloneCinderDisksParameters createParams = new CloneCinderDisksParameters(); + createParams.setCinderDisks(cinderDisks); + createParams.setVmSnapshotId(vmSnapshotId); + createParams.setParentHasTasks(!getReturnValue().getVdsmTaskIdList().isEmpty()); + return withRootCommandInfo(createParams, getActionType()); } private List<DiskImage> getImagesToPreview() { if (imagesToPreview == null) { imagesToPreview = getParameters().getDisks() != null ? getParameters().getDisks() : getDbFacade().getDiskImageDao().getAllSnapshotsForVmSnapshot(getDstSnapshot().getId()); + // Filter out shareable/nonsnapable disks + List<CinderDisk> CinderImagesToPreview = ImagesHandler.filterDisksBasedOnCinder(imagesToPreview); imagesToPreview = ImagesHandler.filterImageDisks(imagesToPreview, true, true, false); + imagesToPreview.addAll(CinderImagesToPreview); } return imagesToPreview; } @@ -234,7 +281,8 @@ List<DiskImage> excludedImages = new ArrayList<>(); for (DiskImage image : images) { - if (image.getVmSnapshotId().equals(previousActiveSnapshotId)) { + if ((image.getDiskStorageType() == DiskStorageType.IMAGE) + && image.getVmSnapshotId().equals(previousActiveSnapshotId)) { // Image is already active, hence only update snapshot ID. getImageDao().updateImageVmSnapshotId(image.getImageId(), newActiveSnapshotId); excludedImages.add(image); @@ -277,6 +325,7 @@ updateVmDisksFromDb(); List<DiskImage> diskImages = ImagesHandler.filterImageDisks(getVm().getDiskMap().values(), true, true, true); + diskImages.addAll(ImagesHandler.filterDisksBasedOnCinder(getVm().getDiskMap().values(), true)); if (!diskImages.isEmpty()) { if (!validate(new StoragePoolValidator(getStoragePool()).isUp())) { return false; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java new file mode 100644 index 0000000..1e58799 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/TryBackToAllCinderSnapshotsCommand.java @@ -0,0 +1,97 @@ +package org.ovirt.engine.core.bll.storage; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.ovirt.engine.core.bll.CommandBase; +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.action.CloneCinderDisksParameters; +import org.ovirt.engine.core.common.action.ImagesContainterParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.SnapshotDao; + +@InternalCommandAttribute +public class TryBackToAllCinderSnapshotsCommand<T extends CloneCinderDisksParameters> extends CommandBase<T> { + + private final SnapshotsManager snapshotsManager = new SnapshotsManager(); + + public TryBackToAllCinderSnapshotsCommand(T parameters) { + this(parameters, null); + } + + public TryBackToAllCinderSnapshotsCommand(T parameters, CommandContext commandContext) { + super(parameters, commandContext); + } + + @Override + protected void executeCommand() { + boolean isSucceeded = true; + for (CinderDisk disk : getParameters().getCinderDisks()) { + ImagesContainterParametersBase params = buildChildCommandParameters(disk); + Future<VdcReturnValueBase> future = CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.TryBackToCinderSnapshot, + params, + cloneContextAndDetachFromParent()); + try { + VdcReturnValueBase vdcReturnValueBase = future.get(); + if (!vdcReturnValueBase.getSucceeded()) { + log.error("Error cloning Cinder disk '{}': {}", disk.getDiskAlias()); + getReturnValue().setFault(vdcReturnValueBase.getFault()); + isSucceeded = false; + break; + } + } catch (InterruptedException | ExecutionException e) { + log.error("Error cloning Cinder disk '{}': {}", disk.getDiskAlias(), e.getMessage()); + isSucceeded = false; + } + + } + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(isSucceeded); + } + + private ImagesContainterParametersBase buildChildCommandParameters(CinderDisk cinderDisk) { + ImagesContainterParametersBase createParams = new ImagesContainterParametersBase(cinderDisk.getImageId()); + createParams.setContainerId(cinderDisk.getId()); + cinderDisk.setDiskAlias(cinderDisk.getDiskAlias()); + cinderDisk.setVmSnapshotId(getParameters().getVmSnapshotId()); + createParams.setStorageDomainId(cinderDisk.getStorageIds().get(0)); + createParams.setEntityInfo(getParameters().getEntityInfo()); + return withRootCommandInfo(createParams, getParameters().getParentCommand()); + } + + @Override + public CommandCallback getCallback() { + return new CloneCinderDisksCommandCallback(); + } + + @Override + protected void endSuccessfully() { + getVmStaticDAO().incrementDbGeneration(getVm().getId()); + if (!getParameters().isParentHasTasks()) { + getBackend().endAction(getParameters().getParentCommand(), + getParameters().getParentParameters(), + getContext().clone().withoutCompensationContext().withoutExecutionContext().withoutLock()); + } + setSucceeded(true); + } + + protected SnapshotDao getSnapshotDao() { + return DbFacade.getInstance().getSnapshotDao(); + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return Collections.emptyList(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 9334d19..c143803 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -456,6 +456,7 @@ RegisterCinderDisk(3206, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), CreateCinderSnapshot(3207, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), RemoveCinderSnapshotDisk(3208, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), + TryBackToAllCinderSnapshots(3209, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.STORAGE), // Host Devices RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, QuotaDependency.NONE), -- To view, visit https://gerrit.ovirt.org/42061 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I36d1c3278c4d251a15ee42b67d5c9fa8177c0e20 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
