Maor Lipchuk has uploaded a new change for review.

Change subject: core: Introduce create Cinder snapshot command
......................................................................

core: Introduce create Cinder snapshot command

Introducing create snapshot for Cinder disk

Change-Id: I828f61ed4892b52288256a9a1e14b2efb56140c7
Bug-Url: https://bugzilla.redhat.com/??????
Signed-off-by: Maor Lipchuk <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
2 files changed, 118 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/40977/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java
new file mode 100644
index 0000000..e64ccb0
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CreateCinderSnapshotCommand.java
@@ -0,0 +1,117 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.Date;
+
+import org.ovirt.engine.core.bll.BaseImagesCommand;
+import org.ovirt.engine.core.bll.ImagesHandler;
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
+import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
+import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
+import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+@InternalCommandAttribute
+public class CreateCinderSnapshotCommand<T extends 
ImagesContainterParametersBase> extends BaseImagesCommand<T> {
+
+    private CinderDisk disk;
+    private CinderBroker cinderBroker;
+
+    public CreateCinderSnapshotCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    public CreateCinderSnapshotCommand(T parameters, CommandContext 
commandContext) {
+        super(parameters, commandContext);
+    }
+
+    private CinderDisk cloneDiskFromSnapshot() {
+        CinderDisk newCinderVolume = getDisk();
+        setStoragePoolId(newCinderVolume.getStoragePoolId() != null ? 
newCinderVolume.getStoragePoolId()
+                : Guid.Empty);
+        getParameters().setStoragePoolId(getStoragePoolId());
+
+        // override volume type and volume format to sparse and cow according 
to
+        // storage team request
+        newCinderVolume.setVolumeType(VolumeType.Sparse);
+        newCinderVolume.setvolumeFormat(VolumeFormat.COW);
+        newCinderVolume.setImageStatus(ImageStatus.LOCKED);
+        String snapshotId = getCinderBroker().createSnapshot(newCinderVolume, 
false);
+        Guid destinationImageId = Guid.createGuidFromString(snapshotId);
+        getParameters().setDestinationImageId(destinationImageId);
+        newCinderVolume.setImageId(destinationImageId);
+        return newCinderVolume;
+    }
+
+    /**
+     * By default old image must be replaced by new one
+     */
+    protected void processOldImageFromDb() {
+        getCompensationContext().snapshotEntity(getDiskImage().getImage());
+        
getParameters().setOldLastModifiedValue(getDiskImage().getLastModified());
+        getDiskImage().setLastModified(new Date());
+        getDiskImage().setActive(false);
+        getImageDao().update(getDiskImage().getImage());
+        getCompensationContext().stateChanged();
+    }
+
+    @Override
+    protected void executeCommand() {
+        final CinderDisk newCinderVolume = cloneDiskFromSnapshot();
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                processOldImageFromDb();
+                addDiskImageToDb(newCinderVolume, getCompensationContext());
+                setActionReturnValue(newCinderVolume);
+                setSucceeded(true);
+                return null;
+            }
+        });
+
+        getReturnValue().setActionReturnValue(newCinderVolume.getImageId());
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(true);
+        return;
+    }
+
+    protected CinderDisk getDisk() {
+        if (disk == null) {
+            disk = (CinderDisk) getDiskDao().get(getImageId());
+        }
+        return disk;
+    }
+
+    public CinderBroker getCinderBroker() {
+        if (cinderBroker == null) {
+            Guid storageDomainId = getDisk().getStorageIds().get(0);
+            cinderBroker = new CinderBroker(storageDomainId, 
getReturnValue().getExecuteFailedMessages());
+        }
+        return cinderBroker;
+    }
+
+    @Override
+    protected void lockImage() {
+        ImagesHandler.updateImageStatus(getParameters().getImageId(), 
ImageStatus.LOCKED);
+    }
+
+    @Override
+    public CommandCallback getCallback() {
+        return new CreateCinderSnapshotCommandCallback();
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        setSucceeded(true);
+    }
+
+    @Override
+    protected void endWithFailure() {
+        setSucceeded(true);
+    }
+}
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 845d419..8c65e30 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
@@ -451,6 +451,7 @@
     CloneSingleCinderDisk(3204, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
     CloneCinderDisks(3205, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
     RegisterCinderDisk(3206, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.NONE),
+    CreateCinderSnapshot(3207, ActionGroup.CONFIGURE_VM_STORAGE, false, 
QuotaDependency.NONE),
 
     // Host Devices
     RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, 
QuotaDependency.NONE),


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I828f61ed4892b52288256a9a1e14b2efb56140c7
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

Reply via email to