public async Task <ResourceProvisioningResult> Handle( CloudResourceOperationDto operation, ResourceProvisioningParameters currentCrudInput, IPerformResourceProvisioning provisioningService ) { try { _provisioningLogService.OperationInformation(operation, $"Deleting {operation.Resource.ResourceType}"); var deleteTask = provisioningService.EnsureDeleted(currentCrudInput); while (!deleteTask.IsCompleted) { operation = await _cloudResourceOperationUpdateService.TouchAsync(operation.Id); Thread.Sleep((int)TimeSpan.FromSeconds(3).TotalMilliseconds); } _provisioningLogService.OperationInformation(operation, $"Delete Operation finished"); return(deleteTask.Result); } catch (Exception ex) { throw new ProvisioningException($"Provisioning (Delete) failed", innerException: ex); } }
public async Task <ResourceProvisioningResult> Handle( CloudResourceOperationDto operation, ResourceProvisioningParameters currentCrudInput, IPerformResourceProvisioning provisioningService ) { try { var cancellation = new CancellationTokenSource(); var currentCrudResultTask = CreateProvisioningResultTask(operation, currentCrudInput, provisioningService, cancellation); while (!currentCrudResultTask.IsCompleted) { operation = await _cloudResourceOperationUpdateService.TouchAsync(operation.Id); if (await _cloudResourceReadService.ResourceIsDeleted(operation.Resource.Id) || operation.Status == CloudResourceOperationState.ABORTED || operation.Status == CloudResourceOperationState.ABANDONED) { _provisioningLogService.OperationWarning(operation, "Operation aborted, provisioning will be aborted"); cancellation.Cancel(); break; } Thread.Sleep((int)TimeSpan.FromSeconds(3).TotalMilliseconds); } var provisioningResult = currentCrudResultTask.Result; if (operation.OperationType == CloudResourceOperationType.CREATE) { _provisioningLogService.OperationInformation(operation, $"Storing resource Id and Name"); await _cloudResourceUpdateService.UpdateResourceIdAndName(operation.Resource.Id, provisioningResult.IdInTargetSystem, provisioningResult.NameInTargetSystem); } return(provisioningResult); } catch (Exception ex) { if (ex.InnerException != null && ex.InnerException.Message.Contains("A task was canceled")) { throw new ProvisioningException($"Resource provisioning (Create/update) aborted.", logAsWarning: true, innerException: ex.InnerException); } else { throw new ProvisioningException($"Resource provisioning (Create/update) failed.", CloudResourceOperationState.FAILED, postponeQueueItemFor: 10, innerException: ex); } } }
Task <ResourceProvisioningResult> CreateProvisioningResultTask(CloudResourceOperationDto operation, ResourceProvisioningParameters currentCrudInput, IPerformResourceProvisioning provisioningService, CancellationTokenSource cancellation) { if (operation.OperationType == CloudResourceOperationType.CREATE) { return(provisioningService.EnsureCreated(currentCrudInput, cancellation.Token)); } return(provisioningService.Update(currentCrudInput, cancellation.Token)); }