Alexander Wels has uploaded a new change for review.

Change subject: engine, webadmin: synchronous multiple action
......................................................................

engine, webadmin: synchronous multiple action

- Added a 'synchronous' version of run multiple actions to allow
  the frontend combine multiple single actions into one request and
  wait for the result of all of them. At the same time not disturb
  existing multiple actions that do NOT wait for the results.

Change-Id: I935f4257e731de719540db9d79d5865537be228d
Signed-off-by: Alexander Wels <aw...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageDomainsMultipleActionRunner.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/interfaces/BackendLocal.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperation.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java
M 
frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/FrontendActionTest.java
M 
frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProviderTest.java
11 files changed, 182 insertions(+), 68 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/32/23032/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
index 675ba69..349bd2b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
@@ -20,6 +20,7 @@
 import org.apache.commons.collections.KeyValue;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
+import org.ovirt.engine.core.bll.attestationbroker.AttestThread;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import 
org.ovirt.engine.core.bll.interceptors.ThreadLocalSessionCleanerInterceptor;
 import org.ovirt.engine.core.bll.interfaces.BackendCommandObjectsHandler;
@@ -74,7 +75,6 @@
 import org.ovirt.engine.core.utils.log.LogFactory;
 import org.ovirt.engine.core.utils.osinfo.OsInfoPreferencesLoader;
 import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
-import org.ovirt.engine.core.bll.attestationbroker.AttestThread;
 
 // Here we use a Singleton Bean
 // The @Startup annotation is to make sure the bean is initialized on startup.
@@ -505,13 +505,19 @@
     @Override
     public ArrayList<VdcReturnValueBase> runMultipleActions(VdcActionType 
actionType,
             ArrayList<VdcActionParametersBase> parameters, boolean 
isRunOnlyIfAllCanDoPass) {
+        return runMultipleActions(actionType, parameters, 
isRunOnlyIfAllCanDoPass, false);
+    }
+
+    @Override
+    public ArrayList<VdcReturnValueBase> runMultipleActions(VdcActionType 
actionType,
+            ArrayList<VdcActionParametersBase> parameters, boolean 
isRunOnlyIfAllCanDoPass, boolean waitForResult) {
         VdcReturnValueBase returnValue = notAllowToRunAction(actionType);
         if (returnValue != null) {
             ArrayList<VdcReturnValueBase> list = new 
ArrayList<VdcReturnValueBase>();
             list.add(returnValue);
             return list;
         } else {
-            return runMultipleActionsImpl(actionType, parameters, false, 
isRunOnlyIfAllCanDoPass);
+            return runMultipleActionsImpl(actionType, parameters, false, 
isRunOnlyIfAllCanDoPass, waitForResult);
         }
     }
 
@@ -519,13 +525,14 @@
     @ExcludeClassInterceptors
     public ArrayList<VdcReturnValueBase> 
runInternalMultipleActions(VdcActionType actionType,
             ArrayList<VdcActionParametersBase> parameters) {
-        return runMultipleActionsImpl(actionType, parameters, true, false);
+        return runMultipleActionsImpl(actionType, parameters, true, false, 
false);
     }
 
     public ArrayList<VdcReturnValueBase> runMultipleActionsImpl(VdcActionType 
actionType,
             ArrayList<VdcActionParametersBase> parameters,
             boolean isInternal,
             boolean isRunOnlyIfAllCanDoPass,
+            boolean isWaitForResult,
             ExecutionContext executionContext) {
         String sessionId = ThreadLocalParamsContainer.getHttpSessionId();
         if (!StringUtils.isEmpty(sessionId)) {
@@ -539,6 +546,7 @@
                 parameters, isInternal);
         runner.setExecutionContext(executionContext);
         runner.setIsRunOnlyIfAllCanDoPass(isRunOnlyIfAllCanDoPass);
+        runner.setIsWaitForResult(isWaitForResult);
         return runner.execute();
     }
 
@@ -547,14 +555,16 @@
     public ArrayList<VdcReturnValueBase> 
runInternalMultipleActions(VdcActionType actionType,
             ArrayList<VdcActionParametersBase> parameters,
             ExecutionContext executionContext) {
-        return runMultipleActionsImpl(actionType, parameters, true, false, 
executionContext);
+        return runMultipleActionsImpl(actionType, parameters, true, false, 
false, executionContext);
     }
 
     private ArrayList<VdcReturnValueBase> runMultipleActionsImpl(VdcActionType 
actionType,
             ArrayList<VdcActionParametersBase> parameters,
             boolean isInternal,
-            boolean isRunOnlyIfAllCanDoPass) {
-        return runMultipleActionsImpl(actionType, parameters, isInternal, 
isRunOnlyIfAllCanDoPass, null);
+            boolean isRunOnlyIfAllCanDoPass,
+            boolean isWaitForResult) {
+        return runMultipleActionsImpl(actionType, parameters, isInternal, 
isRunOnlyIfAllCanDoPass, isWaitForResult,
+                null);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
index 8ef942a..10e8413 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
@@ -20,9 +20,10 @@
     private final static int CONCURRENT_ACTIONS = 10;
 
     private VdcActionType actionType = VdcActionType.Unknown;
-    private List<VdcActionParametersBase> parameters;
+    private final List<VdcActionParametersBase> parameters;
     private final ArrayList<CommandBase<?>> commands = new 
ArrayList<CommandBase<?>>();
     protected boolean isInternal;
+    private boolean isWaitForResult = false;
 
     /**
      * Execute the actions only if CanDo of all the requests returns true
@@ -88,7 +89,11 @@
             }
 
             if (canRunActions) {
-                invokeCommands();
+                if (isWaitForResult) {
+                    invokeSyncCommands(returnValues);
+                } else {
+                    invokeCommands();
+                }
             }
         } catch (RuntimeException e) {
             log.error("Failed to execute multiple actions of type: " + 
actionType, e);
@@ -162,6 +167,26 @@
         });
     }
 
+    protected void invokeSyncCommands(ArrayList<VdcReturnValueBase> 
returnValues) {
+        List<Callable<VdcReturnValueBase>> actionTasks = new 
ArrayList<Callable<VdcReturnValueBase>>();
+        for (CommandBase<?> command : getCommands()) {
+            if (command.getReturnValue().getCanDoAction()) {
+                actionTasks.add(buildActionSync(command));
+            }
+        }
+        returnValues.addAll(ThreadPoolUtil.invokeAll(actionTasks));
+    }
+
+    protected Callable<VdcReturnValueBase> buildActionSync(final 
CommandBase<?> command) {
+        return new Callable<VdcReturnValueBase>() {
+
+            @Override
+            public VdcReturnValueBase call() {
+                return executeValidatedSyncCommand(command);
+            }
+        };
+    }
+
     /**
      * Executes commands which passed validation and creates monitoring 
objects.
      *
@@ -179,6 +204,17 @@
         command.executeAction();
     }
 
+    protected VdcReturnValueBase executeValidatedSyncCommand(CommandBase<?> 
command) {
+        if (executionContext == null || executionContext.isMonitored()) {
+            ExecutionHandler.prepareCommandForMonitoring(command,
+                    command.getActionType(),
+                    command.isInternalExecution());
+        }
+        
ThreadLocalParamsContainer.setCorrelationId(command.getCorrelationId());
+        command.insertAsyncTaskPlaceHolders();
+        return command.executeAction();
+    }
+
     public void setExecutionContext(ExecutionContext executionContext) {
         this.executionContext = executionContext;
     }
@@ -187,4 +223,7 @@
         this.isRunOnlyIfAllCanDoPass = isRunOnlyIfAllCanDoPass;
     }
 
+    public void setIsWaitForResult(boolean waitForResult) {
+        this.isWaitForResult = waitForResult;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageDomainsMultipleActionRunner.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageDomainsMultipleActionRunner.java
index 37eeee1..a6d6a0b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageDomainsMultipleActionRunner.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageDomainsMultipleActionRunner.java
@@ -10,8 +10,8 @@
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
-import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
 import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/interfaces/BackendLocal.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/interfaces/BackendLocal.java
index 65f3e1c..7d597a2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/interfaces/BackendLocal.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/interfaces/BackendLocal.java
@@ -24,6 +24,10 @@
 
     java.util.ArrayList<VdcReturnValueBase> runMultipleActions(VdcActionType 
actionType,
             java.util.ArrayList<VdcActionParametersBase> parameters,
+            boolean isRunOnlyIfAllCanDoPass, boolean waitForResult);
+
+    java.util.ArrayList<VdcReturnValueBase> runMultipleActions(VdcActionType 
actionType,
+            java.util.ArrayList<VdcActionParametersBase> parameters,
             boolean isRunOnlyIfAllCanDoPass);
 
     void initialize();
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java
index aff764e..64d82da 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java
@@ -251,7 +251,7 @@
         initQueryParamsFilter(parameters);
 
         final VdcOperation<VdcQueryType, VdcQueryParametersBase> operation =
-                new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(queryType, parameters, isPublic,
+                new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(queryType, parameters, isPublic, false,
                 new VdcOperationCallback<VdcOperation<VdcQueryType, 
VdcQueryParametersBase>, VdcQueryReturnValue>() {
             @Override
             public void onSuccess(final VdcOperation<VdcQueryType, 
VdcQueryParametersBase> operation,
@@ -384,7 +384,7 @@
             parameters.setRefresh(false); // Why do we do this?
             initQueryParamsFilter(parameters);
             operationList.add(new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(queryTypeList.get(i),
-                    parameters, multiCallback));
+                    parameters, true, multiCallback));
         }
 
         raiseQueryStartedEvent(queryTypeList, context);
@@ -564,7 +564,7 @@
         List<VdcOperation<?, ?>> operationList = new ArrayList<VdcOperation<?, 
?>>();
         for (VdcActionParametersBase parameter: parameters) {
             VdcOperation<VdcActionType, VdcActionParametersBase> operation = 
new VdcOperation<VdcActionType,
-                    VdcActionParametersBase>(actionType, parameter, 
multiCallback);
+                    VdcActionParametersBase>(actionType, parameter, true, 
multiCallback);
             operationList.add(operation);
         }
         if (operationList.isEmpty()) {
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java
index c02372a..fb800c6 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProvider.java
@@ -228,47 +228,71 @@
 
             if (parameters.size() > 1 || (allActionOperations.size() == 1
                     && allActionOperations.get(0).getCallback() instanceof 
VdcOperationCallbackList)) {
-                getService().RunMultipleActions(actionEntry.getKey(), 
(ArrayList<VdcActionParametersBase>) parameters, false,
-                        new AsyncCallback<ArrayList<VdcReturnValueBase>>() {
-
-                    @Override
-                    public void onFailure(final Throwable exception) {
-                        Map<VdcOperationCallback<?, ?>, List<VdcOperation<?, 
?>>> callbackMap =
-                                getCallbackMap(actionEntry.getValue());
-                        for (Map.Entry<VdcOperationCallback<?, ?>, 
List<VdcOperation<?, ?>>> callbackEntry: callbackMap.entrySet()) {
-                            if (callbackEntry.getKey() instanceof 
VdcOperationCallbackList) {
-                                ((VdcOperationCallbackList) 
callbackEntry.getKey()).onFailure(callbackEntry.getValue(), exception);
-                            } else {
-                                ((VdcOperationCallback) 
callbackEntry.getKey()).onFailure(callbackEntry.getValue().get(0),
-                                        exception);
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void onSuccess(final ArrayList<VdcReturnValueBase> 
result) {
-                        Map<VdcOperationCallback<?, ?>, List<VdcOperation<?, 
?>>> callbackMap =
-                                getCallbackMap(actionEntry.getValue());
-                        for (Map.Entry<VdcOperationCallback<?, ?>, 
List<VdcOperation<?, ?>>> callbackEntry: callbackMap.entrySet()) {
-                            List<VdcReturnValueBase> actionResult = 
(List<VdcReturnValueBase>)
-                                    
getOperationResult(callbackEntry.getValue(), allActionOperations, result);
-                            if (callbackEntry.getKey() instanceof 
VdcOperationCallbackList) {
-                                ((VdcOperationCallbackList) 
callbackEntry.getKey()).onSuccess(callbackEntry.getValue(),
-                                        actionResult);
-                            } else {
-                                ((VdcOperationCallback) 
callbackEntry.getKey()).onSuccess(callbackEntry.getValue().get(0),
-                                        actionResult.get(0));
-                            }
-                        }
-                    }
-
-                });
+                List<VdcOperation<?, ?>> waitForResultList = 
getWaitForResultList(actionEntry.getValue());
+                if (!waitForResultList.isEmpty()) {
+                    runMultipleActions(actionEntry.getKey(), 
waitForResultList, parameters, allActionOperations,
+                            true);
+                }
+                if (waitForResultList.size() != actionEntry.getValue().size()) 
{
+                    List<VdcOperation<?, ?>> immediateReturnList = 
actionEntry.getValue();
+                    immediateReturnList.removeAll(waitForResultList); //Don't 
care if it succeeds or not.
+                    runMultipleActions(actionEntry.getKey(), 
immediateReturnList, parameters, allActionOperations,
+                            false);
+                }
             } else if (actionEntry.getValue().size() == 1) {
                 transmitOperation(actionEntry.getValue().get(0));
             }
         }
     }
 
+    private List<VdcOperation<?, ?>> getWaitForResultList(List<VdcOperation<?, 
?>> originalList) {
+        List<VdcOperation<?, ?>> result = new ArrayList<VdcOperation<?, ?>>();
+        for (VdcOperation<?, ?> operation: originalList) {
+            if (!operation.isFromList()) {
+                result.add(operation);
+            }
+        }
+        return result;
+    }
+
+    private void runMultipleActions(final VdcActionType actionType, final 
List<VdcOperation<?, ?>> operations,
+            List<VdcActionParametersBase> parameters, final 
List<VdcOperation<?, ?>> allActionOperations,
+            final boolean waitForResults) {
+        getService().RunMultipleActions(actionType, 
(ArrayList<VdcActionParametersBase>) parameters,
+                false, waitForResults, new 
AsyncCallback<ArrayList<VdcReturnValueBase>>() {
+
+            @Override
+            public void onFailure(final Throwable exception) {
+                Map<VdcOperationCallback<?, ?>, List<VdcOperation<?, ?>>> 
callbackMap =
+                        getCallbackMap(operations);
+                for (Map.Entry<VdcOperationCallback<?, ?>, 
List<VdcOperation<?, ?>>> callbackEntry: callbackMap.entrySet()) {
+                    if (callbackEntry.getKey() instanceof 
VdcOperationCallbackList) {
+                        ((VdcOperationCallbackList) 
callbackEntry.getKey()).onFailure(callbackEntry.getValue(), exception);
+                    } else {
+                        ((VdcOperationCallback) 
callbackEntry.getKey()).onFailure(callbackEntry.getValue().get(0),
+                                exception);
+                    }
+                }
+            }
+
+            @Override
+            public void onSuccess(final ArrayList<VdcReturnValueBase> result) {
+                Map<VdcOperationCallback<?, ?>, List<VdcOperation<?, ?>>> 
callbackMap =
+                        getCallbackMap(operations);
+                for (Map.Entry<VdcOperationCallback<?, ?>, 
List<VdcOperation<?, ?>>> callbackEntry: callbackMap.entrySet()) {
+                    List<VdcReturnValueBase> actionResult = 
(List<VdcReturnValueBase>)
+                            getOperationResult(callbackEntry.getValue(), 
allActionOperations, result);
+                    if (callbackEntry.getKey() instanceof 
VdcOperationCallbackList) {
+                        ((VdcOperationCallbackList) 
callbackEntry.getKey()).onSuccess(callbackEntry.getValue(),
+                                actionResult);
+                    } else {
+                        ((VdcOperationCallback) 
callbackEntry.getKey()).onSuccess(callbackEntry.getValue().get(0),
+                                actionResult.get(0));
+                    }
+                }
+            }
+        });
+    }
     /**
      * Map operations by callback, so we can properly call a single callback 
for all related operations.
      * @param operationList The list of operations to determine the map for.
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperation.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperation.java
index fe17dd1..10af440 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperation.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/communication/VdcOperation.java
@@ -41,21 +41,28 @@
     private final boolean isAction;
 
     /**
+     * If {@code true}, this operation was part of a list of operations before 
being split into a single operation.
+     */
+    private final boolean isFromList;
+
+    /**
      * Private constructor that initializes the final members.
      * @param operation The operation.
      * @param param The parameter for the operation.
      * @param callback The callback to call when the operation is finished.
      * @param sourceOperation If we cloned an operation this is the source it 
came from.
      * @param isPublicOperation Determines if this operation should be public 
or not.
+     * @param fromList Shows if the operation came from a list of operations, 
before being split.
      */
     private VdcOperation(final T operation, final P param, final 
VdcOperationCallback<?, ?> callback,
-            final VdcOperation<T, P> sourceOperation, final boolean 
isPublicOperation) {
+            final VdcOperation<T, P> sourceOperation, final boolean 
isPublicOperation, final boolean fromList) {
         if (operation instanceof VdcActionType) {
             this.isAction = true;
         } else if (operation instanceof VdcQueryType) {
             this.isAction = false;
         } else {
-            throw new IllegalArgumentException("Operation type must be either 
VdcActionType or VdcQueryType"); //$NON-NLS-1$
+            throw new IllegalArgumentException(
+                    "Operation type must be either VdcActionType or 
VdcQueryType"); //$NON-NLS-1$
         }
 
         this.operationType = operation;
@@ -63,6 +70,7 @@
         this.operationCallback = callback;
         this.source = sourceOperation;
         this.isPublic = isPublicOperation;
+        this.isFromList = fromList;
     }
 
     /**
@@ -72,7 +80,7 @@
      */
     public VdcOperation(final VdcOperation<T, P> sourceOperation, final 
VdcOperationCallback<?, ?> callback) {
         this(sourceOperation.getOperation(), sourceOperation.getParameter(), 
callback, sourceOperation,
-                sourceOperation.isPublic());
+                sourceOperation.isPublic(), sourceOperation.isFromList);
     }
 
     /**
@@ -82,7 +90,19 @@
      * @param callback The callback to call when the operation is finished.
      */
     public VdcOperation(final T operation, final P operationParameter, final 
VdcOperationCallback<?, ?> callback) {
-        this(operation, operationParameter, callback, null, false);
+        this(operation, operationParameter, callback, null, false, false);
+    }
+
+    /**
+     * Constructor.
+     * @param operation The operation to set.
+     * @param operationParameter The parameter for the operation.
+     * @param fromList Is the operation originally from a list.
+     * @param callback The callback to call when the operation is finished.
+     */
+    public VdcOperation(final T operation, final P operationParameter, final 
boolean fromList,
+            final VdcOperationCallback<?, ?> callback) {
+        this(operation, operationParameter, callback, null, false, fromList);
     }
 
     /**
@@ -93,8 +113,8 @@
      * @param callback The callback to call when the operation is finished.
      */
     public VdcOperation(final T operation, final P operationParameter, final 
boolean isPublicOperation,
-            final VdcOperationCallback<?, ?> callback) {
-        this(operation, operationParameter, callback, null, isPublicOperation);
+            final boolean fromList, final VdcOperationCallback<?, ?> callback) 
{
+        this(operation, operationParameter, callback, null, isPublicOperation, 
fromList);
     }
 
     /**
@@ -195,4 +215,8 @@
         return result;
     }
 
+    public boolean isFromList() {
+        return isFromList;
+    }
+
 }
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java
index 2502a5b..c55289e 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/gwtservices/GenericApiGWTService.java
@@ -34,6 +34,11 @@
             ArrayList<VdcActionParametersBase> multipleParams,
             boolean isRunOnlyIfAllCanDoPass);
 
+    public ArrayList<VdcReturnValueBase> RunMultipleActions(
+            VdcActionType actionType,
+            ArrayList<VdcActionParametersBase> multipleParams,
+            boolean isRunOnlyIfAllCanDoPass, boolean isWaitForResult);
+
     public DbUser getLoggedInUser();
 
     public VdcReturnValueBase logOff(DbUser userToLogoff);
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java
index 29f4e0f..8753e8a 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/GenericApiGWTServiceImpl.java
@@ -103,6 +103,12 @@
     @Override
     public ArrayList<VdcReturnValueBase> RunMultipleActions(VdcActionType 
actionType,
             ArrayList<VdcActionParametersBase> multipleParams, boolean 
isRunOnlyIfAllCanDoPass) {
+        return RunMultipleActions(actionType, multipleParams, 
isRunOnlyIfAllCanDoPass, false);
+    }
+
+    @Override
+    public ArrayList<VdcReturnValueBase> RunMultipleActions(VdcActionType 
actionType,
+            ArrayList<VdcActionParametersBase> multipleParams, boolean 
isRunOnlyIfAllCanDoPass, boolean isWaitForResult) {
         log.debug("Server: RunMultipleAction invoked! [amount of actions: " + 
multipleParams.size() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
 
         for (VdcActionParametersBase params : multipleParams) {
@@ -110,7 +116,7 @@
         }
 
         ArrayList<VdcReturnValueBase> returnValues =
-                getBackend().runMultipleActions(actionType, multipleParams, 
isRunOnlyIfAllCanDoPass);
+                getBackend().runMultipleActions(actionType, multipleParams, 
isRunOnlyIfAllCanDoPass, isWaitForResult);
 
         return returnValues;
     }
diff --git 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/FrontendActionTest.java
 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/FrontendActionTest.java
index be40ba8..5ca3af4 100644
--- 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/FrontendActionTest.java
+++ 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/FrontendActionTest.java
@@ -128,7 +128,7 @@
         frontend.runMultipleAction(VdcActionType.AddLocalStorageDomain, 
parameters, false, mockMultipleActionCallback,
                 null);
         
verify(mockService).RunMultipleActions(eq(VdcActionType.AddLocalStorageDomain), 
eq(parameters), eq(false),
-                callbackMultipleActions.capture());
+                eq(false), callbackMultipleActions.capture());
         StatusCodeException exception = new StatusCodeException(0, "0 status 
code"); //$NON-NLS-1$
         callbackMultipleActions.getValue().onFailure(exception);
         verify(mockFrontendFailureEvent, never()).raise(eq(Frontend.class), 
(FrontendFailureEventArgs) any());
@@ -152,7 +152,7 @@
         frontend.runMultipleAction(VdcActionType.AddLocalStorageDomain, 
parameters, false, mockMultipleActionCallback,
                 testState);
         
verify(mockService).RunMultipleActions(eq(VdcActionType.AddLocalStorageDomain), 
eq(parameters), eq(false),
-                callbackMultipleActions.capture());
+                eq(false), callbackMultipleActions.capture());
         StatusCodeException exception = new 
StatusCodeException(HttpServletResponse.SC_NOT_FOUND,
                 "404 status code"); //$NON-NLS-1$
         callbackMultipleActions.getValue().onFailure(exception);
@@ -186,7 +186,7 @@
         frontend.runMultipleAction(VdcActionType.AddLocalStorageDomain, 
parameters, false, mockMultipleActionCallback,
                 testState);
         
verify(mockService).RunMultipleActions(eq(VdcActionType.AddLocalStorageDomain), 
eq(parameters), eq(false),
-                callbackMultipleActions.capture());
+                eq(false), callbackMultipleActions.capture());
         ArrayList<VdcReturnValueBase> returnValues = new 
ArrayList<VdcReturnValueBase>();
         returnValues.add(new VdcReturnValueBase());
         returnValues.add(new VdcReturnValueBase());
@@ -223,7 +223,7 @@
         frontend.runMultipleAction(VdcActionType.AddLocalStorageDomain, 
parameters, false, mockMultipleActionCallback,
                 testState);
         
verify(mockService).RunMultipleActions(eq(VdcActionType.AddLocalStorageDomain), 
eq(parameters), eq(false),
-                callbackMultipleActions.capture());
+                eq(false), callbackMultipleActions.capture());
         ArrayList<VdcReturnValueBase> returnValues = new 
ArrayList<VdcReturnValueBase>();
         returnValues.add(new VdcReturnValueBase());
         returnValues.add(new VdcReturnValueBase());
@@ -270,7 +270,7 @@
         frontend.runMultipleAction(VdcActionType.AddLocalStorageDomain, 
parameters, false, mockMultipleActionCallback,
                 testState);
         
verify(mockService).RunMultipleActions(eq(VdcActionType.AddLocalStorageDomain), 
eq(parameters), eq(false),
-                callbackMultipleActions.capture());
+                eq(false), callbackMultipleActions.capture());
         ArrayList<VdcReturnValueBase> returnValues = new 
ArrayList<VdcReturnValueBase>();
         returnValues.add(new VdcReturnValueBase());
         returnValues.add(new VdcReturnValueBase());
diff --git 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProviderTest.java
 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProviderTest.java
index cbee65c..a8283c2 100644
--- 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProviderTest.java
+++ 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/communication/GWTRPCCommunicationProviderTest.java
@@ -264,7 +264,8 @@
         testList.add(testOperation2);
         testProvider.transmitOperationList(testList);
         verify(mockService).RunMultipleActions(eq(VdcActionType.ActivateVds),
-                (ArrayList<VdcActionParametersBase>) eq(testParameterList), 
eq(false), actionCallbackList.capture());
+                (ArrayList<VdcActionParametersBase>) eq(testParameterList), 
eq(false), eq(true),
+                actionCallbackList.capture());
         
actionCallbackList.getValue().onSuccess((ArrayList<VdcReturnValueBase>) 
testResultList);
         verify(mockOperationCallbackList1).onSuccess(eq(testList), 
eq(testResultList));
     }
@@ -284,7 +285,8 @@
         testList.add(testOperation2);
         testProvider.transmitOperationList(testList);
         verify(mockService).RunMultipleActions(eq(VdcActionType.ActivateVds),
-                (ArrayList<VdcActionParametersBase>) eq(testParameterList), 
eq(false), actionCallbackList.capture());
+                (ArrayList<VdcActionParametersBase>) eq(testParameterList), 
eq(false), eq(true),
+                actionCallbackList.capture());
         Exception testException = new Exception("Failure"); //$NON-NLS-1$
         actionCallbackList.getValue().onFailure(testException);
         verify(mockOperationCallbackList1).onFailure(eq(testList), 
eq(testException));
@@ -303,8 +305,8 @@
                 new VdcOperation<VdcActionType, 
VdcActionParametersBase>(VdcActionType.ActivateVds, testParameters,
                 mockOperationCallbackList1);
         VdcOperation<VdcActionType, VdcActionParametersBase> testOperation3 =
-                new VdcOperation<VdcActionType, 
VdcActionParametersBase>(VdcActionType.ActivateStorageDomain, testParameters,
-                mockOperationCallbackSingle2);
+                new VdcOperation<VdcActionType, 
VdcActionParametersBase>(VdcActionType.ActivateStorageDomain,
+                        testParameters, mockOperationCallbackSingle2);
         testList.add(testOperation1);
         testList.add(testOperation2);
         testList.add(testOperation3);
@@ -315,7 +317,7 @@
         List<VdcReturnValueBase> activateVdsResultList = 
createActionResultList(testResult, 2);
         testProvider.transmitOperationList(testList);
         verify(mockService).RunMultipleActions(eq(VdcActionType.ActivateVds),
-                (ArrayList<VdcActionParametersBase>) 
eq(activateVdsParameterList), eq(false),
+                (ArrayList<VdcActionParametersBase>) 
eq(activateVdsParameterList), eq(false), eq(true),
                 actionCallbackList.capture());
         verify(mockService).RunAction(eq(VdcActionType.ActivateStorageDomain), 
eq(testParameters),
                 actionCallback.capture());
@@ -350,7 +352,7 @@
         List<VdcReturnValueBase> activateVdsResultList = 
createActionResultList(testResult, 2);
         testProvider.transmitOperationList(testList);
         verify(mockService).RunMultipleActions(eq(VdcActionType.ActivateVds),
-                (ArrayList<VdcActionParametersBase>) 
eq(activateVdsParameterList), eq(false),
+                (ArrayList<VdcActionParametersBase>) 
eq(activateVdsParameterList), eq(false), eq(true),
                 actionCallbackList.capture());
         verify(mockService).RunAction(eq(VdcActionType.ActivateStorageDomain), 
eq(testParameters),
                 actionCallback.capture());
@@ -478,7 +480,7 @@
         VdcQueryParametersBase testQueryParameters = new 
VdcQueryParametersBase();
         VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation1 =
                 new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(VdcQueryType.Search, testQueryParameters, true,
-                mockOperationCallbackSingle1);
+                false, mockOperationCallbackSingle1);
         List<VdcOperation<?, ?>> operationList = new ArrayList<VdcOperation<?, 
?>>();
         operationList.add(testOperation1);
         testProvider.transmitOperationList(operationList);
@@ -493,10 +495,10 @@
         VdcQueryParametersBase testQueryParameters = new 
VdcQueryParametersBase();
         VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation1 =
                 new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(VdcQueryType.Search, testQueryParameters, true,
-                mockOperationCallbackSingle1);
+                false, mockOperationCallbackSingle1);
         VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation2 =
                 new VdcOperation<VdcQueryType, 
VdcQueryParametersBase>(VdcQueryType.GetConfigurationValues,
-                        testQueryParameters, true, 
mockOperationCallbackSingle2);
+                        testQueryParameters, true, false, 
mockOperationCallbackSingle2);
         List<VdcOperation<?, ?>> operationList = new ArrayList<VdcOperation<?, 
?>>();
         operationList.add(testOperation1);
         operationList.add(testOperation2);


-- 
To view, visit http://gerrit.ovirt.org/23032
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I935f4257e731de719540db9d79d5865537be228d
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alexander Wels <aw...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to