Daniel Erez has uploaded a new change for review.

Change subject: core: introduce CloneCinderDisksCommand
......................................................................

core: introduce CloneCinderDisksCommand

Adding CloneCinderDisksCommand and CloneCinderDisksCommandCallback.

Change-Id: I6b2e4b8c3f5a999303e45e8431809a276835c8ec
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/CloneCinderDisksCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommandCallback.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneCinderDisksParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
4 files changed, 211 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/44/39644/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommand.java
new file mode 100644
index 0000000..e67a279
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommand.java
@@ -0,0 +1,94 @@
+package org.ovirt.engine.core.bll.storage;
+
+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.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.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+@InternalCommandAttribute
+public class CloneCinderDisksCommand<T extends CloneCinderDisksParameters> 
extends CommandBase<T> {
+
+    public CloneCinderDisksCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    public CloneCinderDisksCommand(T parameters, CommandContext 
commandContext) {
+        super(parameters, commandContext);
+    }
+
+    @Override
+    protected void executeCommand() {
+        boolean isSucceeded = true;
+        Map<Guid, Guid> diskImageMap = new HashMap<>();
+        for (CinderDisk disk : getParameters().getCinderDisks()) {
+            ImagesContainterParametersBase params = 
buildChildCommandParameters(disk);
+            Future<VdcReturnValueBase> future = 
CommandCoordinatorUtil.executeAsyncCommand(
+                    VdcActionType.CloneSingleCinderDisk,
+                    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;
+                }
+                Guid imageId = vdcReturnValueBase.getActionReturnValue();
+                diskImageMap.put(disk.getId(), imageId);
+            } catch (InterruptedException | ExecutionException e) {
+                log.error("Error cloning Cinder disk '{}': {}", 
disk.getDiskAlias(), e.getMessage());
+                isSucceeded = false;
+            }
+
+        }
+        getReturnValue().setActionReturnValue(diskImageMap);
+        persistCommand(getParameters().getParentCommand(), true);
+        setSucceeded(isSucceeded);
+    }
+
+    private ImagesContainterParametersBase 
buildChildCommandParameters(CinderDisk cinderDisk) {
+        ImagesContainterParametersBase createParams = new 
ImagesContainterParametersBase(cinderDisk.getId());
+        DiskImage templateDisk = 
getParameters().getDisksMap().get(cinderDisk.getId());
+        cinderDisk.setDiskAlias(templateDisk.getDiskAlias());
+        createParams.setStorageDomainId(templateDisk.getStorageIds().get(0));
+        createParams.setEntityInfo(getParameters().getEntityInfo());
+        return withRootCommandInfo(createParams, 
getParameters().getParentCommand());
+    }
+
+    @Override
+    public CommandCallback getCallback() {
+        return new CloneCinderDisksCommandCallback();
+    }
+
+    @Override
+    protected void endSuccessfully() {
+        if (!getParameters().isParentHasTasks()) {
+            getBackend().endAction(getParameters().getParentCommand(),
+                    getParameters().getParentParameters(),
+                    
getContext().clone().withoutCompensationContext().withoutExecutionContext().withoutLock());
+        }
+        setSucceeded(true);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommandCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommandCallback.java
new file mode 100644
index 0000000..134cacc
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/CloneCinderDisksCommandCallback.java
@@ -0,0 +1,57 @@
+package org.ovirt.engine.core.bll.storage;
+
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
+import org.ovirt.engine.core.common.action.CloneCinderDisksParameters;
+import org.ovirt.engine.core.compat.CommandStatus;
+import org.ovirt.engine.core.compat.Guid;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+public class CloneCinderDisksCommandCallback<T extends 
CloneCinderDisksCommand<CloneCinderDisksParameters>> extends CommandCallback {
+    private static final Logger log = 
LoggerFactory.getLogger(CloneCinderDisksCommandCallback.class);
+
+    @Override
+    public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
+
+        boolean anyFailed = false;
+        for (Guid childCmdId : childCmdIds) {
+            switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) {
+            case ACTIVE:
+                log.info("Waiting on CloneCinderDisksCommandCallback child 
commands to complete");
+                return;
+            case FAILED:
+            case FAILED_RESTARTED:
+            case UNKNOWN:
+                anyFailed = true;
+                break;
+            default:
+                break;
+            }
+        }
+
+        T command = getCommand(cmdId);
+        command.getParameters().setTaskGroupSuccess(!anyFailed);
+        command.setCommandStatus(anyFailed ? CommandStatus.FAILED : 
CommandStatus.SUCCEEDED);
+        log.info("All CloneCinderDisksCommandCallback commands have completed, 
status '{}'",
+                command.getCommandStatus());
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+        CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        getCommand(cmdId).endAction();
+        CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
+    }
+
+    private T getCommand(Guid cmdId) {
+        return (T) CommandCoordinatorUtil.retrieveCommand(cmdId);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneCinderDisksParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneCinderDisksParameters.java
new file mode 100644
index 0000000..0815ebb
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneCinderDisksParameters.java
@@ -0,0 +1,59 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.common.businessentities.storage.CinderDisk;
+import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
+import org.ovirt.engine.core.compat.Guid;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public class CloneCinderDisksParameters extends VdcActionParametersBase 
implements Serializable {
+    private static final long serialVersionUID = 1528721415797299722L;
+
+    private List<CinderDisk> cinderDisks;
+    private Guid vmSnapshotId;
+    private Map<Guid, ? extends DiskImage> disksMap;
+    private boolean parentHasTasks;
+
+    public CloneCinderDisksParameters() {
+    }
+
+    public CloneCinderDisksParameters(List<CinderDisk> cinderDisks, Guid 
vmSnapshotId, Map<Guid, ? extends DiskImage> disksMap) {
+        this.cinderDisks = cinderDisks;
+        this.vmSnapshotId = vmSnapshotId;
+        this.disksMap = disksMap;
+    }
+
+    public List<CinderDisk> getCinderDisks() {
+        return cinderDisks;
+    }
+
+    public void setCinderDisks(List<CinderDisk> cinderDisks) {
+        this.cinderDisks = cinderDisks;
+    }
+
+    public Guid getVmSnapshotId() {
+        return vmSnapshotId;
+    }
+
+    public void setVmSnapshotId(Guid vmSnapshotId) {
+        this.vmSnapshotId = vmSnapshotId;
+    }
+
+    public Map<Guid, ? extends DiskImage> getDisksMap() {
+        return disksMap;
+    }
+
+    public void setDisksMap(Map<Guid, ? extends DiskImage> disksMap) {
+        this.disksMap = disksMap;
+    }
+
+    public boolean isParentHasTasks() {
+        return parentHasTasks;
+    }
+
+    public void setParentHasTasks(boolean parentHasTasks) {
+        this.parentHasTasks = parentHasTasks;
+    }
+}
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 37d75a7..4eec38a 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
@@ -439,6 +439,7 @@
     ExtendCinderDisk(3202, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
     RemoveAllVmCinderDisks(3203, QuotaDependency.STORAGE),
     CloneSingleCinderDisk(3204, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
+    CloneCinderDisks(3205, ActionGroup.CONFIGURE_VM_STORAGE, 
QuotaDependency.STORAGE),
 
     // Host Devices
     RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, 
QuotaDependency.NONE);


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

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