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}"); } } } }
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); }