async Task ReScheduleSandboxResourceCreation(int sandboxId) { var sandbox = await _sandboxModelService.GetByIdForReScheduleCreateAsync(sandboxId); EnsureHasAllRequiredResourcesThrowIfNot(sandbox); var queueParentItem = QueueItemFactory.CreateParent($"Create basic resources for Sandbox (re-scheduled): {sandbox.Id}"); foreach (var currentSandboxResource in sandbox.Resources.Where(r => r.SandboxControlled).OrderBy(r => r.Id)) { var resourceCreateOperation = CloudResourceOperationUtil.GetCreateOperation(currentSandboxResource); if (resourceCreateOperation == null) { throw new Exception(ReScheduleLogPrefix(sandbox.StudyId, sandbox.Id, $"Could not locate create operation for resource {currentSandboxResource.Id} - {currentSandboxResource.ResourceName}")); } if (resourceCreateOperation.Status == CloudResourceOperationState.ABANDONED) { throw new Exception(ReScheduleLogPrefix(sandbox.StudyId, sandbox.Id, $"Create operation for resource {currentSandboxResource.Id} - {currentSandboxResource.ResourceName} was abandoned. Cannot proceed")); } await EnsureOperationIsReadyForRetryAndAddToQueueItem(currentSandboxResource, resourceCreateOperation, queueParentItem); } if (queueParentItem.Children.Count == 0) { throw new Exception(ReScheduleLogPrefix(sandbox.StudyId, sandbox.Id, $"Could not re-shedule creation. No relevant resource items found")); } else { await _provisioningQueueService.SendMessageAsync(queueParentItem); } }
public async Task CreateResourceGroupForStudySpecificDatasetsAsync(Study study, CancellationToken cancellationToken = default) { var studyForCreation = await _studyModelService.GetForDatasetCreationNoAccessCheckAsync(study.Id); var resourceGroupForDatasets = GetResourceGroupForStudySpecificDataset(studyForCreation); var parentQueueItem = QueueItemFactory.CreateParent("Create resource group for Study specific datasets"); if (resourceGroupForDatasets == null) { var resourceGroupName = AzureResourceNameUtil.StudySpecificDatasetResourceGroup(studyForCreation.Name); var tags = ResourceTagFactory.StudySpecificDatasourceResourceGroupTags(_config, studyForCreation); resourceGroupForDatasets = await _cloudResourceCreateService.CreateStudySpecificResourceGroupEntryAsync(studyForCreation.Id, resourceGroupName, "norwayeast", tags); ProvisioningQueueUtil.CreateChildAndAdd(parentQueueItem, resourceGroupForDatasets); } else { throw new Exception("Resource group allready exists"); } await ScheduleResourceGroupRoleAssignments(studyForCreation, resourceGroupForDatasets, parentQueueItem); await _provisioningQueueService.SendMessageAsync(parentQueueItem, cancellationToken : cancellationToken); }
async Task EnsureOperationIsReadyForRetryAndEnqueue(CloudResource resource, CloudResourceOperation operationToRetry) { var queueParentItem = QueueItemFactory.CreateParent(operationToRetry.Id, $"{operationToRetry.Description} (re-scheduled)"); await EnsureOperationIsReadyForRetryAndAddToQueueItem(resource, operationToRetry, queueParentItem); await _provisioningQueueService.SendMessageAsync(queueParentItem); }
public async Task DeleteAsync(int id) { var deleteResourceOperation = await _cloudResourceDeleteService.MarkAsDeletedWithDeleteOperationAsync(id, UserOperation.Study_Crud_Sandbox); _logger.LogInformation($"Delete VM: Enqueing delete operation"); var queueParentItem = QueueItemFactory.CreateParent(deleteResourceOperation); await _provisioningQueueService.SendMessageAsync(queueParentItem); }
public async Task CreateResourcesForStudySpecificDatasetAsync(Study study, Dataset dataset, string clientIp, CancellationToken cancellationToken = default) { _logger.LogInformation($"CreateResourcesForStudySpecificDataset - Dataset Id: {dataset.Id}"); var parentQueueItem = QueueItemFactory.CreateParent("Create resources for Study Specific Dataset"); var resourceGroupDb = await EnsureResourceGroupExists(study, dataset, parentQueueItem); await OrderCreationOfStudySpecificDatasetStorageAccount(study, dataset, resourceGroupDb, clientIp, parentQueueItem, cancellationToken); await _provisioningQueueService.SendMessageAsync(parentQueueItem, cancellationToken : cancellationToken); }
public async Task HandleSandboxDeleteAsync(int sandboxId, EventId eventId) { var sandboxFromDb = await _sandboxModelService.GetWithResourcesNoPermissionCheckAsync(sandboxId); CloudResource sandboxResourceGroup = null; if (sandboxFromDb.Resources.Count > 0) { //Mark all resources as deleted foreach (var curResource in sandboxFromDb.Resources) { if (curResource.ResourceType == AzureResourceType.ResourceGroup) { sandboxResourceGroup = curResource; } _logger.LogInformation(eventId, "Study {0}, Sandbox {1}: Marking resource {2} for deletion", sandboxFromDb.StudyId, sandboxId, curResource.Id); await _cloudResourceDeleteService.MarkAsDeletedAsync(curResource.Id); } if (sandboxResourceGroup == null) { throw new Exception($"Unable to find ResourceGroup record in DB for Sandbox {sandboxId}, StudyId: {sandboxFromDb.StudyId}."); } _logger.LogInformation(eventId, $"Creating delete operation for resource group {sandboxResourceGroup.ResourceGroupName}"); var deleteOperation = await _cloudResourceOperationCreateService.CreateDeleteOperationAsync(sandboxResourceGroup.Id, ResourceOperationDescriptionUtils.CreateDescriptionForResourceOperation(sandboxResourceGroup.ResourceType, CloudResourceOperationType.DELETE, sandboxId: sandboxResourceGroup.SandboxId.Value) + ". (Delete of Sandbox resource group and all resources within)"); _logger.LogInformation(eventId, "Study {0}, Sandbox {1}: Queuing operation", sandboxFromDb.StudyId, sandboxId); var queueParentItem = QueueItemFactory.CreateParent(deleteOperation); await _provisioningQueueService.SendMessageAsync(queueParentItem, visibilityTimeout : TimeSpan.FromSeconds(10)); } else { _logger.LogCritical(eventId, "Study {0}, Sandbox {1}: Unable to find any resources for Sandbox", sandboxFromDb.StudyId, sandboxId); } }