private async Task ProcessIncompleteValidations(PackageValidationSet validationSet, ValidationSetProcessorResult processorStats)
        {
            foreach (var packageValidation in validationSet.PackageValidations.Where(v => v.ValidationStatus == ValidationStatus.Incomplete))
            {
                using (_logger.BeginScope("Incomplete {ValidationType} Key {ValidationId}", packageValidation.Type, packageValidation.Key))
                {
                    _logger.LogInformation("Processing incomplete validation {ValidationType} for {PackageId} {PackageVersion}, validation set {ValidationSetId}, {ValidationId}",
                                           packageValidation.Type,
                                           validationSet.PackageId,
                                           validationSet.PackageNormalizedVersion,
                                           validationSet.ValidationTrackingId,
                                           packageValidation.Key);
                    var validationConfiguration = GetValidationConfiguration(packageValidation.Type);
                    if (validationConfiguration == null)
                    {
                        await OnUnknownValidation(packageValidation);

                        continue;
                    }

                    var validator         = _validatorProvider.GetValidator(packageValidation.Type);
                    var validationRequest = await CreateValidationRequest(packageValidation.PackageValidationSet, packageValidation);

                    var validationResult = await validator.GetResultAsync(validationRequest);

                    if (validationResult.Status != ValidationStatus.Incomplete)
                    {
                        _logger.LogInformation(
                            "New status for validation {ValidationType} for {PackageId} {PackageVersion} is " +
                            "{ValidationStatus}, validation set {ValidationSetId}, {ValidationId}",
                            packageValidation.Type,
                            validationSet.PackageId,
                            validationSet.PackageNormalizedVersion,
                            validationResult.Status,
                            validationSet.ValidationTrackingId,
                            packageValidation.Key);
                    }
                    else
                    {
                        _logger.LogDebug(
                            "Validation {ValidationType} for {PackageId} {PackageVersion} is already " +
                            "{ValidationStatus}, validation set {ValidationSetId}, {ValidationId}",
                            packageValidation.Type,
                            validationSet.PackageId,
                            validationSet.PackageNormalizedVersion,
                            validationResult.Status,
                            validationSet.ValidationTrackingId,
                            packageValidation.Key);
                    }

                    switch (validationResult.Status)
                    {
                    case ValidationStatus.Incomplete:
                        break;

                    case ValidationStatus.Failed:
                        await _validationStorageService.UpdateValidationStatusAsync(packageValidation, validationResult);

                        await validator.CleanUpAsync(validationRequest);

                        break;

                    case ValidationStatus.Succeeded:
                        await _validationStorageService.UpdateValidationStatusAsync(packageValidation, validationResult);

                        await validator.CleanUpAsync(validationRequest);

                        UpdateStatsForValidationSuccess(processorStats, validationConfiguration);
                        break;

                    default:
                        throw new InvalidOperationException($"Unexpected validation state: " +
                                                            $"DB: {ValidationStatus.Incomplete} ({(int)ValidationStatus.Incomplete}), " +
                                                            $"Actual: {validationResult.Status} {(int)validationResult.Status}");
                    }
                }
            }
        }
예제 #2
0
        private async Task <bool> ProcessIncompleteValidations(PackageValidationSet validationSet, Package package)
        {
            bool tryMoreValidations = false;

            foreach (var packageValidation in validationSet.PackageValidations.Where(v => v.ValidationStatus == ValidationStatus.Incomplete))
            {
                using (_logger.BeginScope("Incomplete {ValidationType} Key {ValidationId}", packageValidation.Type, packageValidation.Key))
                {
                    _logger.LogInformation("Processing incomplete validation {ValidationType} for {PackageId} {PackageVersion}, validation set {ValidationSetId}, {ValidationId}",
                                           packageValidation.Type,
                                           package.PackageRegistration.Id,
                                           package.NormalizedVersion,
                                           validationSet.ValidationTrackingId,
                                           packageValidation.Key);
                    var validationConfiguration = GetValidationConfiguration(packageValidation.Type);
                    if (validationConfiguration == null)
                    {
                        await OnUnknownValidation(packageValidation);

                        continue;
                    }

                    var validator         = _validatorProvider.GetValidator(packageValidation.Type);
                    var validationRequest = await CreateValidationRequest(packageValidation.PackageValidationSet, packageValidation, package, validationConfiguration);

                    var validationStatus = await validator.GetStatusAsync(validationRequest);

                    _logger.LogInformation("New status for validation {ValidationType} for {PackageId} {PackageVersion} is {ValidationStatus}, validation set {ValidationSetId}, {ValidationId}",
                                           packageValidation.Type,
                                           package.PackageRegistration.Id,
                                           package.NormalizedVersion,
                                           validationStatus,
                                           validationSet.ValidationTrackingId,
                                           packageValidation.Key);

                    switch (validationStatus)
                    {
                    case ValidationStatus.Incomplete:
                        await ProcessIncompleteValidation(packageValidation, validationConfiguration);

                        break;

                    case ValidationStatus.Failed:
                        await _validationStorageService.UpdateValidationStatusAsync(packageValidation, validationStatus);

                        break;

                    case ValidationStatus.Succeeded:
                        await _validationStorageService.UpdateValidationStatusAsync(packageValidation, validationStatus);

                        // need another iteration to try running new validations
                        tryMoreValidations = true;
                        break;

                    default:
                        throw new InvalidOperationException($"Unexpected validation state: " +
                                                            $"DB: {ValidationStatus.Incomplete} ({(int)ValidationStatus.Incomplete}), " +
                                                            $"Actual: {validationStatus} {(int)validationStatus}");
                    }
                }
            }

            return(tryMoreValidations);
        }