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