Ravi Nori has uploaded a new change for review. Change subject: engine : Remove Disk command using getVolumeInfoAsync ......................................................................
engine : Remove Disk command using getVolumeInfoAsync Use getVolumeInfoAsync in RemoveImageCommandCallback to retrieve the image volume info from vdsm. Change-Id: I458143387f89a5d55bda5f1d4f9d44be4f7fb197 Signed-off-by: Ravi Nori <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommandCallback.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommandCallback.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java 5 files changed, 135 insertions(+), 18 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/74/39374/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java index 5202e03..6d8bbd8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommand.java @@ -16,6 +16,7 @@ import org.ovirt.engine.core.bll.quota.QuotaStorageDependent; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; 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.bll.validator.storage.DiskImagesValidator; import org.ovirt.engine.core.bll.validator.storage.DiskValidator; @@ -292,13 +293,20 @@ protected void executeCommand() { switch (getDisk().getDiskStorageType()) { case IMAGE: - VdcReturnValueBase vdcReturnValue = - runInternalActionWithTasksContext(VdcActionType.RemoveImage, - buildRemoveImageParameters(getDiskImage())); - if (vdcReturnValue.getSucceeded()) { - incrementVmsGeneration(); - getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValue.getInternalVdsmTaskIdList()); - setSucceeded(true); + if (getDisk().getDiskStorageType() == DiskStorageType.IMAGE) { + Future<VdcReturnValueBase> future = CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.RemoveImage, + buildRemoveImageParameters(getDiskImage()), + cloneContextAndDetachFromParent()); + try { + VdcReturnValueBase vdcReturnValue = future.get(); + if (vdcReturnValue.getSucceeded()) { + incrementVmsGeneration(); + setSucceeded(true); + } + } catch (Exception ex) { + log.error("Exception raised during executeAsyncCommand", ex); + } } break; case LUN: @@ -513,4 +521,12 @@ protected DiskImageDynamicDAO getDiskImageDynamicDAO() { return getDbFacade().getDiskImageDynamicDao(); } + + @Override + public CommandCallback getCallback() { + if (getDisk().getDiskStorageType() == DiskStorageType.IMAGE) { + return new RemoveDiskCommandCallback(); + } + return null; + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommandCallback.java new file mode 100644 index 0000000..b94b0c1 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveDiskCommandCallback.java @@ -0,0 +1,45 @@ +package org.ovirt.engine.core.bll; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; +import org.ovirt.engine.core.common.action.RemoveDiskParameters; +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 RemoveDiskCommandCallback extends CommandCallback { + private static final Logger log = LoggerFactory.getLogger(RemoveDiskCommandCallback.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 Remove Disk child commands to complete"); + return; + case FAILED: + case FAILED_RESTARTED: + case UNKNOWN: + anyFailed = true; + break; + default: + break; + } + } + + RemoveDiskCommand<RemoveDiskParameters> command = getCommand(cmdId); + command.getParameters().setTaskGroupSuccess(!anyFailed); + command.setCommandStatus(anyFailed ? CommandStatus.FAILED : CommandStatus.SUCCEEDED); + log.info("Remove Disk command has completed for image '{}'..'{}'", + command.getParameters().getDiskId(), + command.getCommandStatus()); + } + + private RemoveDiskCommand<RemoveDiskParameters> getCommand(Guid cmdId) { + return CommandCoordinatorUtil.retrieveCommand(cmdId); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java index 3934db1..99faf32 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java @@ -7,7 +7,8 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.PostZeroHandler; -import org.ovirt.engine.core.common.VdcObjectType; +//import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.common.action.RemoveImageParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; @@ -23,6 +24,7 @@ import org.ovirt.engine.core.common.vdscommands.GetImagesListVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.TransactionScopeOption; import org.ovirt.engine.core.dao.VmDeviceDAO; @@ -73,16 +75,9 @@ protected void executeCommand() { if (getDiskImage() != null) { try { - Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); - - VDSReturnValue vdsReturnValue = performImageVdsmOperation(); - getReturnValue().getInternalVdsmTaskIdList().add( - createTask(taskId, - vdsReturnValue.getCreationInfo(), - getParameters().getParentCommand(), - VdcObjectType.Storage, - getStorageDomainId())); + performImageVdsmOperation(); } catch (VdcBLLException e) { + setCommandStatus(CommandStatus.FAILED); if (e.getErrorCode() == VdcBllErrors.ImageDoesNotExistInDomainError) { log.info("Disk '{}' doesn't exist on storage domain '{}', rolling forward", getDiskImage().getId(), getStorageDomainId()); @@ -307,4 +302,9 @@ protected VmDeviceDAO getVmDeviceDAO() { return getDbFacade().getVmDeviceDao(); } + + @Override + public CommandCallback getCallback() { + return new RemoveImageCommandCallback(); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommandCallback.java new file mode 100644 index 0000000..30904cf --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommandCallback.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.core.bll; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; +import org.ovirt.engine.core.common.action.RemoveImageParameters; +import org.ovirt.engine.core.common.businessentities.storage.DiskImage; +import org.ovirt.engine.core.common.errors.VdcBllErrors; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.irsbroker.IrsProxyData; +import org.ovirt.engine.core.vdsbroker.irsbroker.OneImageInfoReturnForXmlRpc; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class RemoveImageCommandCallback extends CommandCallback { + private static final Logger log = LoggerFactory.getLogger(RemoveImageCommandCallback.class); + + private OneImageInfoReturnForXmlRpc imageInfoReturn; + private IrsProxyData irsProxyData; + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + RemoveImageCommand<RemoveImageParameters> cmd = CommandCoordinatorUtil.retrieveCommand(cmdId); + if (imageInfoReturn == null) { + DiskImage diskImage = cmd.getDiskImage(); + Guid storageDomainID = diskImage.getStorageIds().get(0); + Guid storagePoolId = diskImage.getStoragePoolId() != null ? diskImage.getStoragePoolId() : Guid.Empty; + Guid imageGroupId = diskImage.getId() != null ? diskImage.getId() : Guid.Empty; + Guid imageId = diskImage.getImageId(); + + if (irsProxyData == null) { + irsProxyData = new IrsProxyData(storagePoolId); + } + + imageInfoReturn = irsProxyData.getIrsProxy().getVolumeInfoAsync(storageDomainID.toString(), + storagePoolId.toString(), imageGroupId.toString(), + imageId.toString()); + } + + if (imageInfoReturn.isRequestCompleted()) { + VdcBllErrors returnCode = VdcBllErrors.forValue(imageInfoReturn.getStatus().mCode); + if (returnCode == VdcBllErrors.ImagePathError) { + getCommand(cmdId).setCommandStatus(CommandStatus.SUCCEEDED); + } else { + imageInfoReturn = null; + } + } + } + + private RemoveImageCommand<RemoveImageParameters> getCommand(Guid cmdId) { + return CommandCoordinatorUtil.retrieveCommand(cmdId); + } + +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java index 8777789..297c23f 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/GetImageInfoVDSCommand.java @@ -54,7 +54,7 @@ @Override protected StatusForXmlRpc getReturnStatus() { - return imageInfoReturn.mStatus; + return imageInfoReturn.getStatus(); } @Override -- To view, visit https://gerrit.ovirt.org/39374 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I458143387f89a5d55bda5f1d4f9d44be4f7fb197 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
