public void BuildRequestModel_GivenJobNotificationWithDefinitionNotConfiguredForScaling_ContainsNoRepositoryTypes() { //Arrange JobNotification jobNotification = new JobNotification { JobType = "any-job-def-id" }; CosmosDbScalingRequestModelBuilder builder = new CosmosDbScalingRequestModelBuilder(); //Act CosmosDbScalingRequestModel requestModel = builder.BuildRequestModel(jobNotification); //Assert requestModel .RepositoryTypes .Should() .BeNull(); }
public CosmosDbScalingRequestModel BuildRequestModel(JobNotification jobNotification) { CosmosDbScalingRequestModel cosmosDbScalingRequestModel = new CosmosDbScalingRequestModel { JobDefinitionId = jobNotification.JobType }; switch (jobNotification.JobType) { case JobConstants.DefinitionNames.CreateInstructAllocationJob: cosmosDbScalingRequestModel.RepositoryTypes = new[] { CosmosCollectionType.CalculationProviderResults, CosmosCollectionType.ProviderSourceDatasets }; break; case JobConstants.DefinitionNames.CreateInstructGenerateAggregationsAllocationJob: cosmosDbScalingRequestModel.RepositoryTypes = new[] { CosmosCollectionType.ProviderSourceDatasets }; break; case JobConstants.DefinitionNames.MapDatasetJob: cosmosDbScalingRequestModel.RepositoryTypes = new[] { CosmosCollectionType.ProviderSourceDatasets }; break; case JobConstants.DefinitionNames.PublishProviderResultsJob: cosmosDbScalingRequestModel.RepositoryTypes = new[] { CosmosCollectionType.CalculationProviderResults, CosmosCollectionType.PublishedProviderResults }; break; } return(cosmosDbScalingRequestModel); }
public void BuildRequestModel_GivenJobWithDefinitions_EnsuresCorrectRepositoryTypes(string jobDefinitionId, CosmosCollectionType[] cosmosRepositoryTypes) { //Arrange JobNotification jobNotification = new JobNotification { JobType = jobDefinitionId }; CosmosDbScalingRequestModelBuilder builder = new CosmosDbScalingRequestModelBuilder(); //Act CosmosDbScalingRequestModel requestModel = builder.BuildRequestModel(jobNotification); //Assert requestModel .RepositoryTypes .SequenceEqual(cosmosRepositoryTypes) .Should() .BeTrue(); }
public async Task ScaleUp(Message message) { Guard.ArgumentNotNull(message, nameof(message)); JobNotification jobNotification = message.GetPayloadAsInstanceOf <JobNotification>(); Guard.ArgumentNotNull(jobNotification, "Null message payload provided"); if (jobNotification.RunningStatus == RunningStatus.Completed || jobNotification.RunningStatus == RunningStatus.InProgress) { return; } CosmosDbScalingRequestModel requestModel = _cosmosDbScalingRequestModelBuilder.BuildRequestModel(jobNotification); if (requestModel.RepositoryTypes.IsNullOrEmpty()) { return; } foreach (CosmosCollectionType cosmosRepositoryType in requestModel.RepositoryTypes) { try { CosmosDbScalingConfig cosmosDbScalingConfig = await _scalingConfigRepositoryPolicy.ExecuteAsync(() => _cosmosDbScalingConfigRepository.GetConfigByRepositoryType(cosmosRepositoryType)); await ScaleUpCollection(cosmosDbScalingConfig, requestModel.JobDefinitionId); } catch (Exception ex) { string errorMessage = "Failed to increase cosmosdb request units"; _logger.Error(ex, errorMessage); throw new RetriableException(errorMessage, ex); } } await _cacheProviderPolicy.ExecuteAsync(() => _cacheProvider.RemoveAsync <List <CosmosDbScalingConfig> >(CacheKeys.AllCosmosScalingConfigs)); }
public CosmosDbScalingRequestModel BuildRequestModel(JobSummary jobSummary) { CosmosDbScalingRequestModel cosmosDbScalingRequestModel = new CosmosDbScalingRequestModel { JobDefinitionId = jobSummary.JobType }; cosmosDbScalingRequestModel.RepositoryTypes = jobSummary.JobType switch { JobDefinitions.CreateInstructAllocationJob => new[] { CosmosCollectionType.CalculationProviderResults, CosmosCollectionType.ProviderSourceDatasets }, JobDefinitions.CreateInstructGenerateAggregationsAllocationJob => new[] { CosmosCollectionType.ProviderSourceDatasets }, JobDefinitions.MapDatasetJob => new[] { CosmosCollectionType.ProviderSourceDatasets }, JobDefinitions.RefreshFundingJob => new[] { CosmosCollectionType.PublishedFunding, CosmosCollectionType.CalculationProviderResults }, JobDefinitions.PublishAllProviderFundingJob => new[] { CosmosCollectionType.PublishedFunding }, JobDefinitions.ApproveAllProviderFundingJob => new[] { CosmosCollectionType.PublishedFunding }, JobDefinitions.MergeSpecificationInformationForProviderJob => new[] { CosmosCollectionType.CalculationProviderResults, CosmosCollectionType.Jobs }, JobDefinitions.DeleteCalculationsJob => new[] { CosmosCollectionType.Calculations }, JobDefinitions.DeleteCalculationResultsJob => new[] { CosmosCollectionType.Calculations }, JobDefinitions.AssignTemplateCalculationsJob => new[] { CosmosCollectionType.Calculations }, JobDefinitions.DeleteDatasetsJob => new [] { CosmosCollectionType.Datasets }, JobDefinitions.PublishBatchProviderFundingJob => new [] { CosmosCollectionType.PublishedFunding }, JobDefinitions.ApproveBatchProviderFundingJob => new [] { CosmosCollectionType.PublishedFunding }, JobDefinitions.DeletePublishedProvidersJob => new [] { CosmosCollectionType.PublishedFunding }, JobDefinitions.PublishedFundingUndoJob => new [] { CosmosCollectionType.PublishedFunding }, JobDefinitions.DeleteSpecificationJob => new [] { CosmosCollectionType.Specifications }, JobDefinitions.DeleteTestResultsJob => new [] { CosmosCollectionType.TestResults }, JobDefinitions.DeleteTestsJob => new [] { CosmosCollectionType.Tests }, JobDefinitions.ApproveAllCalculationsJob => new [] { CosmosCollectionType.Calculations }, _ => cosmosDbScalingRequestModel.RepositoryTypes }; return(cosmosDbScalingRequestModel); } }