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();
        }
예제 #2
0
        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();
        }
예제 #4
0
        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);
        }
    }