Liron Aravot has uploaded a new change for review. Change subject: tmp ......................................................................
tmp Change-Id: I38c65fc154292edf571620eb7d68c205b7466463 Signed-off-by: Liron Aravot <lara...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 41 files changed, 1,464 insertions(+), 59 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/07/37807/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java index 814fb9d..3e622f7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java @@ -458,8 +458,16 @@ addDiskPermissions(diskImage); getReturnValue().setActionReturnValue(diskImage.getId()); } - getReturnValue().setFault(tmpRetValue.getFault()); - setSucceeded(tmpRetValue.getSucceeded()); + + if (!tmpRetValue.getSucceeded()) { + getReturnValue().setFault(tmpRetValue.getFault()); + setSucceeded(tmpRetValue.getSucceeded()); + return; + } + + if (taskList.isEmpty()) { + endSuccessfully(); + } } /** diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java index bb7e8a3..2e2fece 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java @@ -1,16 +1,22 @@ package org.ovirt.engine.core.bll; -import org.ovirt.engine.core.bll.context.CommandContext; - import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.List; +import java.util.Random; +import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.ImageStatus; -import org.ovirt.engine.core.common.vdscommands.CreateImageVDSCommandParameters; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.businessentities.VolumeType; +import org.ovirt.engine.core.common.vdscommands.AllocateVolumeVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.CreateVolumeVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.SetVolumeDescriptionVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; @@ -19,7 +25,7 @@ import org.ovirt.engine.core.utils.transaction.TransactionSupport; @InternalCommandAttribute -@NonTransactiveCommandAttribute(forceCompensation=true) +@NonTransactiveCommandAttribute(forceCompensation = true) public class AddImageFromScratchCommand<T extends AddImageFromScratchParameters> extends CreateSnapshotCommand<T> { public AddImageFromScratchCommand(T parameters, CommandContext commandContext) { @@ -92,26 +98,60 @@ protected boolean processImageInIrs() { Guid taskId = getAsyncTaskId(); String diskDescription = getParameters().getDiskInfo().getDiskDescription(); - VDSReturnValue vdsReturnValue = runVdsCommand( - VDSCommandType.CreateImage, - new CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), getParameters() - .getStorageDomainId(), getImageGroupId(), getParameters().getDiskInfo().getSize(), - getParameters().getDiskInfo().getVolumeType(), getParameters().getDiskInfo() - .getVolumeFormat(), getDestinationImageId(), diskDescription != null ? diskDescription : "")); - if (vdsReturnValue.getSucceeded()) { - getParameters().setVdsmTaskIds(new ArrayList<Guid>()); - getParameters().getVdsmTaskIds().add( - createTask(taskId, - vdsReturnValue.getCreationInfo(), - getParameters().getParentCommand(), - VdcObjectType.Storage, - getParameters().getStorageDomainId())); - getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0)); + // VDSReturnValue vdsReturnValue = runVdsCommand( + // VDSCommandType.CreateImage, + // new CreateImageVDSCommandParameters(getParameters().getStoragePoolId(), getParameters() + // .getStorageDomainId(), getImageGroupId(), getParameters().getDiskInfo().getSize(), + // getParameters().getDiskInfo().getVolumeType(), getParameters().getDiskInfo() + // .getVolumeFormat(), getDestinationImageId(), diskDescription != null ? diskDescription : "")); + VDSReturnValue vdsReturnValue = + runVdsCommand( + VDSCommandType.CreateVolume, + new CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(), + getParameters() + .getStorageDomainId(), + getImageGroupId(), + getParameters().getDiskInfo().getSize(), + getParameters().getDiskInfo().getVolumeType(), + getParameters().getDiskInfo() + .getVolumeFormat(), + getDestinationImageId(), + diskDescription != null ? diskDescription : "")); + if (!vdsReturnValue.getSucceeded()) { + // getParameters().setVdsmTaskIds(new ArrayList<Guid>()); + // getParameters().getVdsmTaskIds().add( + // createTask(taskId, + // vdsReturnValue.getCreationInfo(), + // getParameters().getParentCommand(), + // VdcObjectType.Storage, + // getParameters().getStorageDomainId())); + // getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0)); - return true; + return false; } - return false; + if (getParameters().getDiskInfo().getVolumeType() == VolumeType.Preallocated) { + vdsReturnValue = + runVdsCommand(VDSCommandType.AllocateVolume, + new AllocateVolumeVDSCommandParameters(selectHost(), + getParameters().getStoragePoolId(), + getParameters().getStorageDomainId(), + getImageGroupId(), + getDestinationImageId(), + getParameters().getDiskInfo().getSize())); + if (vdsReturnValue.getSucceeded()) { + getParameters().setVdsmTaskIds(new ArrayList<Guid>()); + getParameters().getVdsmTaskIds().add( + createTask(taskId, + vdsReturnValue.getCreationInfo(), + getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId())); + getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0)); + } + } + + return true; } @Override @@ -131,4 +171,22 @@ } } + + public VDSReturnValue setDesc() { + return runVdsCommand(VDSCommandType.SetVolumeDescription, + new SetVolumeDescriptionVDSCommandParameters( + getParameters().getStoragePoolId(), + getParameters().getStorageDomainId(), + getImageGroupId(), + getDestinationImageId(), + "LIRON")); + } + + protected Guid selectHost() { + List<VDS> hosts = DbFacade.getInstance() + .getVdsDao() + .getAllForStoragePoolAndStatus(getParameters().getStoragePoolId(), VDSStatus.Up); + VDS selectedHost = hosts.remove(new Random().nextInt(hosts.size())); + return selectedHost.getId(); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java new file mode 100644 index 0000000..1d64da1 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneDiskWithDataCommandCallback.java @@ -0,0 +1,76 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; +import org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CloneDiskWithDataCommandCallback extends CommandCallBack { + + private static final Logger log = LoggerFactory.getLogger(CloneImageGroupVolumesCommandCallBack.class); + + private CommandBase<?> getCommand(Guid cmdId) { + return CommandCoordinatorUtil.retrieveCommand(cmdId); + } + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + CommandBase<?> command = getCommand(cmdId); + if (childCmdIds.isEmpty()) { + CloneImageGroupVolumesCommandParameters params = new CloneImageGroupVolumesCommandParameters(); + params.setParentCommand(command.getActionType()); + params.setParentParameters(command.getParameters()); + CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.CloneImageGroupVolumes, + params, + command.cloneContextAndDetachFromParent()); + return; + } + + // we know that we execute only one command + CommandBase<?> childCommand = getCommand(childCmdIds.get(0)); + + switch (childCommand.getCommandStatus()) { + case NOT_STARTED: + case ACTIVE: + log.info("Waiting on CopyVolumeData child commands to complete"); + return; + case FAILED: + case FAILED_RESTARTED: + case UNKNOWN: + break; + default: + CommandEntity cmdEntity = CommandCoordinatorUtil.getCommandEntity(childCommand.getCommandId()); + if (cmdEntity.isCallBackNotified()) { + break; + } else { + log.info("Waiting on CloneImageGroupVolumes child command to finalize"); + return; + } + } + + command.getParameters().setTaskGroupSuccess(childCommand.getSucceeded()); + command.setCommandStatus(command.getParameters().getTaskGroupSuccess() ? CommandStatus.FAILED : CommandStatus.SUCCEEDED); + log.info("All clone disk with data operations 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); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java new file mode 100644 index 0000000..458755e --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java @@ -0,0 +1,70 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; + +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; +import org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.compat.Guid; + +public class CloneImageGroupVolumeCommand<T extends MoveOrCopyImageGroupParameters> extends BaseImagesCommand<T> { + + public CloneImageGroupVolumeCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + setImageId(getParameters().getImageId()); + setImageGroupId(getParameters().getImageGroupID()); + } + + public CloneImageGroupVolumeCommand(T parameters) { + this(parameters, null); + } + + @Override + protected void executeCommand() { + createVolume(); + copyDataFromSrcVolume(); + } + + private void createVolume() { +// runVdsCommand( +// VDSCommandType.CreateVolume, +// new CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(), +// getParameters() +// .getStorageDomainId(), +// getImageGroupId(), +// getImage().getSize(), +// getImage().getVolumeType(), +// getImage() +// .getVolumeFormat(), +// getDestinationImageId(), +// getImage().getDescription() != null ? getImage().getDescription() : "")); + } + + private void copyDataFromSrcVolume() { + persistAsyncTaskPlaceHolder(getParameters().getParentCommand()); + VDSReturnValue vdsReturnValue = runVdsCommand( + VDSCommandType.CopyVolumeData, + new CopyVolumeDataVDSCommandParameters(getParameters().getStoragePoolId(), + getParameters() + .getSourceDomainId(), + getParameters().getImageGroupID(), + getParameters().getImageId(), + getParameters().getStorageDomainId(), + getParameters().getDestImageGroupId(), + getParameters().getDestinationImageId())); + + if (vdsReturnValue.getSucceeded()) { + getParameters().setVdsmTaskIds(new ArrayList<Guid>()); + getParameters().getVdsmTaskIds().add( + createTask(getAsyncTaskId(), + vdsReturnValue.getCreationInfo(), + getParameters().getParentCommand(), + VdcObjectType.Storage, + getParameters().getStorageDomainId())); + getReturnValue().getInternalVdsmTaskIdList().add(getParameters().getVdsmTaskIds().get(0)); + } + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java new file mode 100644 index 0000000..58d9ddd --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.core.bll; + +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.common.action.CloneImageGroupVolumesCommandParameters; +import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class CloneImageGroupVolumesCommand<T extends CloneImageGroupVolumesCommandParameters> extends BaseImagesCommand<T> { + public CloneImageGroupVolumesCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + public CloneImageGroupVolumesCommand(T parameters) { + this(parameters, null); + } + + @Override + public CommandCallBack getCallBack() { + return new CloneImageGroupVolumesCommandCallBack(); + + } + + @Override + protected void executeCommand() { + getParameters().setImageIds(ImagesHandler.getDiskImageIds(DbFacade.getInstance() + .getDiskImageDao() + .getAllSnapshotsForImageGroup(getParameters().getImageGroupID()))); + + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(true); + } + + private VdcActionParametersBase buildChildCommandParams(Guid imageId) { + MoveOrCopyImageGroupParameters params = new MoveOrCopyImageGroupParameters(); + params.setParentCommand(getActionType()); + params.setParentParameters(getParameters()); + return params; + } + + public void performNextCopy(int completedChildren) { + if (completedChildren == 0) { + // Lock all disk images in advance + ImagesHandler.updateAllDiskImageSnapshotsStatus(getImageGroupId(), ImageStatus.LOCKED); + } + + Guid imageId = getParameters().getImageIds().get(completedChildren); + log.info("Starting child command {} of {}, image '{}'", + completedChildren + 1, getParameters().getImageIds().size(), imageId); + + VdcActionParametersBase parameters = buildChildCommandParams(imageId); + persistCommand(getParameters().getParentCommand(), true); + + CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.CloneImageGroupVolume, + parameters, + cloneContextAndDetachFromParent()); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java new file mode 100644 index 0000000..d0a09eb --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommandCallBack.java @@ -0,0 +1,70 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; +import org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters; +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CloneImageGroupVolumesCommandCallBack extends CommandCallBack { + + private static final Logger log = LoggerFactory.getLogger(CloneImageGroupVolumesCommandCallBack.class); + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + boolean anyFailed = false; + int completedChildren = 0; + for (Guid childCmdId : childCmdIds) { + switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) { + case NOT_STARTED: + case ACTIVE: + log.info("Waiting on CopyVolumeData child commands to complete"); + return; + case FAILED: + case FAILED_RESTARTED: + case UNKNOWN: + anyFailed = true; + break; + default: + CommandEntity cmdEntity = CommandCoordinatorUtil.getCommandEntity(childCmdId); + if (cmdEntity.isCallBackNotified()) { + ++completedChildren; + break; + } else { + log.info("Waiting on CopyVolumeData child command to finalize"); + return; + } + } + } + + CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> command = getCommand(cmdId); + if (!anyFailed && completedChildren < command.getParameters().getImageIds().size()) { + command.performNextCopy(completedChildren); + return; + } + + command.getParameters().setTaskGroupSuccess(!anyFailed); + command.setCommandStatus(anyFailed ? CommandStatus.FAILED : CommandStatus.SUCCEEDED); + log.info("All CopyVolumeData child commands have completed for Disk '{}', status '{}'", + command.getParameters().getImageGroupID(), command.getCommandStatus()); + } + + private CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> getCommand(Guid cmdId) { + return (CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters>) CommandCoordinatorUtil.retrieveCommand(cmdId); + } + + @Override + public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + } + + @Override + public void onFailed(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java new file mode 100644 index 0000000..7a3f44d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommand.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.core.bll; + +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.common.action.CloneImageGroupVolumesCommandParameters; +import org.ovirt.engine.core.common.action.CloneImageGroupsCommandParameters; +import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.businessentities.ImageStatus; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class CloneImageGroupsCommand<T extends CloneImageGroupsCommandParameters> extends BaseImagesCommand<T> { + public CloneImageGroupsCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + public CloneImageGroupsCommand(T parameters) { + this(parameters, null); + } + + @Override + public CommandCallBack getCallBack() { + return new CloneImageGroupVolumesCommandCallBack(); + + } + + @Override + protected void executeCommand() { + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(true); + } + + private VdcActionParametersBase buildChildCommandParams(Guid imageId) { + CloneImageGroupVolumesCommandParameters params = new CloneImageGroupVolumesCommandParameters(); + params.setParentCommand(getActionType()); + params.setParentParameters(getParameters()); + return params; + } + + public void performNextCopy(int completedChildren) { + if (completedChildren == 0) { + for (Pair<DiskImage, Guid> p: getParameters().getImageGroupsWithDomains()) { + ImagesHandler.updateAllDiskImageSnapshotsStatus(p.getFirst().getId(), ImageStatus.LOCKED); + } + } + + Guid imageId = getParameters().getImageGroupsWithDomains().get(completedChildren).getFirst().getId(); + log.info("Starting child command {} of {}, image '{}'", + completedChildren + 1, getParameters().getImageGroupsWithDomains().size(), imageId); + + VdcActionParametersBase parameters = buildChildCommandParams(imageId); + persistCommand(getParameters().getParentCommand(), true); + + CommandCoordinatorUtil.executeAsyncCommand( + VdcActionType.CloneImageGroupVolumes, + parameters, + cloneContextAndDetachFromParent()); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java new file mode 100644 index 0000000..d6e1e3a --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupsCommandCallback.java @@ -0,0 +1,5 @@ +package org.ovirt.engine.core.bll; + +public class CloneImageGroupsCommandCallback { + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java index 5acfad3..0120bcd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java @@ -13,6 +13,7 @@ import org.ovirt.engine.core.bll.memory.MemoryUtils; import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator; import org.ovirt.engine.core.bll.storage.StoragePoolValidator; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; import org.ovirt.engine.core.bll.utils.ClusterUtils; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.DiskImagesValidator; @@ -59,8 +60,6 @@ import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; import org.ovirt.engine.core.utils.ovf.OvfManager; -import org.ovirt.engine.core.utils.transaction.TransactionMethod; -import org.ovirt.engine.core.utils.transaction.TransactionSupport; @DisableInPrepareMode @NonTransactiveCommandAttribute(forceCompensation = true) @@ -181,6 +180,11 @@ return true; } + @Override + public CommandCallBack getCallBack() { + return new CloneDiskWithDataCommandCallback(); + } + private boolean handleDestStorageDomain(List<DiskImage> disksList) { ensureDomainMap(disksList, getStorageDomainId()); List<DiskImage> dummiesDisksList = createDiskDummiesForSpaceValidations(disksList); @@ -226,30 +230,37 @@ @Override protected void executeCommand() { - VmHandler.lockVm(getVm().getDynamicData(), getCompensationContext()); - freeLock(); +// VmHandler.lockVm(getVm().getDynamicData(), getCompensationContext()); +// freeLock(); +// +// // update vm init +// VmHandler.updateVmInitFromDB(getVm().getStaticData(), true); +// +// // Means that there are no asynchronous tasks to execute - so we can end the command +// // immediately after the execution of the previous steps +// if (!hasSnappableDisks() && snapshotsWithMemory.isEmpty()) { +// endSuccessfully(); +// } else { +// TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { +// +// @Override +// public Void runInTransaction() { +// moveOrCopyAllImageGroups(); +// return null; +// } +// }); +// +// if (!getReturnValue().getVdsmTaskIdList().isEmpty()) { +// setSucceeded(true); +// } +// } - // update vm init - VmHandler.updateVmInitFromDB(getVm().getStaticData(), true); + moveOrCopyAllImageGroups2(); + } - // Means that there are no asynchronous tasks to execute - so we can end the command - // immediately after the execution of the previous steps - if (!hasSnappableDisks() && snapshotsWithMemory.isEmpty()) { - endSuccessfully(); - } else { - TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { - - @Override - public Void runInTransaction() { - moveOrCopyAllImageGroups(); - return null; - } - }); - - if (!getReturnValue().getVdsmTaskIdList().isEmpty()) { - setSucceeded(true); - } - } + protected void moveOrCopyAllImageGroups2() { + persistCommand(getParameters().getParentCommand(), true); + setSucceeded(true); } private boolean hasSnappableDisks() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java index fcbeff6..33dd861 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java @@ -249,8 +249,8 @@ * @param diskImages collection of DiskImages * @return list of image IDs */ - public static Collection<Guid> getDiskImageIds(Collection<DiskImage> diskImages) { - Collection<Guid> result = new ArrayList<>(); + public static List<Guid> getDiskImageIds(List<DiskImage> diskImages) { + List<Guid> result = new ArrayList<>(); if (diskImages != null) { for (DiskImage diskImage : diskImages) { result.add(diskImage.getImageId()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java new file mode 100644 index 0000000..c07b18a --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OneByOneCommandCallback.java @@ -0,0 +1,73 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; +import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack; +import org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters; +import org.ovirt.engine.core.common.businessentities.CommandEntity; +import org.ovirt.engine.core.compat.CommandStatus; +import org.ovirt.engine.core.compat.Guid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Created by laravot on 2/15/15. + */ +public abstract class OneByOneCommandCallback extends CommandCallBack { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + public void doPolling(Guid cmdId, List<Guid> childCmdIds) { + boolean anyFailed = false; + int completedChildren = 0; + for (Guid childCmdId : childCmdIds) { + switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) { + case NOT_STARTED: + case ACTIVE: + log.info("Waiting on CopyVolumeData child commands to complete"); + return; + case FAILED: + case FAILED_RESTARTED: + case UNKNOWN: + anyFailed = true; + break; + default: + CommandEntity cmdEntity = CommandCoordinatorUtil.getCommandEntity(childCmdId); + if (cmdEntity.isCallBackNotified()) { + ++completedChildren; + break; + } else { + log.info("Waiting on CopyVolumeData child command to finalize"); + return; + } + } + } + + CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> command = getCommand(cmdId); + if (!anyFailed && completedChildren < command.getParameters().getImageIds().size()) { + command.performNextCopy(completedChildren); + return; + } + + command.getParameters().setTaskGroupSuccess(!anyFailed); + command.setCommandStatus(anyFailed ? CommandStatus.FAILED : CommandStatus.SUCCEEDED); + log.info("All CopyVolumeData child commands have completed for Disk '{}', status '{}'", + command.getParameters().getImageGroupID(), command.getCommandStatus()); + } + + private CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters> getCommand(Guid cmdId) { + return (CloneImageGroupVolumesCommand<CloneImageGroupVolumesCommandParameters>) CommandCoordinatorUtil.retrieveCommand(cmdId); + } + + @Override + public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + } + + @Override + public void onFailed(Guid cmdId, List<Guid> childCmdIds) { + getCommand(cmdId).endAction(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java index b75a46a..d1032d8 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java @@ -1097,7 +1097,10 @@ MAC_POOL_EDIT_SUCCESS(10702), MAC_POOL_EDIT_FAILED(10703, AuditLogSeverity.ERROR), MAC_POOL_REMOVE_SUCCESS(10704), - MAC_POOL_REMOVE_FAILED(10705, AuditLogSeverity.ERROR); + MAC_POOL_REMOVE_FAILED(10705, AuditLogSeverity.ERROR), + + SYSTEM_CHANGE_STORAGE_POOL_STATUS_UP_REPORTING_HOSTS(10706, AuditLogSeverity.NORMAL), + SYSTEM_CHANGE_STORAGE_POOL_STATUS_NON_RESPONSIVE_NO_REPORTING_HOSTS(10707, AuditLogSeverity.ALERT); private int intValue; // indicates time interval in seconds on which identical events from same instance are suppressed. diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java index dc54867..65bebc4 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/FeatureSupported.java @@ -459,4 +459,13 @@ public static boolean migrationCompression(Version version) { return supportedInConfig(ConfigValues.MigrationCompressionSupported, version); } + + /** + * @param version + * Compatibility version to check for. + * @return <code>true</code> if data center without spm is supported for the given version + */ + public static boolean dataCenterWithoutSpm(Version version) { + return supportedInConfig(ConfigValues.DataCenterWithoutSpm, version); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java new file mode 100644 index 0000000..940b614 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java @@ -0,0 +1,24 @@ +package org.ovirt.engine.core.common.action; + +import java.util.List; + +import org.ovirt.engine.core.compat.Guid; + +public class CloneImageGroupVolumesCommandParameters extends ImagesContainterParametersBase { + private List<Guid> imageIds; + + public CloneImageGroupVolumesCommandParameters(List<Guid> images) { + this.imageIds = images; + } + + public CloneImageGroupVolumesCommandParameters() { + } + + public List<Guid> getImageIds() { + return imageIds; + } + + public void setImageIds(List<Guid> imageIds) { + this.imageIds = imageIds; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java new file mode 100644 index 0000000..0c5d827 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupsCommandParameters.java @@ -0,0 +1,27 @@ +package org.ovirt.engine.core.common.action; + +import java.util.List; +import java.util.Set; + +import org.ovirt.engine.core.common.businessentities.DiskImage; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; + +public class CloneImageGroupsCommandParameters extends ImagesContainterParametersBase { + private List<Pair<DiskImage, Guid>> imageGroupsWithDomains; + + public CloneImageGroupsCommandParameters(List<Pair<DiskImage, Guid>> imageGroupsWithDomains) { + this.imageGroupsWithDomains = imageGroupsWithDomains; + } + + public CloneImageGroupsCommandParameters() { + } + + public List<Pair<DiskImage, Guid>> getImageGroupsWithDomains() { + return imageGroupsWithDomains; + } + + public void setImageGroupsWithDomains(List<Pair<DiskImage, Guid>> imageGroupsWithDomains) { + this.imageGroupsWithDomains = imageGroupsWithDomains; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java index b5195f8..d05d5ea 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java @@ -212,7 +212,7 @@ return entityInfo; } - public void setEntityInfo(EntityInfo value) { + public void setEntityInfo(EntityInfo value) { entityInfo = value; } 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 23dc3e1..a0f06f0 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 @@ -139,6 +139,8 @@ TryBackToAllSnapshotsOfVm(223, ActionGroup.MANIPULATE_VM_SNAPSHOTS, QuotaDependency.NONE), RestoreAllSnapshots(224, ActionGroup.MANIPULATE_VM_SNAPSHOTS, QuotaDependency.STORAGE), CopyImageGroup(225, QuotaDependency.STORAGE), + CloneImageGroupVolume(226, QuotaDependency.STORAGE), + CloneImageGroupVolumes(227, QuotaDependency.STORAGE), MoveOrCopyDisk(228, QuotaDependency.STORAGE), RemoveSnapshotSingleDisk(227, QuotaDependency.STORAGE), CreateCloneOfTemplate(229, QuotaDependency.STORAGE), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java index 8650c0f..809415f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/AsyncTaskType.java @@ -4,6 +4,8 @@ unknown, copyImage, moveImage, + allocateVolume, + copyVolumeData, createVolume, deleteVolume, deleteImage, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java index 332f1e2..b4dea21 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java @@ -1975,5 +1975,9 @@ @DefaultValueAttribute("false") DefaultMigrationCompression, + @TypeConverterAttribute(Boolean.class) + @DefaultValueAttribute("true") + DataCenterWithoutSpm, + Invalid } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java index 6a9fadf..b6ccd48 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/locks/LockingGroup.java @@ -28,6 +28,8 @@ SYNC_LUNS, /** This group is used for indication that an operation is executed using the specified host */ VDS_EXECUTION, + /** This group is used for indication that a storage manipulating operation is executed on a domain */ + DOMAIN_EXECUTION, VDS_POOL_AND_STORAGE_CONNECTIONS; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java new file mode 100644 index 0000000..a3a5171 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/AllocateVolumeVDSCommandParameters.java @@ -0,0 +1,43 @@ +package org.ovirt.engine.core.common.vdscommands; + +import org.ovirt.engine.core.compat.Guid; + +public class AllocateVolumeVDSCommandParameters extends StorageDomainVdsCommandParameters { + private Guid imageGroupId; + private Guid volumeId; + private long sizeInBytes; + + public AllocateVolumeVDSCommandParameters(Guid vdsId, Guid storagePoolId, Guid storageDomainId, Guid imageGroupId, Guid volumeId, long sizeInBytes) { + super(storagePoolId, storageDomainId, vdsId); + this.imageGroupId = imageGroupId; + this.volumeId = volumeId; + this.sizeInBytes = sizeInBytes; + } + + public AllocateVolumeVDSCommandParameters() { + } + + public Guid getImageGroupId() { + return imageGroupId; + } + + public void setImageGroupId(Guid imageGroupId) { + this.imageGroupId = imageGroupId; + } + + public Guid getVolumeId() { + return volumeId; + } + + public void setVolumeId(Guid volumeId) { + this.volumeId = volumeId; + } + + public long getSizeInBytes() { + return sizeInBytes; + } + + public void setSizeInBytes(long sizeInBytes) { + this.sizeInBytes = sizeInBytes; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java new file mode 100644 index 0000000..8172840 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CopyVolumeDataVDSCommandParameters.java @@ -0,0 +1,65 @@ +package org.ovirt.engine.core.common.vdscommands; + + +import org.ovirt.engine.core.compat.Guid; + +public class CopyVolumeDataVDSCommandParameters extends StorageDomainVdsCommandParameters { + private Guid srcImageGroupId; + private Guid srcImageId; + private Guid dstStorageDomainId; + private Guid dstImageGroupId; + private Guid dstImageId; + + public CopyVolumeDataVDSCommandParameters() { + } + + public CopyVolumeDataVDSCommandParameters(Guid storagePoolId, Guid storageDomainId, Guid srcImageGroupId, + Guid srcImageId, Guid dstStorageDomainId, Guid dstImageGroupId, Guid dstImageId) { + super(storagePoolId, storageDomainId, null); + this.srcImageGroupId = srcImageGroupId; + this.srcImageId = srcImageId; + this.dstStorageDomainId = dstStorageDomainId; + this.dstImageGroupId = dstImageGroupId; + this.dstImageId = dstImageId; + } + + public Guid getSrcImageGroupId() { + return srcImageGroupId; + } + + public void setSrcImageGroupId(Guid srcImageGroupId) { + this.srcImageGroupId = srcImageGroupId; + } + + public Guid getSrcImageId() { + return srcImageId; + } + + public void setSrcImageId(Guid srcImageId) { + this.srcImageId = srcImageId; + } + + public Guid getDstStorageDomainId() { + return dstStorageDomainId; + } + + public void setDstStorageDomainId(Guid dstStorageDomainId) { + this.dstStorageDomainId = dstStorageDomainId; + } + + public Guid getDstImageGroupId() { + return dstImageGroupId; + } + + public void setDstImageGroupId(Guid dstImageGroupId) { + this.dstImageGroupId = dstImageGroupId; + } + + public Guid getDstImageId() { + return dstImageId; + } + + public void setDstImageId(Guid dstImageId) { + this.dstImageId = dstImageId; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java new file mode 100644 index 0000000..2ca8fcc --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java @@ -0,0 +1,117 @@ +package org.ovirt.engine.core.common.vdscommands; + +import org.ovirt.engine.core.common.businessentities.VolumeFormat; +import org.ovirt.engine.core.common.businessentities.VolumeType; +import org.ovirt.engine.core.compat.Guid; + +public class CreateVolumeVDSCommandParameters extends StorageDomainVdsCommandParameters { + + private long imageSizeInBytes; + private VolumeType imageType; + private Guid newImageID; + private Guid srcVolume; + private Guid srcImageGroupId; + private Guid imageGroupId; + + public CreateVolumeVDSCommandParameters(Guid storagePoolId, Guid storageDomainId, Guid imageGroupId, + long imageSizeInBytes, VolumeType imageType, VolumeFormat volFormat, Guid newImageId, + String newImageDescription) { + super(storagePoolId, storageDomainId, null); + this.imageSizeInBytes = imageSizeInBytes; + this.imageType = imageType; + this.setVolumeFormat(volFormat); + this.setImageGroupId(imageGroupId); + setNewImageID(newImageId); + setNewImageDescription(newImageDescription); + } + + public long getImageSizeInBytes() { + return imageSizeInBytes; + } + + public VolumeType getImageType() { + return imageType; + } + + private VolumeFormat privateVolumeFormat; + + public VolumeFormat getVolumeFormat() { + return privateVolumeFormat; + } + + protected void setVolumeFormat(VolumeFormat value) { + privateVolumeFormat = value; + } + + public Guid getNewImageID() { + return newImageID; + } + + protected void setNewImageID(Guid value) { + newImageID = value; + } + + private String newImageDescription; + + public String getNewImageDescription() { + return newImageDescription; + } + + protected void setNewImageDescription(String value) { + newImageDescription = value; + } + + public void setImageSizeInBytes(long imageSizeInBytes) { + this.imageSizeInBytes = imageSizeInBytes; + } + + public void setImageType(VolumeType imageType) { + this.imageType = imageType; + } + + public Guid getSrcVolume() { + return srcVolume; + } + + public void setSrcVolume(Guid srcVolume) { + this.srcVolume = srcVolume; + } + + public Guid getSrcImageGroupId() { + return srcImageGroupId; + } + + public void setSrcImageGroupId(Guid srcImageGroupId) { + this.srcImageGroupId = srcImageGroupId; + } + + public VolumeFormat getPrivateVolumeFormat() { + return privateVolumeFormat; + } + + public void setPrivateVolumeFormat(VolumeFormat privateVolumeFormat) { + this.privateVolumeFormat = privateVolumeFormat; + } + + public Guid getImageGroupId() { + return imageGroupId; + } + + public void setImageGroupId(Guid imageGroupId) { + this.imageGroupId = imageGroupId; + } + + @Override + public String toString() { + return String.format("%s, imageSizeInBytes = %s, volumeFormat = %s, newImageId = %s, " + + "newImageDescription = %s", + super.toString(), + getImageSizeInBytes(), + getVolumeFormat(), + getNewImageID(), + getNewImageDescription()); + } + + public CreateVolumeVDSCommandParameters() { + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java new file mode 100644 index 0000000..8610263 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java @@ -0,0 +1,33 @@ +package org.ovirt.engine.core.common.vdscommands; + +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainVdsCommandParameters extends VdsIdVDSCommandParametersBase { + Guid storagePoolId; + Guid storageDomainId; + + public Guid getStoragePoolId() { + return storagePoolId; + } + + public void setStoragePoolId(Guid storagePoolId) { + this.storagePoolId = storagePoolId; + } + + public Guid getStorageDomainId() { + return storageDomainId; + } + + public void setStorageDomainId(Guid storageDomainId) { + this.storageDomainId = storageDomainId; + } + + public StorageDomainVdsCommandParameters(Guid storagePoolId, Guid storageDomainId, Guid vdsId) { + super(vdsId); + this.storagePoolId = storagePoolId; + this.storageDomainId = storageDomainId; + } + + public StorageDomainVdsCommandParameters() { + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java index 2c41867..0ce058e 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java @@ -55,6 +55,9 @@ HSMGetStorageDomainInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"), HSMGetStorageDomainsList("org.ovirt.engine.core.vdsbroker.vdsbroker"), CreateImage("org.ovirt.engine.core.vdsbroker.irsbroker"), + CreateVolume("org.ovirt.engine.core.vdsbroker.vdsbroker"), + CopyVolumeData("org.ovirt.engine.core.vdsbroker.vdsbroker"), + AllocateVolume("org.ovirt.engine.core.vdsbroker.vdsbroker"), DestroyImage("org.ovirt.engine.core.vdsbroker.irsbroker"), GetImageInfo("org.ovirt.engine.core.vdsbroker.irsbroker"), SetVolumeDescription("org.ovirt.engine.core.vdsbroker.irsbroker"), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java index 22f961c..138a1c1 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VdsIdVDSCommandParametersBase.java @@ -13,6 +13,10 @@ return _vdsId; } + public void setVdsId(Guid _vdsId) { + this._vdsId = _vdsId; + } + public VdsIdVDSCommandParametersBase() { } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java index a09da95..7cfa372 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IIrsServer.java @@ -11,6 +11,9 @@ OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + OneUuidReturnForXmlRpc createVolume2(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + OneUuidReturnForXmlRpc copyImage(String sdUUID, String spUUID, String vmGUID, String srcImgGUID, String srcVolUUID, String dstImgGUID, String dstVolUUID, String descr, String dstSdUUID, int volType, int volFormat, int preallocate, String postZero, String force); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java index fe9113e..3c31d91 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java @@ -17,6 +17,7 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.BusinessEntitiesDefinitions; @@ -164,6 +165,16 @@ TimeUnit.SECONDS); } + + private void updateStoragePoolStatus(StoragePool pool, StoragePoolStatus status, AuditLogType auditLogType, VdcBllErrors error) { + ResourceManager + .getInstance() + .getEventListener() + .storagePoolStatusChange(pool.getId(), status, + auditLogType, + error); + } + @OnTimerMethodAnnotation("_updatingTimer_Elapsed") public void _updatingTimer_Elapsed() { try { @@ -172,6 +183,7 @@ StoragePool storagePool = DbFacade.getInstance().getStoragePoolDao() .get(_storagePoolId); + boolean poolStatusDeterminedByHostsStatus = FeatureSupported.dataCenterWithoutSpm(storagePool.getcompatibility_version()); if (storagePool != null) { // when there are no hosts in status up, it means that there shouldn't be domain monitoring // so all the domains need to move to "unknown" status as otherwise their status won't change. @@ -182,11 +194,23 @@ StoragePoolDomainHelper.updateApplicablePoolDomainsStatuses(_storagePoolId, StoragePoolDomainHelper.storageDomainMonitoredStatus, StorageDomainStatus.Unknown, "no reporting hosts"); + if (poolStatusDeterminedByHostsStatus) { + updateStoragePoolStatus(storagePool, StoragePoolStatus.NonResponsive, + AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_NON_RESPONSIVE_NO_REPORTING_HOSTS, + VdcBllErrors.ENGINE); + } + } else { + if (poolStatusDeterminedByHostsStatus) { + updateStoragePoolStatus(storagePool, StoragePoolStatus.Up, + AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_UP_REPORTING_HOSTS, + null); + } } - if (storagePool.getStatus() == StoragePoolStatus.Up - || storagePool.getStatus() == StoragePoolStatus.NonResponsive || storagePool - .getStatus() == StoragePoolStatus.Contend) { + if (!poolStatusDeterminedByHostsStatus && + storagePool.getStatus() == StoragePoolStatus.Up || + storagePool.getStatus() == StoragePoolStatus.NonResponsive || + storagePool.getStatus() == StoragePoolStatus.Contend) { proceedStoragePoolStats(storagePool); } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java index 1b7c709..285562c 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerConnector.java @@ -9,6 +9,13 @@ public Map<String, Object> createVolume(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + public Map<String, Object> createVolume2(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + public Map<String, Object> copyVolumeData(String sdUUID, String spUUID, String imgGUID, String volUUID, String dstSdUUID, + String dstImgGUID, String dstVolUUID); + public Map<String, Object> copyImage(String sdUUID, String spUUID, String vmGUID, String srcImgGUID, String srcVolUUID, String dstImgGUID, String dstVolUUID, String descr); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java index 7388e88..0649213 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsServerWrapper.java @@ -30,6 +30,15 @@ } @Override + public OneUuidReturnForXmlRpc createVolume2(String sdUUID, String spUUID, String imgGUID, String size, + int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID) { + Map<String, Object> xmlRpcReturnValue = irsServer.createVolume2(sdUUID, spUUID, imgGUID, size, volFormat, + volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID); + OneUuidReturnForXmlRpc wrapper = new OneUuidReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } + + @Override public OneUuidReturnForXmlRpc copyImage(String sdUUID, String spUUID, String vmGUID, String srcImgGUID, String srcVolUUID, String dstImgGUID, String dstVolUUID, String descr, String dstSdUUID, int volType, int volFormat, int preallocate, String postZero, String force) { diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java index ab8b3a9..ad67af5 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java @@ -63,6 +63,37 @@ return new OneUuidReturnForXmlRpc(response); } + + @Override + public OneUuidReturnForXmlRpc createVolume2(String sdUUID, + String spUUID, + String imgGUID, + String size, + int volFormat, + int volType, + int diskType, + String volUUID, + String descr, + String srcImgGUID, + String srcVolUUID) { + JsonRpcRequest request = + new RequestBuilder("Volume.create").withParameter("volumeID", volUUID) + .withParameter("storagepoolID", spUUID) + .withParameter("storagedomainID", sdUUID) + .withParameter("imageID", imgGUID) + .withParameter("size", size) + .withParameter("volFormat", volFormat) + .withParameter("preallocate", volType) + .withParameter("diskType", diskType) + .withParameter("desc", descr) + .withParameter("srcImgUUID", srcImgGUID) + .withParameter("srcVolUUID", srcVolUUID) + .build(); + Map<String, Object> response = + new FutureMap(this.client, request).withResponseKey("uuid"); + return new OneUuidReturnForXmlRpc(response); + } + @Override public OneUuidReturnForXmlRpc copyImage(String sdUUID, String spUUID, diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java index 9e970e4..523bc61 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcVdsServer.java @@ -105,6 +105,98 @@ } @Override + public OneUuidReturnForXmlRpc createVolume(String sdUUID, + String spUUID, + String imgGUID, + String size, + int volFormat, + int volType, + int diskType, + String volUUID, + String descr, + String srcImgGUID, + String srcVolUUID) { + JsonRpcRequest request = + new RequestBuilder("Volume.create").withParameter("volumeID", volUUID) + .withParameter("storagepoolID", spUUID) + .withParameter("storagedomainID", sdUUID) + .withParameter("imageID", imgGUID) + .withParameter("size", size) + .withParameter("volFormat", volFormat) + .withParameter("preallocate", volType) + .withParameter("diskType", diskType) + .withParameter("desc", descr) + .withParameter("srcImgUUID", srcImgGUID) + .withParameter("srcVolUUID", srcVolUUID) + .build(); + Map<String, Object> response = + new FutureMap(this.client, request).withResponseKey("uuid"); + return new OneUuidReturnForXmlRpc(response); + } + + @Override + public OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, String imgGUID, String volUUID, String size) { + JsonRpcRequest request = + new RequestBuilder("Volume.allocate").withParameter("volumeID", volUUID) + .withParameter("storagepoolID", spUUID) + .withParameter("storagedomainID", sdUUID) + .withParameter("imageID", imgGUID) + .withParameter("size", size) + .build(); + Map<String, Object> response = + new FutureMap(this.client, request).withResponseKey("uuid"); + return new OneUuidReturnForXmlRpc(response); + } + + @Override + public OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, String imgGUID, String volUUID, String dstSdUUID, + String dstImgGUID, String dstVolUUID) { + JsonRpcRequest request = + new RequestBuilder("Volume.copyVolumeData").withParameter("volumeID", volUUID) + .withParameter("storagepoolID", spUUID) + .withParameter("storagedomainID", sdUUID) + .withParameter("imageID", imgGUID) + .withParameter("dstSdUUID", dstSdUUID) + .withParameter("dstImgGUID", dstImgGUID) + .withParameter("dstVolUUID", dstVolUUID) + .build(); + Map<String, Object> response = + new FutureMap(this.client, request).withResponseKey("uuid"); + return new OneUuidReturnForXmlRpc(response); + } + + + @Override + public StatusOnlyReturnForXmlRpc createVolume2(String sdUUID, + String spUUID, + String imgGUID, + String size, + int volFormat, + int volType, + int diskType, + String volUUID, + String descr, + String srcImgGUID, + String srcVolUUID) { + JsonRpcRequest request = + new RequestBuilder("Volume.create2").withParameter("volumeID", volUUID) + .withParameter("storagepoolID", spUUID) + .withParameter("storagedomainID", sdUUID) + .withParameter("imageID", imgGUID) + .withParameter("size", size) + .withParameter("volFormat", volFormat) + .withParameter("preallocate", volType) + .withParameter("diskType", diskType) + .withParameter("desc", descr) + .withParameter("srcImgUUID", srcImgGUID) + .withParameter("srcVolUUID", srcVolUUID) + .build(); + Map<String, Object> response = + new FutureMap(this.client, request).withResponseKey("uuid"); + return new StatusOnlyReturnForXmlRpc(response); + } + + @Override public StatusOnlyReturnForXmlRpc destroy(String vmId) { JsonRpcRequest request = new RequestBuilder("VM.destroy").withParameter("vmID", vmId).build(); Map<String, Object> response = new FutureMap(this.client, request); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java new file mode 100644 index 0000000..dd6bb89 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/AllocateVolumeVDSCommand.java @@ -0,0 +1,44 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + + +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; +import org.ovirt.engine.core.common.vdscommands.AllocateVolumeVDSCommandParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc; + +public class AllocateVolumeVDSCommand<P extends AllocateVolumeVDSCommandParameters> extends VdsBrokerCommand<P> { + OneUuidReturnForXmlRpc uuidReturn; + public AllocateVolumeVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected void executeVdsBrokerCommand() { + log.info("-- executeDomainCommand: calling 'allocateVolume'"); + uuidReturn = getBroker().allocateVolume( + getParameters().getStoragePoolId().toString(), + getParameters().getStorageDomainId().toString(), + getParameters().getImageGroupId().toString(), + getParameters().getVolumeId().toString(), + Long.valueOf(getParameters().getSizeInBytes()).toString()); + + proceedProxyReturnValue(); + + Guid taskID = new Guid(uuidReturn.mUuid); + + getVDSReturnValue().setCreationInfo( + new AsyncTaskCreationInfo(taskID, AsyncTaskType.allocateVolume, getParameters() + .getStoragePoolId())); + } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return uuidReturn.mStatus; + } + + @Override + protected Object getReturnValueFromBroker() { + return uuidReturn; + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java new file mode 100644 index 0000000..281ecb6 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java @@ -0,0 +1,46 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; +import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; +import org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc; + +public class CopyVolumeDataVDSCommand<P extends CopyVolumeDataVDSCommandParameters> extends VdsBrokerCommand<P> { + OneUuidReturnForXmlRpc uuidReturn; + public CopyVolumeDataVDSCommand(P parameters) { + super(parameters); + } + + @Override + protected void executeVdsBrokerCommand() { + log.info("-- executeDomainCommand: calling 'allocateCopyVolumeData'"); +// uuidReturn = getBroker().copyVolumeData( +// getParameters().getStorageDomainId().toString(), +// getParameters().getStoragePoolId().toString(), +// getParameters().getSrcImageGroupId().toString(), +// getParameters().getSrcImageId().toString(), +// getParameters().getDstStorageDomainId().toString(), +// getParameters().getDstImageGroupId().toString(), +// getParameters().getDstImageId().toString()); + +// proceedProxyReturnValue(); + +// Guid taskID = new Guid(uuidReturn.mUuid); + + Guid taskID = Guid.newGuid(); + getVDSReturnValue().setCreationInfo( + new AsyncTaskCreationInfo(taskID, AsyncTaskType.copyVolumeData, getParameters() + .getStoragePoolId())); + } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return uuidReturn.mStatus; + } + + @Override + protected Object getReturnValueFromBroker() { + return uuidReturn; + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java new file mode 100644 index 0000000..6b520d7 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CreateVolumeVDSCommand.java @@ -0,0 +1,74 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import org.ovirt.engine.core.common.vdscommands.CreateVolumeVDSCommandParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.storage.StorageDomainHelper; + +public class CreateVolumeVDSCommand<P extends CreateVolumeVDSCommandParameters> extends StorageDomainMetadataCommand<P> { + public CreateVolumeVDSCommand(P parameters) { + super(parameters); + } + +// protected String mCreatedImageId = ""; +// protected OneUuidReturnForXmlRpc uuidReturn; +// +// @Override +// protected StatusForXmlRpc getReturnStatus() { +// return uuidReturn.mStatus; +// } +// +// @Override +// protected Object getReturnValueFromBroker() { +// return uuidReturn; +// } + + @Override + protected void executeDomainCommand() { + { + StorageDomainHelper.checkNumberOfLVsForBlockDomain(getParameters().getStorageDomainId()); + setReturnValue(Guid.Empty); + + log.info("-- executeIrsBrokerCommand: calling 'createVolume'"); + // NOTE: The 'uuidReturn' variable will contain the taskID and not the + // created image id! +// uuidReturn = getBroker().createVolume( +// getParameters().getStorageDomainId().toString(), +// getParameters().getStoragePoolId().toString(), +// getParameters().getImageGroupId().toString(), +// (Long.valueOf(getParameters().getImageSizeInBytes())).toString(), +// getParameters().getVolumeFormat().getValue(), +// getParameters().getImageType().getValue(), +// 2, +// getParameters().getNewImageID().toString(), +// getParameters().getNewImageDescription(), Guid.Empty.toString(), +// Guid.Empty.toString()); +// +// proceedProxyReturnValue(); +// +// Guid taskID = new Guid(uuidReturn.mUuid); +// +// String mCreatedImageId = getParameters().getNewImageID().toString(); +// setReturnValue(getParameters().getNewImageID().toString()); +// +// getVDSReturnValue().setCreationInfo( +// new AsyncTaskCreationInfo(taskID, AsyncTaskType.createVolume, getParameters() +// .getStoragePoolId())); + + status = getBroker().createVolume2( + getParameters().getStorageDomainId().toString(), + getParameters().getStoragePoolId().toString(), + getParameters().getImageGroupId().toString(), + (Long.valueOf(getParameters().getImageSizeInBytes())).toString(), + getParameters().getVolumeFormat().getValue(), + getParameters().getImageType().getValue(), + 2, + getParameters().getNewImageID().toString(), + getParameters().getNewImageDescription(), Guid.Empty.toString(), + Guid.Empty.toString()); + + proceedProxyReturnValue(); + + setReturnValue(getParameters().getNewImageID().toString()); + } + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java index 92619fa..5050017 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java @@ -32,6 +32,17 @@ OneVmReturnForXmlRpc create(Map createInfo); + OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + StatusOnlyReturnForXmlRpc createVolume2(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, String imgGUID, String volUUID, String dstSdUUID, + String dstImgGUID, String dstVolUUID); + + OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, String imgGUID, String volUUID, String size); + StatusOnlyReturnForXmlRpc destroy(String vmId); StatusOnlyReturnForXmlRpc shutdown(String vmId, String timeout, String message); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java new file mode 100644 index 0000000..3624935 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java @@ -0,0 +1,175 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import java.lang.reflect.UndeclaredThrowableException; +import java.net.SocketException; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import org.apache.commons.lang.exception.ExceptionUtils; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSStatus; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.errors.VDSError; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllErrors; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.locks.LockingGroup; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.common.vdscommands.StorageDomainVdsCommandParameters; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.utils.lock.EngineLock; +import org.ovirt.engine.core.utils.lock.LockManager; +import org.ovirt.engine.core.utils.lock.LockManagerFactory; +import org.ovirt.engine.core.utils.log.LoggedUtils; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSErrorException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSGenericException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSNonOperationalException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSProtocolException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSStoragePoolStatusException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IRSUnicodeArgumentException; +import org.ovirt.engine.core.vdsbroker.irsbroker.IrsOperationFailedNoFailoverException; +import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException; + +public abstract class StorageDomainMetadataCommand<P extends StorageDomainVdsCommandParameters> extends VdsBrokerCommand<P> { + + private List<VDS> hosts; + private int failover; + + public StorageDomainMetadataCommand(P parameters) { + super(parameters); + } + + protected void selectHost() { + if (getParameters().getVdsId() != null) { + return; + } + + if (!getHostsForOperation().isEmpty()) { + VDS selectedHost = getHostsForOperation().remove(new Random().nextInt(getHostsForOperation().size())); + getParameters().setVdsId(selectedHost.getId()); + } + + if (getParameters().getVdsId() == null) { + throw new VdcBLLException(VdcBllErrors.RESOURCE_MANAGER_VDS_NOT_FOUND, + String.format("No host was found to perform the operation")); + } + } + + @Override + protected void executeVdsBrokerCommand() { + LockManager lockManager = LockManagerFactory.getLockManager(); + EngineLock domainLock = buildLock(getParameters().getStorageDomainId(), LockingGroup.DOMAIN_EXECUTION); + try { + getLockManager().acquireLockWait(domainLock); + executeDomainCommand(); + } finally { + lockManager.releaseLock(domainLock); + } + } + + protected void failover() { + if (failover < Config + .<Integer> getValue(ConfigValues.SpmCommandFailOverRetries)) { + getParameters().setVdsId(null); + failover++; + executeCommand(); + } else { + log.error("reached failover limit"); + getVDSReturnValue().setSucceeded(false); + } + } + + private void logException(Throwable ex) { + log.error("IrsBroker::Failed::{}: {}", getCommandName(), ex.getMessage()); + log.debug("Exception", ex); + } + + @Override + protected void executeVDSCommand() { + selectHost(); + initVdsBroker(getParameters().getVdsId()); + try { + executeDomainCommand(); + } + catch (UndeclaredThrowableException ex) { + getVDSReturnValue().setExceptionString(ex.toString()); + getVDSReturnValue().setExceptionObject(ex); + getVDSReturnValue().setVdsError(new VDSError(VdcBllErrors.VDS_NETWORK_ERROR, ex.getMessage())); + if (ExceptionUtils.getRootCause(ex) != null) { + logException(ExceptionUtils.getRootCause(ex)); + } else { + LoggedUtils.logError(log, LoggedUtils.getObjectId(this), this, ex); + } + failover(); + } catch (XmlRpcRunTimeException ex) { + getVDSReturnValue().setExceptionString(ex.toString()); + getVDSReturnValue().setExceptionObject(ex); + if (ex.isNetworkError()) { + log.error("IrsBroker::Failed::{} - network exception.", getCommandName()); + getVDSReturnValue().setSucceeded(false); + } else { + log.error("IrsBroker::Failed::{}", getCommandName()); + LoggedUtils.logError(log, LoggedUtils.getObjectId(this), this, ex); + throw new IRSProtocolException(ex); + } + } catch (IRSUnicodeArgumentException ex) { + throw new IRSGenericException("UNICODE characters are not supported.", ex); + } catch (IRSStoragePoolStatusException | IrsOperationFailedNoFailoverException ex) { + throw ex; + } catch (IRSNonOperationalException ex) { + getVDSReturnValue().setExceptionString(ex.toString()); + getVDSReturnValue().setExceptionObject(ex); + getVDSReturnValue().setVdsError(ex.getVdsError()); + logException(ex); + failover(); + } catch (IRSErrorException ex) { + getVDSReturnValue().setExceptionString(ex.toString()); + getVDSReturnValue().setExceptionObject(ex); + getVDSReturnValue().setVdsError(ex.getVdsError()); + logException(ex); + if (log.isDebugEnabled()) { + LoggedUtils.logError(log, LoggedUtils.getObjectId(this), this, ex); + } + failover(); + } catch (RuntimeException ex) { + getVDSReturnValue().setExceptionString(ex.toString()); + getVDSReturnValue().setExceptionObject(ex); + if (ex instanceof VDSExceptionBase) { + getVDSReturnValue().setVdsError(((VDSExceptionBase) ex).getVdsError()); + } + if (ExceptionUtils.getRootCause(ex) != null && + ExceptionUtils.getRootCause(ex) instanceof SocketException) { + logException(ExceptionUtils.getRootCause(ex)); + } else { + LoggedUtils.logError(log, LoggedUtils.getObjectId(this), this, ex); + } + // always failover because of changes in vdsm error, until we + // realize what to do in each case: + failover(); + } + } + + private EngineLock buildLock(Guid id, LockingGroup lockingGroup) { + return new EngineLock(null, + Collections.singletonMap(id.toString(), new Pair<>(lockingGroup.toString(), VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString()))); + } + + private List<VDS> getHostsForOperation() { + if (hosts == null) { + hosts = DbFacade.getInstance() + .getVdsDao() + .getAllForStoragePoolAndStatus(getParameters().getStoragePoolId(), VDSStatus.Up); + } + + return hosts; + } + + private LockManager getLockManager() { + return LockManagerFactory.getLockManager(); + } + + protected abstract void executeDomainCommand(); +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java index 8a3f24d..d5cf7a1 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerCommand.java @@ -1,5 +1,8 @@ package org.ovirt.engine.core.vdsbroker.vdsbroker; +import javax.enterprise.event.Event; +import javax.inject.Inject; + import org.apache.commons.lang.exception.ExceptionUtils; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VdsStatic; @@ -13,11 +16,8 @@ import org.ovirt.engine.core.vdsbroker.VdsManager; import org.ovirt.engine.core.vdsbroker.xmlrpc.XmlRpcRunTimeException; -import javax.enterprise.event.Event; -import javax.inject.Inject; - public abstract class VdsBrokerCommand<P extends VdsIdVDSCommandParametersBase> extends BrokerCommandBase<P> { - private final IVdsServer mVdsBroker; + private IVdsServer mVdsBroker; private VdsStatic vdsStatic; private VDS vds; @Inject @@ -30,7 +30,13 @@ */ public VdsBrokerCommand(P parameters) { super(parameters); - mVdsBroker = initializeVdsBroker(parameters.getVdsId()); + initVdsBroker(getParameters().getVdsId()); + } + + protected void initVdsBroker(Guid id) { + if (id != null) { + mVdsBroker = initializeVdsBroker(id); + } } /** diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java index e97444b..eac6095 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerConnector.java @@ -6,6 +6,17 @@ public interface VdsServerConnector { public Map<String, Object> create(Map createInfo); + public Map<String, Object> createVolume(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + public Map<String, Object> createVolume2(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, + int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID); + + public Map<String, Object> copyVolumeData(String sdUUID, String spUUID, String imgGUID, String volUUID, String dstSdUUID, + String dstImgGUID, String dstVolUUID); + + public Map<String, Object> allocateVolume(String spUUID, String sdUUID, String imgGUID, String volUUID, String size); + public Map<String, Object> destroy(String vmId); public Map<String, Object> shutdown(String vmId, String timeout, String message); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java index d027b50..4a42f7c 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java @@ -56,6 +56,40 @@ } @Override + public OneUuidReturnForXmlRpc createVolume(String sdUUID, String spUUID, String imgGUID, String size, + int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID) { + Map<String, Object> xmlRpcReturnValue = vdsServer.createVolume(sdUUID, spUUID, imgGUID, size, volFormat, + volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID); + OneUuidReturnForXmlRpc wrapper = new OneUuidReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } + + @Override + public StatusOnlyReturnForXmlRpc createVolume2(String sdUUID, String spUUID, String imgGUID, String size, + int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID) { + Map<String, Object> xmlRpcReturnValue = vdsServer.createVolume2(sdUUID, spUUID, imgGUID, size, volFormat, + volType, diskType, volUUID, descr, srcImgGUID, srcVolUUID); + StatusOnlyReturnForXmlRpc wrapper = new StatusOnlyReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } + + @Override + public OneUuidReturnForXmlRpc copyVolumeData(String sdUUID, String spUUID, String imgGUID, String volUUID, String dstSdUUID, + String dstImgGUID, String dstVolUUID) { + Map<String, Object> xmlRpcReturnValue = vdsServer.copyVolumeData(sdUUID, spUUID, imgGUID, volUUID, dstSdUUID, + dstImgGUID, dstVolUUID); + OneUuidReturnForXmlRpc wrapper = new OneUuidReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } + + @Override + public OneUuidReturnForXmlRpc allocateVolume(String spUUID, String sdUUID, String imgGUID, String volUUID, String size) { + Map<String, Object> xmlRpcReturnValue = vdsServer.allocateVolume(sdUUID, spUUID, imgGUID, volUUID, size); + OneUuidReturnForXmlRpc wrapper = new OneUuidReturnForXmlRpc(xmlRpcReturnValue); + return wrapper; + } + + @Override public StatusOnlyReturnForXmlRpc destroy(String vmId) { try { Map<String, Object> xmlRpcReturnValue = vdsServer.destroy(vmId); diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql index 90b6e02..b347d98 100644 --- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql +++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql @@ -210,6 +210,7 @@ select fn_db_add_config_value_for_versions_up_to('SerialNumberPolicySupported', 'false', '3.4'); select fn_db_add_config_value_for_versions_up_to('OvfStoreOnAnyDomain', 'false', '3.4'); +select fn_db_add_config_value_for_versions_up_to('DataCenterWithoutSpm', 'false', '3.5'); select fn_db_add_config_value_for_versions_up_to('BootMenuSupported', 'false', '3.4'); select fn_db_add_config_value_for_versions_up_to('IscsiMultipathingSupported', 'false', '3.3'); -- To view, visit http://gerrit.ovirt.org/37807 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I38c65fc154292edf571620eb7d68c205b7466463 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Aravot <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches