Maor Lipchuk has uploaded a new change for review. Change subject: core: Add command to remove VM with Cinder disks ......................................................................
core: Add command to remove VM with Cinder disks Adding a command for removing all the Cinder disks attached to a VM. Change-Id: I5ed7ecdd6cd891936ed7a18b4f48eec48935b79a 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/RemoveAllVmCinderDisksCommand.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/RemoveAllVmCinderDisksParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 3 files changed, 135 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/28/39228/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveAllVmCinderDisksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveAllVmCinderDisksCommand.java new file mode 100644 index 0000000..91c97d4 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveAllVmCinderDisksCommand.java @@ -0,0 +1,93 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.common.action.RemoveAllVmCinderDisksParameters; +import org.ovirt.engine.core.common.action.RemoveDiskParameters; +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.dal.dbbroker.DbFacade; + +@InternalCommandAttribute +@NonTransactiveCommandAttribute +public class RemoveAllVmCinderDisksCommand<T extends RemoveAllVmCinderDisksParameters> extends VmCommand<T> { + + public RemoveAllVmCinderDisksCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + @Override + protected void executeVmCommand() { + Collection<CinderDisk> failedRemoving = new LinkedList<>(); + for (final CinderDisk cinderDisk : getCinderDisksToBeRemoved()) { + if (Boolean.TRUE.equals(cinderDisk.getActive())) { + VdcReturnValueBase vdcReturnValue = removeCinderDisk(cinderDisk); + if (vdcReturnValue == null || !vdcReturnValue.getSucceeded()) { + failedRemoving.add(cinderDisk); + logRemoveCinderDiskError(cinderDisk, vdcReturnValue); + } + } + } + setActionReturnValue(failedRemoving); + setSucceeded(true); + } + + private void logRemoveCinderDiskError(CinderDisk cinderDisk, VdcReturnValueBase vdcReturnValue) { + log.error("Can't remove cinder disk id '{}' for VM id '{}' from domain id '{}' due to: {}.", + cinderDisk.getImageId(), + getParameters().getVmId(), + cinderDisk.getStorageIds().get(0), + vdcReturnValue != null ? vdcReturnValue.getFault().getMessage() : ""); + } + + private VdcReturnValueBase removeCinderDisk(CinderDisk cinderDisk) { + Future<VdcReturnValueBase> future = CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.RemoveCinderDisk, + buildChildCommandParameters(cinderDisk), + cloneContextAndDetachFromParent()); + try { + return future.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + return null; + } + + private RemoveDiskParameters buildChildCommandParameters(CinderDisk cinderDisk) { + RemoveDiskParameters param = new RemoveDiskParameters(cinderDisk.getId(), cinderDisk.getStorageIds().get(0)); + return withRootCommandInfo(param, getParameters().getParentCommand()); + } + + @Override + protected void endSuccessfully() { + if (!getParameters().isParentHasTasks()) { + getBackend().endAction(getParameters().getParentCommand(), + getParameters().getParentParameters(), + getContext().clone().withoutCompensationContext().withoutExecutionContext().withoutLock()); + } + endVmCommand(); + } + + private List<CinderDisk> getCinderDisksToBeRemoved() { + List<CinderDisk> imageDisks = getParameters().cinderDisks; + List<CinderDisk> cinderDisks = new ArrayList<>(); + if (imageDisks == null) { + cinderDisks = + ImagesHandler.filterDiskBasedOnCinder(DbFacade.getInstance().getDiskDao().getAllForVm(getVmId())); + } else { + for (DiskImage diskImage : imageDisks) { + cinderDisks.add((CinderDisk) diskImage); + } + } + return cinderDisks; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/RemoveAllVmCinderDisksParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/RemoveAllVmCinderDisksParameters.java new file mode 100644 index 0000000..c43ee31 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/RemoveAllVmCinderDisksParameters.java @@ -0,0 +1,41 @@ +package org.ovirt.engine.core.common.action; + +import java.io.Serializable; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.storage.CinderDisk; +import org.ovirt.engine.core.compat.Guid; + +public class RemoveAllVmCinderDisksParameters extends VmOperationParameterBase implements Serializable { + + private boolean parentHasTasks; + + public List<CinderDisk> cinderDisks; + + public RemoveAllVmCinderDisksParameters() { + } + + public RemoveAllVmCinderDisksParameters(Guid vmId, List<CinderDisk> cinderDisks) { + super(vmId); + this.cinderDisks = cinderDisks; + setForceDelete(false); + } + + private boolean privateForceDelete; + + public boolean getForceDelete() { + return privateForceDelete; + } + + public void setForceDelete(boolean value) { + privateForceDelete = value; + } + + 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 19a4ae4..56fe1c0 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 @@ -428,6 +428,7 @@ AddCinderDisk(3200, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), RemoveCinderDisk(3201, QuotaDependency.STORAGE), ExtendCinderDisk(3202, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.NONE), + RemoveAllVmCinderDisks(3203, ActionGroup.CONFIGURE_VM_STORAGE, false, QuotaDependency.NONE), // Host Devices RefreshHostDevices(4000, ActionGroup.MANIPULATE_HOST, false, QuotaDependency.NONE); -- To view, visit https://gerrit.ovirt.org/39228 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5ed7ecdd6cd891936ed7a18b4f48eec48935b79a 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
