up
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Reachability Corpus Validation / validate-corpus (push) Has been cancelled
Reachability Corpus Validation / validate-ground-truths (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Reachability Corpus Validation / determinism-check (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
Signals CI & Image / signals-ci (push) Has been cancelled
Signals Reachability Scoring & Events / reachability-smoke (push) Has been cancelled
Signals Reachability Scoring & Events / sign-and-upload (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Reachability Corpus Validation / validate-corpus (push) Has been cancelled
Reachability Corpus Validation / validate-ground-truths (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Reachability Corpus Validation / determinism-check (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
This commit is contained in:
@@ -37,6 +37,15 @@ internal static class RuntimeEndpoints
|
||||
.Produces(StatusCodes.Status400BadRequest)
|
||||
.Produces(StatusCodes.Status429TooManyRequests)
|
||||
.RequireAuthorization(ScannerPolicies.RuntimeIngest);
|
||||
|
||||
runtime.MapPost("/reconcile", HandleRuntimeReconcileAsync)
|
||||
.WithName("scanner.runtime.reconcile")
|
||||
.WithSummary("Reconcile runtime-observed libraries against SBOM inventory")
|
||||
.WithDescription("Compares libraries observed at runtime against the static SBOM to identify discrepancies")
|
||||
.Produces<RuntimeReconcileResponseDto>(StatusCodes.Status200OK)
|
||||
.Produces(StatusCodes.Status400BadRequest)
|
||||
.Produces(StatusCodes.Status404NotFound)
|
||||
.RequireAuthorization(ScannerPolicies.RuntimeIngest);
|
||||
}
|
||||
|
||||
private static async Task<IResult> HandleRuntimeEventsAsync(
|
||||
@@ -234,6 +243,75 @@ internal static class RuntimeEndpoints
|
||||
return null;
|
||||
}
|
||||
|
||||
private static async Task<IResult> HandleRuntimeReconcileAsync(
|
||||
RuntimeReconcileRequestDto request,
|
||||
IRuntimeInventoryReconciler reconciler,
|
||||
HttpContext context,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(request);
|
||||
ArgumentNullException.ThrowIfNull(reconciler);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(request.ImageDigest))
|
||||
{
|
||||
return ProblemResultFactory.Create(
|
||||
context,
|
||||
ProblemTypes.Validation,
|
||||
"Invalid reconciliation request",
|
||||
StatusCodes.Status400BadRequest,
|
||||
detail: "imageDigest is required.");
|
||||
}
|
||||
|
||||
var reconcileRequest = new RuntimeReconciliationRequest
|
||||
{
|
||||
ImageDigest = request.ImageDigest,
|
||||
RuntimeEventId = request.RuntimeEventId,
|
||||
MaxMisses = request.MaxMisses > 0 ? request.MaxMisses : 100
|
||||
};
|
||||
|
||||
var result = await reconciler.ReconcileAsync(reconcileRequest, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var responseDto = new RuntimeReconcileResponseDto
|
||||
{
|
||||
ImageDigest = result.ImageDigest,
|
||||
RuntimeEventId = result.RuntimeEventId,
|
||||
SbomArtifactId = result.SbomArtifactId,
|
||||
TotalRuntimeLibraries = result.TotalRuntimeLibraries,
|
||||
TotalSbomComponents = result.TotalSbomComponents,
|
||||
MatchCount = result.MatchCount,
|
||||
MissCount = result.MissCount,
|
||||
Misses = result.Misses
|
||||
.Select(m => new RuntimeLibraryMissDto
|
||||
{
|
||||
Path = m.Path,
|
||||
Sha256 = m.Sha256,
|
||||
Inode = m.Inode
|
||||
})
|
||||
.ToList(),
|
||||
Matches = result.Matches
|
||||
.Select(m => new RuntimeLibraryMatchDto
|
||||
{
|
||||
RuntimePath = m.RuntimePath,
|
||||
RuntimeSha256 = m.RuntimeSha256,
|
||||
SbomComponentKey = m.SbomComponentKey,
|
||||
SbomComponentName = m.SbomComponentName,
|
||||
MatchType = m.MatchType
|
||||
})
|
||||
.ToList(),
|
||||
ReconciledAt = result.ReconciledAt,
|
||||
ErrorCode = result.ErrorCode,
|
||||
ErrorMessage = result.ErrorMessage
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(result.ErrorCode) &&
|
||||
result.ErrorCode is "RUNTIME_EVENT_NOT_FOUND" or "NO_RUNTIME_EVENTS")
|
||||
{
|
||||
return Json(responseDto, StatusCodes.Status404NotFound);
|
||||
}
|
||||
|
||||
return Json(responseDto, StatusCodes.Status200OK);
|
||||
}
|
||||
|
||||
private static string NormalizeSegment(string segment)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(segment))
|
||||
|
||||
Reference in New Issue
Block a user