Daniel Erez has uploaded a new change for review.

Change subject: core: introduce CloneSingleCinderDiskCommand
......................................................................

core: introduce CloneSingleCinderDiskCommand

Adding CloneSingleCinderDiskCommand and
CloneSingleCinderDiskCommandCallback.

Change-Id: I608ab9de6c4a79ea8bdf44e1547f72a30ab80db7
Bug-Url: https://bugzilla.redhat.com/1185826
Signed-off-by: Daniel Erez <de...@redhat.com>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
3 files changed, 171 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/43/39643/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java
new file mode 100644
index 0000000..b9c678b
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommand.java
@@ -0,0 +1,93 @@
+package org.ovirt.engine.core.bll.storage;
+
+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.DiskImageDynamic;
+import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
+import 
org.ovirt.engine.core.common.businessentities.storage.ImageStorageDomainMap;
+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 CloneSingleCinderDiskCommand<T extends 
ImagesContainterParametersBase> extends BaseImagesCommand<T> {
+
+    private CinderDisk disk;
+
+    public CloneSingleCinderDiskCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    public CloneSingleCinderDiskCommand(T parameters, CommandContext 
commandContext) {
+        super(parameters, commandContext);
+        setStorageDomainId(parameters.getStorageDomainId());
+    }
+
+    @Override
+    protected void executeCommand() {
+        lockImage();
+        CinderDisk cinderDisk = getDisk();
+        String volumeId = getCinderBroker().cloneDisk(cinderDisk);
+
+        cinderDisk.setId(Guid.createGuidFromString(volumeId));
+        cinderDisk.setImageId(Guid.createGuidFromString(volumeId));
+        cinderDisk.setImageStatus(ImageStatus.LOCKED);
+        cinderDisk.setVolumeType(VolumeType.Sparse);
+        addCinderDiskTemplateToDB(cinderDisk);
+
+        getReturnValue().setActionReturnValue(cinderDisk.getId());
+        
getParameters().setDestinationImageId(Guid.createGuidFromString(volumeId));
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(true);
+    }
+
+    protected void addCinderDiskTemplateToDB(final CinderDisk cinderDisk) {
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                getBaseDiskDao().save(cinderDisk);
+                getImageDao().save(cinderDisk.getImage());
+                DiskImageDynamic diskDynamic = new DiskImageDynamic();
+                diskDynamic.setId(cinderDisk.getImageId());
+                getDiskImageDynamicDAO().save(diskDynamic);
+                ImageStorageDomainMap image_storage_domain_map = new 
ImageStorageDomainMap(cinderDisk.getImageId(),
+                        cinderDisk.getStorageIds().get(0), 
cinderDisk.getQuotaId(), cinderDisk.getDiskProfileId());
+                
getDbFacade().getImageStorageDomainMapDao().save(image_storage_domain_map);
+                return null;
+            }
+        });
+    }
+
+    protected CinderDisk getDisk() {
+        if (disk == null) {
+            disk = (CinderDisk) getDiskDao().get(getImageId());
+        }
+        return disk;
+    }
+
+    @Override
+    protected void lockImage() {
+        ImagesHandler.updateImageStatus(getParameters().getImageId(), 
ImageStatus.LOCKED);
+    }
+
+    @Override
+    public CommandCallback getCallback() {
+        return new CloneSingleCinderDiskCommandCallback();
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        setSucceeded(true);
+    }
+
+    @Override
+    protected void endWithFailure() {
+        setSucceeded(true);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java
new file mode 100644
index 0000000..8617563
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneSingleCinderDiskCommandCallback.java
@@ -0,0 +1,77 @@
+package org.ovirt.engine.core.bll.storage;
+
+import org.ovirt.engine.core.bll.ImagesHandler;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+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.DiskImage;
+import org.ovirt.engine.core.common.businessentities.storage.ImageStatus;
+import org.ovirt.engine.core.compat.CommandStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.DiskDao;
+
+import java.util.List;
+
+public class CloneSingleCinderDiskCommandCallback extends 
AbstractCinderDiskCommandCallback<CloneSingleCinderDiskCommand<ImagesContainterParametersBase>>
 {
+
+    @Override
+    public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
+        super.doPolling(cmdId, childCmdIds);
+
+        ImageStatus imageStatus = getCinderBroker().getDiskStatus(getDiskId());
+        DiskImage disk = getDisk();
+        if (imageStatus != null && imageStatus != disk.getImageStatus()) {
+            switch (imageStatus) {
+                case OK:
+                    getCommand().setCommandStatus(CommandStatus.SUCCEEDED);
+                    break;
+                case ILLEGAL:
+                    getCommand().setCommandStatus(CommandStatus.FAILED);
+                    break;
+            }
+        }
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        super.onFailed(cmdId, childCmdIds);
+        ImagesHandler.updateImageStatus(getDiskId(), ImageStatus.ILLEGAL);
+        onFinish(cmdId);
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+        super.onSucceeded(cmdId, childCmdIds);
+        ImagesHandler.updateImageStatus(getDiskId(), ImageStatus.OK);
+        onFinish(cmdId);
+    }
+
+    private void onFinish(Guid cmdId) {
+        
ImagesHandler.updateImageStatus(getCommand().getParameters().getImageId(), 
ImageStatus.OK);
+        getCommand().endAction();
+        CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
+    }
+
+    @Override
+    protected Guid getDiskId() {
+        return getCommand().getParameters().getDestinationImageId();
+    }
+
+    @Override
+    protected CinderDisk getDisk() {
+        if (disk == null) {
+            disk = (CinderDisk) 
getDiskDao().get(getCommand().getParameters().getDestinationImageId());
+        }
+        return disk;
+    }
+
+    protected DiskDao getDiskDao() {
+        return DbFacade.getInstance().getDiskDao();
+    }
+
+    @Override
+    protected CinderBroker getCinderBroker() {
+        return getCommand().getCinderBroker();
+    }
+}
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 adcbfff..37d75a7 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
@@ -438,6 +438,7 @@
     RemoveCinderDisk(3201, QuotaDependency.STORAGE),
     ExtendCinderDisk(3202, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
     RemoveAllVmCinderDisks(3203, QuotaDependency.STORAGE),
+    CloneSingleCinderDisk(3204, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
 
     // Host Devices
     RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, 
QuotaDependency.NONE);


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

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

Reply via email to