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
