Ravi Nori has uploaded a new change for review.

Change subject: engine : Persist all async task place holders
......................................................................

engine : Persist all async task place holders

Persist all async task place holder for all child commands
before submitting any task to vdsm

Change-Id: I2bdd4a377c3be055c48357881f731f7d1c01c3cb
Signed-off-by: Ravi Nori <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
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/CommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.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/RunVmCommandBase.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
7 files changed, 110 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/19/14819/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index 8194847..8a093b0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -108,6 +108,44 @@
         }
     }
 
+    Map<Guid, CommandBase<?>> diskIdsToCommandMap = new HashMap<>();
+
+    @Override
+    protected void insertAsyncTaskPlaceHolders() {
+        Guid vmSnapshotId = Guid.NewGuid();
+
+        for (DiskImage diskImage : mImages) {
+            CreateImageTemplateParameters createParams = new 
CreateImageTemplateParameters(diskImage.getImageId(),
+                    getVmTemplateId(), getVmTemplateName(), getVmId());
+            createParams.setStorageDomainId(diskImage.getStorageIds().get(0));
+            createParams.setVmSnapshotId(vmSnapshotId);
+            createParams.setEntityId(getParameters().getEntityId());
+            
createParams.setDestinationStorageDomainId(diskInfoDestinationMap.get(diskImage.getId())
+                    .getStorageIds()
+                    .get(0));
+            
createParams.setDiskAlias(diskInfoDestinationMap.get(diskImage.getId()).getDiskAlias());
+            createParams.setParentParameters(getParameters());
+            createParams.setQuotaId(getQuotaIdForDisk(diskImage));
+
+            // build and cache the command to execute:
+            diskIdsToCommandMap.put(diskImage.getImageId(), constructCommand(
+                    VdcActionType.CreateImageTemplate,
+                    createParams,
+                    true,
+                    
ExecutionHandler.createDefaultContexForTasks(getExecutionContext())));
+        }
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+
+            @Override
+            public Void runInTransaction() {
+                for (DiskImage diskImage : mImages) {
+                    
checkCanDoActionInsertAsyncTaskPlaceHolders(diskIdsToCommandMap.get(diskImage.getImageId()));
+                }
+                return null;
+            }
+        });
+    }
+
     @Override
     protected void executeCommand() {
         // get vm status from db to check its really down before locking
@@ -354,22 +392,8 @@
         Guid vmSnapshotId = Guid.NewGuid();
 
         for (DiskImage diskImage : mImages) {
-            CreateImageTemplateParameters createParams = new 
CreateImageTemplateParameters(diskImage.getImageId(),
-                    getVmTemplateId(), getVmTemplateName(), getVmId());
-            createParams.setStorageDomainId(diskImage.getStorageIds().get(0));
-            createParams.setVmSnapshotId(vmSnapshotId);
-            createParams.setEntityId(getParameters().getEntityId());
-            
createParams.setDestinationStorageDomainId(diskInfoDestinationMap.get(diskImage.getId())
-                    .getStorageIds()
-                    .get(0));
-            
createParams.setDiskAlias(diskInfoDestinationMap.get(diskImage.getId()).getDiskAlias());
-            createParams.setParentParameters(getParameters());
-            createParams.setQuotaId(getQuotaIdForDisk(diskImage));
             // The return value of this action is the 'copyImage' task GUID:
-            VdcReturnValueBase retValue = 
Backend.getInstance().runInternalAction(
-                    VdcActionType.CreateImageTemplate,
-                    createParams,
-                    
ExecutionHandler.createDefaultContexForTasks(getExecutionContext()));
+            VdcReturnValueBase retValue = 
runCommand(diskIdsToCommandMap.get(diskImage.getImageId()));
 
             if (!retValue.getSucceeded()) {
                 throw new VdcBLLException(retValue.getFault().getError(), 
retValue.getFault().getMessage());
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 29e7545..58e384f 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
@@ -329,6 +329,8 @@
         command.setContext(context);
         ExecutionHandler.prepareCommandForMonitoring(command, actionType, 
runAsInternal);
 
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         returnValue = command.executeAction();
         returnValue.setCorrelationId(parameters.getCorrelationId());
         returnValue.setJobId(command.getJobId());
@@ -483,6 +485,8 @@
         case LoginUser:
         case LoginAdminUser:
             CommandBase<?> command = 
CommandsFactory.CreateCommand(parameters.getActionType(), parameters);
+            command.checkCanDoAction();
+            command.insertAsyncTaskPlaceHolders();
             return command.executeAction();
         default:
             return 
getErrorCommandReturnValue(VdcBllMessages.USER_NOT_AUTHORIZED_TO_PERFORM_ACTION);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 76d84a4..fa08660 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -297,6 +297,12 @@
         return _returnValue;
     }
 
+    boolean actionAllowed = false;
+
+    protected void checkCanDoAction() {
+        actionAllowed = getReturnValue().getCanDoAction() || 
internalCanDoAction();
+    }
+
     public VdcReturnValueBase executeAction() {
         determineExecutionReason();
         _actionState = CommandActionState.EXECUTE;
@@ -304,11 +310,9 @@
         getReturnValue().setDescription((tempVar != null) ? tempVar : 
getReturnValue().getDescription());
         setActionMessageParameters();
 
-        boolean actionAllowed = false;
         Step validatingStep = ExecutionHandler.addStep(getExecutionContext(), 
StepEnum.VALIDATING, null);
 
         try {
-            actionAllowed = getReturnValue().getCanDoAction() || 
internalCanDoAction();
             ExecutionHandler.endStep(getExecutionContext(), validatingStep, 
actionAllowed);
 
             if (actionAllowed) {
@@ -1208,8 +1212,55 @@
         return annotation != null && annotation.forceCompensation();
     }
 
+    protected void insertAsyncTaskPlaceHolders() {}
+
     protected abstract void executeCommand();
 
+    /**
+     * Called to construct the child command. The parent command constructs
+     * a list of all child commands and then calls the method
+     * insertAsyncTaskPlaceHolders(CommandBase<?> command) to insert async
+     * task place holders for all child commands
+     * @param actionType
+     * @param parameters
+     * @param runAsInternal
+     * @param context
+     * @return
+     */
+    protected CommandBase<?> constructCommand(VdcActionType actionType,
+            VdcActionParametersBase parameters,
+            boolean runAsInternal,
+            CommandContext context) {
+        ExecutionHandler.evaluateCorrelationId(parameters);
+        CommandBase<?> command = CommandsFactory.CreateCommand(actionType, 
parameters);
+        command.setInternalExecution(runAsInternal);
+        command.setContext(context);
+        ExecutionHandler.prepareCommandForMonitoring(command, actionType, 
runAsInternal);
+        return command;
+    }
+
+    /**
+     * Insert the async task place holders for the command
+     * @param command
+     */
+    protected void checkCanDoActionInsertAsyncTaskPlaceHolders(CommandBase<?> 
command) {
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
+    }
+
+    /**
+     * calls execute action the command.
+     * @param command
+     * @param parameters
+     * @return
+     */
+    protected VdcReturnValueBase runCommand(CommandBase<?> command) {
+        VdcReturnValueBase returnValue = command.executeAction();
+        
returnValue.setCorrelationId(command.getParameters().getCorrelationId());
+        returnValue.setJobId(command.getJobId());
+        return returnValue;
+    }
+
     private void logCommand() {
         Class<?> type = getClass();
         InternalCommandAttribute annotation = 
type.getAnnotation(InternalCommandAttribute.class);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
index c198942..cb80df0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
@@ -30,6 +30,14 @@
         super.setVmTemplateName(parameters.getVmTemplateName());
     }
 
+    Guid taskId;
+    protected void insertAsyncTaskPlaceHolders() {
+        taskId = createAsyncTask(VdcActionType.AddVmTemplate,
+                VdcObjectType.Storage,
+                getParameters().getStorageDomainId(),
+                getParameters().getDestinationStorageDomainId());
+    }
+
     @Override
     protected void executeCommand() {
         Guid storagePoolId = getDiskImage().getStoragePoolId() != null ? 
getDiskImage().getStoragePoolId()
@@ -47,10 +55,6 @@
         DiskImage newImage = cloneDiskImage(getDestinationImageId());
         fillVolumeInformation(newImage);
 
-        Guid taskId = this.createAsyncTask(VdcActionType.AddVmTemplate,
-                        VdcObjectType.Storage,
-                        getParameters().getStorageDomainId(),
-                        getParameters().getDestinationStorageDomainId());
         getReturnValue().getAsyncTaskIdList().add(taskId);
 
         VDSReturnValue vdsReturnValue = Backend
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 8450d17..27283cc 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
@@ -171,6 +171,8 @@
                     command.isInternalExecution());
         }
         
ThreadLocalParamsContainer.setCorrelationId(command.getCorrelationId());
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         command.executeAction();
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
index 5ed7bc3..b3581c1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
@@ -171,6 +171,8 @@
             // set the _isRerun flag to false before calling executeAction so 
that we'll know if
             // there is another rerun attempt within the method
             _isRerun = false;
+            checkCanDoAction();
+            insertAsyncTaskPlaceHolders();
             executeAction();
 
             // if there was no rerun attempt in the previous executeAction 
call and the command
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
index fbd8894..503f52f 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
@@ -119,6 +119,8 @@
         
when(parameterMock.getTransactionScopeOption()).thenReturn(TransactionScopeOption.Required);
         CommandBase<VdcActionParametersBase> command = spy(new 
CommandBaseDummy(parameterMock));
 
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         command.executeAction();
         verify(command).executeCommand();
     }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2bdd4a377c3be055c48357881f731f7d1c01c3cb
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Ravi Nori <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to