Maor Lipchuk has uploaded a new change for review.

Change subject: core: Introduce restore from Cinder snapshot
......................................................................

core: Introduce restore from Cinder snapshot

Intoroduce restore for Cinder snapshot.

Change-Id: Ibd2c3ed4b2f2d0684476d9df9090d95dda72fd4e
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Maor Lipchuk <mlipc...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
2 files changed, 129 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/37/42337/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java
new file mode 100644
index 0000000..b277c5f
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RestoreFromCinderSnapshotCommand.java
@@ -0,0 +1,128 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.core.bll.BaseImagesCommand;
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.RestoreFromSnapshotParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.common.errors.VdcBLLException;
+import org.ovirt.engine.core.common.errors.VdcFault;
+import 
org.ovirt.engine.core.common.vdscommands.DestroyImageVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+
+/**
+ * This command responsible to make snapshot of some Vm mapped to some drive 
be active snapshot. All children snapshots
+ * and other snapshot mapped to same drive will be removed.
+ */
+@InternalCommandAttribute
+public class RestoreFromCinderSnapshotCommand<T extends 
RestoreFromSnapshotParameters> extends BaseImagesCommand<T> {
+
+    private final ArrayList<Guid> _imagesToDelete = new ArrayList<>();
+
+    public RestoreFromCinderSnapshotCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    @Override
+    protected void executeCommand() {
+        if (removeImages()) {
+            if (getParameters().getSnapshot().getType() != 
SnapshotType.REGULAR) {
+                getImage().setActive(true);
+                getImageDao().update(getImage().getImage());
+            }
+
+            setSucceeded(true);
+        }
+    }
+
+    private boolean removeImages() {
+        Guid imageToRemoveId = 
findImageForSameDrive(getParameters().getRemovedSnapshotId());
+
+        switch (getParameters().getSnapshot().getType()) {
+        case REGULAR:
+            removeOtherImageAndParents(imageToRemoveId, 
getDiskImage().getParentId());
+            break;
+        case PREVIEW:
+        case STATELESS:
+            if (imageToRemoveId != null) {
+                removeSnapshot(getDiskImageDao().get(imageToRemoveId));
+            }
+
+            break;
+        }
+
+        VDSReturnValue vdsReturnValue = performImageVdsmOperation();
+        return vdsReturnValue != null && vdsReturnValue.getSucceeded();
+    }
+
+    @Override
+    protected AsyncTaskType getTaskType() {
+        return AsyncTaskType.deleteVolume;
+    }
+
+    @Override
+    protected void removeSnapshot(DiskImage snapshot) {
+        super.removeSnapshot(snapshot);
+        _imagesToDelete.add(_imagesToDelete.size(), snapshot.getImageId());
+    }
+
+    private void removeOtherImageAndParents(Guid imageId, Guid lastParent) {
+        DiskImage image = getDiskImageDao().getSnapshotById(imageId);
+        // store other mapped image's parent Id
+        Guid currentParent = image.getParentId();
+        // Remove other mapped image from Irs and db
+        removeSnapshot(image);
+        while (!lastParent.equals(currentParent)) {
+            image = getDiskImageDao().getSnapshotById(currentParent);
+            // store current image's parent Id
+            currentParent = image.getParentId();
+            removeSnapshot(image);
+        }
+    }
+
+    @Override
+    protected VDSReturnValue performImageVdsmOperation() {
+        VDSReturnValue vdsReturnValue = null;
+        try {
+            Guid storagePoolId = getDiskImage().getStoragePoolId() != null ? 
getDiskImage().getStoragePoolId()
+                    : Guid.Empty;
+            Guid storageDomainId =
+                    getDiskImage().getStorageIds() != null && 
!getDiskImage().getStorageIds().isEmpty() ? getDiskImage().getStorageIds()
+                            .get(0)
+                            : Guid.Empty;
+            Guid imageGroupId = getDiskImage().getimage_group_id() != null ? 
getDiskImage().getimage_group_id()
+                    : Guid.Empty;
+
+            Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.RestoreAllSnapshots);
+
+            vdsReturnValue = runVdsCommand(VDSCommandType.DestroyImage,
+                    PostZeroHandler.fixParametersWithPostZero(
+                            new 
DestroyImageVDSCommandParameters(storagePoolId, storageDomainId, imageGroupId,
+                                    _imagesToDelete, 
getDiskImage().isWipeAfterDelete(), true)));
+
+            if (vdsReturnValue.getSucceeded()) {
+                getReturnValue().getInternalVdsmTaskIdList().add(
+                        createTask(taskId,
+                                vdsReturnValue.getCreationInfo(),
+                                VdcActionType.RestoreAllSnapshots,
+                                VdcObjectType.Storage,
+                                storageDomainId));
+            }
+        }
+        // Don't throw an exception when cannot destroy image in the VDSM.
+        catch (VdcBLLException e) {
+            // Set fault for parent command RestoreAllSnapshotCommand to use, 
if decided to fail the command.
+            getReturnValue().setFault(new VdcFault(e, 
e.getVdsError().getCode()));
+            log.info("Image '{}' not exist in Irs", 
getDiskImage().getImageId());
+        }
+        return vdsReturnValue;
+    }
+}
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 0f15d4f..46bd17f 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
@@ -464,6 +464,7 @@
     RemoveLibvirtSecret(3211, false, QuotaDependency.NONE),
     TryBackToCinderSnapshot(3212, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
     TryBackToAllCinderSnapshots(3213, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
+    RestoreFromCinderSnapshot(3214, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.STORAGE),
 
     // Host Devices
     RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, 
QuotaDependency.NONE),


-- 
To view, visit https://gerrit.ovirt.org/42337
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibd2c3ed4b2f2d0684476d9df9090d95dda72fd4e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Maor Lipchuk <mlipc...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to