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

Reply via email to