コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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));
        }