Sahina Bose has uploaded a new change for review. Change subject: engine:[WIP] Rebalance Gluster volume command ......................................................................
engine:[WIP] Rebalance Gluster volume command Rebalance gluster volume is an asynchronous operation started from the console. Calling this command starts an async task in gluster. Gluster returns a task-id that is used to monitor status of the task and update the UI. RebalanceGlusterVolumeCommand extends from GlusterAsyncCommandBase that handles return of task information from Gluster and updating corresponding step. Enabled Rebalance Volume in the UI VolumeListModel Change-Id: Iaae7cf53bd77e9b717b268bcf0de91ba515af40c Signed-off-by: Sahina Bose <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/RebalanceGlusterVolumeCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StartRebalanceGlusterVolumeCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/StartRebalanceGlusterVolumeVDSCommand.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GlusterTaskInfoReturnForXmlRpc.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/IVdsServer.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsServerWrapper.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java 9 files changed, 148 insertions(+), 10 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/89/12389/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/RebalanceGlusterVolumeCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/RebalanceGlusterVolumeCommand.java new file mode 100644 index 0000000..22e11b2 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/RebalanceGlusterVolumeCommand.java @@ -0,0 +1,86 @@ +package org.ovirt.engine.core.bll.gluster; + +import org.ovirt.engine.core.bll.Backend; +import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRebalanceParameters; +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType; +import org.ovirt.engine.core.common.job.StepEnum; +import org.ovirt.engine.core.common.vdscommands.VDSCommandType; +import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; +import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeRebalanceVDSParameters; +import org.ovirt.engine.core.dal.VdcBllMessages; + +/** + * BLL command to Rebalance Gluster volume + * This command starts an asynchronous gluster task to start rebalance of volume. + * This may be a long running operation and so the returned task id is used to update + * the status of the step and the corresponding job. + */ +@NonTransactiveCommandAttribute +public class RebalanceGlusterVolumeCommand extends GlusterAsyncCommandBase<GlusterVolumeRebalanceParameters> { + + private static final long serialVersionUID = 8747137699199502912L; + + public RebalanceGlusterVolumeCommand(GlusterVolumeRebalanceParameters params) { + super(params); + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REBALANCE_START); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__GLUSTER_VOLUME); + } + + @Override + protected boolean canDoAction() { + GlusterVolumeEntity glusterVolume = getGlusterVolume(); + if (!super.canDoAction()) { + return false; + } + + if (!glusterVolume.isOnline()) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SHOULD_BE_STARTED); + return false; + } + + if ((glusterVolume.getVolumeType() == GlusterVolumeType.REPLICATE && glusterVolume.getBricks().size() <= glusterVolume.getReplicaCount()) + || (glusterVolume.getVolumeType() == GlusterVolumeType.STRIPE && glusterVolume.getBricks().size() <= glusterVolume.getStripeCount()) + || (glusterVolume.getBricks().size() == 1)) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_BRICKS_ARE_NOT_DISTRIBUTED); + return false; + } + return true; + } + + @Override + protected StepEnum getStepType() { + return StepEnum.REBALANCING_VOLUME; + } + + @Override + protected GlusterAsyncTask executeAndReturnTask() { + VDSReturnValue taskReturn = Backend.getInstance().getResourceManager() + .RunVdsCommand(VDSCommandType.StartRebalanceGlusterVolume, + new GlusterVolumeRebalanceVDSParameters(upServer.getId(), + getGlusterVolumeName(), getParameters().isFixLayoutOnly(), getParameters().isForceAction())); + setSucceeded(taskReturn.getSucceeded()); + if (getSucceeded()) { + return (GlusterAsyncTask)taskReturn.getReturnValue(); + } + return null; + } + + @Override + public AuditLogType getAuditLogTypeValue() { + if (getSucceeded()) { + return AuditLogType.GLUSTER_VOLUME_REBALANCE_START; + } else { + return errorType == null ? AuditLogType.GLUSTER_VOLUME_REBALANCE_START_FAILED : errorType; + } + } + + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StartRebalanceGlusterVolumeCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StartRebalanceGlusterVolumeCommand.java index 5b7ba17..6741103 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StartRebalanceGlusterVolumeCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StartRebalanceGlusterVolumeCommand.java @@ -56,8 +56,9 @@ VDSCommandType.StartRebalanceGlusterVolume, new GlusterVolumeRebalanceVDSParameters(upServer.getId(), getGlusterVolumeName(), getParameters().isFixLayoutOnly(), getParameters().isForceAction())); + setSucceeded(returnValue.getSucceeded()); if (getSucceeded()) { - setSucceeded(returnValue.getSucceeded()); + setActionReturnValue(returnValue.getReturnValue()); } else { handleVdsError(AuditLogType.GLUSTER_VOLUME_REBALANCE_START_FAILED, returnValue.getVdsError().getMessage()); return; 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 203cba3..478f29b 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 @@ -261,6 +261,7 @@ StartGlusterVolumeProfile(1410, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), StopGlusterVolumeProfile(1411, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), RemoveGlusterServer(1412, ActionGroup.DELETE_HOST, QuotaDependency.NONE), + RebalanceGlusterVolume(1413, ActionGroup.MANIPULATE_GLUSTER_VOLUME, QuotaDependency.NONE), // External events AddExternalEvent(1500, ActionGroup.INJECT_EXTERNAL_EVENTS, QuotaDependency.NONE), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties index 721a12f..56bc1bb 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/ExecutionMessages.properties @@ -107,6 +107,7 @@ # Gluster step types step.SETTING_GLUSTER_OPTION=Setting option ${Key}=${Value} on volume ${GlusterVolume} of cluster ${Cluster} +step.REBALANCING_VOLUME=Rebalancing ${GlusterVolume} volume of ${Cluster}.( ${Status} ${info}) # Non-monitored job: job.AddVmInterface=Adding Network Interface ${InterfaceName} to VM ${VM} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/StartRebalanceGlusterVolumeVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/StartRebalanceGlusterVolumeVDSCommand.java index 9aad3cc..62f1cbf 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/StartRebalanceGlusterVolumeVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/gluster/StartRebalanceGlusterVolumeVDSCommand.java @@ -1,19 +1,43 @@ package org.ovirt.engine.core.vdsbroker.gluster; +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeRebalanceVDSParameters; +import org.ovirt.engine.core.vdsbroker.vdsbroker.GlusterTaskInfoReturnForXmlRpc; +import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusForXmlRpc; public class StartRebalanceGlusterVolumeVDSCommand<P extends GlusterVolumeRebalanceVDSParameters> extends AbstractGlusterBrokerCommand<P> { + private GlusterTaskInfoReturnForXmlRpc glusterTaskReturn; + private GlusterAsyncTask task; + public StartRebalanceGlusterVolumeVDSCommand(P parameters) { super(parameters); } @Override protected void ExecuteVdsBrokerCommand() { - status = - getBroker().glusterVolumeRebalanceStart(getParameters().getVolumeName(), - getParameters().isFixLayoutOnly(), - getParameters().isForceAction()); + //VDSM does not support task return yet + glusterTaskReturn = getBroker().glusterVolumeRebalanceStart(getParameters().getVolumeName(), + getParameters().isFixLayoutOnly(), + getParameters().isForceAction()); + task = glusterTaskReturn.getGlusterTask(); + //TODO : REMOVE TEMPORARY HACK + //task = new GlusterAsyncTask(); + //task.setTaskId(Guid.NewGuid()); + setReturnValue(task); ProceedProxyReturnValue(); } + + @Override + protected StatusForXmlRpc getReturnStatus() { + return glusterTaskReturn.mStatus; + } + + @Override + public Object getReturnValue() { + return task; + } + + + } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GlusterTaskInfoReturnForXmlRpc.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GlusterTaskInfoReturnForXmlRpc.java new file mode 100644 index 0000000..a814284 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GlusterTaskInfoReturnForXmlRpc.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import java.util.Map; + +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturnForXmlRpc; + +public class GlusterTaskInfoReturnForXmlRpc extends StatusReturnForXmlRpc { + private static final String TASK_ID = "taskId"; + private final GlusterAsyncTask glusterTask = new GlusterAsyncTask(); + + public GlusterTaskInfoReturnForXmlRpc(Map<String, Object> innerMap) { + super(innerMap); + //TODO: return a GlusterTask from the map, VDSM yet to implement all the return values + if (innerMap.containsKey(TASK_ID)) { + glusterTask.setTaskId(Guid.createGuidFromString((String)innerMap.get(TASK_ID))); + } + } + + public GlusterAsyncTask getGlusterTask() { + return glusterTask; + } + +} 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 d8f0ba3..d28be28 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 @@ -221,7 +221,7 @@ int replicaCount, int stripeCount); - StatusOnlyReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force); + GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force); StatusOnlyReturnForXmlRpc glusterVolumeReplaceBrickStart(String volumeName, String existingBrickDir, 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 13ea1f6..1476541 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 @@ -1073,9 +1073,9 @@ } @Override - public StatusOnlyReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force) { + public GlusterTaskInfoReturnForXmlRpc glusterVolumeRebalanceStart(String volumeName, Boolean fixLayoutOnly, Boolean force) { try { - return new StatusOnlyReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName, fixLayoutOnly, force)); + return new GlusterTaskInfoReturnForXmlRpc(vdsServer.glusterVolumeRebalanceStart(volumeName, fixLayoutOnly, force)); } catch (UndeclaredThrowableException ute) { throw new XmlRpcRunTimeException(ute); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java index cad6183..05a60a6 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/volumes/VolumeListModel.java @@ -130,7 +130,7 @@ setStopCommand(new UICommand("Stop", this)); //$NON-NLS-1$ setRebalanceCommand(new UICommand("Rebalance", this)); //$NON-NLS-1$ setOptimizeForVirtStoreCommand(new UICommand("OptimizeForVirtStore", this)); //$NON-NLS-1$ - getRebalanceCommand().setIsAvailable(false); + getRebalanceCommand().setIsAvailable(true); getRemoveVolumeCommand().setIsExecutionAllowed(false); getStartCommand().setIsExecutionAllowed(false); @@ -406,7 +406,7 @@ GlusterVolumeEntity volume = (GlusterVolumeEntity) item; list.add(new GlusterVolumeRebalanceParameters(volume.getId(), false, false)); } - Frontend.RunMultipleAction(VdcActionType.StartRebalanceGlusterVolume, list); + Frontend.RunMultipleAction(VdcActionType.RebalanceGlusterVolume, list); } private void optimizeForVirtStore() { -- To view, visit http://gerrit.ovirt.org/12389 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaae7cf53bd77e9b717b268bcf0de91ba515af40c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sahina Bose <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
