/// <inheritdoc /> public async Task SaveImageScanResult(ImageScanResultWithCVEs imageScanResult) { Logger.Information( "Saving Image Scan {ImageScanId} for {ImageTag} with {FoundCVE} found CVEs", imageScanResult.Id, imageScanResult.ImageTag, imageScanResult.FoundCVEs?.Count ?? 0); var existingScanResult = await this.db.Set <ImageScanResultEntity>().FirstOrDefaultAsync(i => i.ExternalId == imageScanResult.Id); if (existingScanResult == null) { this.db.Set <ImageScanResultEntity>().Add(imageScanResult.ToEntity()); } else { var newEntity = imageScanResult.ToEntity(); existingScanResult.Date = newEntity.Date; existingScanResult.FoundCVEs = newEntity.FoundCVEs; existingScanResult.Status = newEntity.Status; existingScanResult.Description = newEntity.Description; this.db.Set <ImageScanResultEntity>().Update(existingScanResult); } // update in-progress check-results var checkResults = await this.db.Set <CheckResultEntity>() .Where(i => i.Value == CheckValue.InProgress && i.ComponentId.EndsWith(imageScanResult.ImageTag)) .ToArrayAsync(); foreach (var result in checkResults) { result.Value = imageScanResult.GetCheckResultValue().ToEntity(); result.Message = imageScanResult.GetCheckResultMessage(); this.db.Update(result); } await this.db.SaveChangesAsync(); }
private async Task <ImageScanResultWithCVEs> NormalizeRawData(AuditBlob auditBlob, AuditMetadata auditMetadata) { var auditDate = DateTimeOffset.FromUnixTimeSeconds(auditMetadata.Timestamp).DateTime; var scanResult = new ImageScanResultWithCVEs { Id = auditMetadata.AuditId, Date = auditDate, ImageTag = auditMetadata.ImageTag, }; if (auditMetadata.AuditResult != "succeeded") { var path = $"{auditBlob.ParentContainer.Name}/{auditBlob.Name}"; Logger.Warning( "Audit {AuditPath} result is {AuditResult} due: {FailureReason}", path, auditMetadata.AuditResult, auditMetadata.FailureDescription); scanResult.Status = ImageScanStatus.Failed; scanResult.Description = TrivyScanDescriptionNormalizer.ToHumanReadable(auditMetadata.FailureDescription); } else { var auditResultFilePath = $"{auditBlob.ParentContainer.Name}/{auditMetadata.TrivyAuditPath}"; var(entities, counters) = await this.ParseScanTargets(auditResultFilePath); scanResult.FoundCVEs = entities; scanResult.Counters = counters; scanResult.Status = ImageScanStatus.Succeeded; Logger.Information( "Successfully processed {ImageTag} image scan of {AuditDate} with {ScanSummary}", scanResult.ImageTag, scanResult.Date, scanResult.GetCheckResultMessage()); } return(scanResult); }