2.3 KiB
2.3 KiB
Per-Layer SBOM Export API
Module
Scanner
Status
IMPLEMENTED
Description
Per-layer SBOMs stored as individual CAS artifacts with API endpoints to retrieve layer-specific SBOMs (GET /scans/{id}/layers, GET /scans/{id}/layers/{digest}/sbom with format param), content negotiation, immutable caching (ETag, Cache-Control), and CLI commands (stella scan layer-sbom, stella scan recipe).
Implementation Details
- API Endpoints:
src/Scanner/StellaOps.Scanner.WebService/Endpoints/LayerSbomEndpoints.cs-LayerSbomEndpointswithGET /scans/{id}/layers(list layers) andGET /scans/{id}/layers/{digest}/sbom(retrieve per-layer SBOM with format negotiation)src/Scanner/StellaOps.Scanner.WebService/Endpoints/ScanEndpoints.cs- Scan endpoints integrating per-layer SBOM access
- Layer SBOM Service:
src/Scanner/StellaOps.Scanner.WebService/Services/ILayerSbomService.cs-ILayerSbomServiceinterface for layer SBOM operationssrc/Scanner/StellaOps.Scanner.WebService/Services/LayerSbomService.cs-LayerSbomServicemanages per-layer SBOM retrieval with content negotiation (SPDX, CycloneDX) and immutable cachingsrc/Scanner/StellaOps.Scanner.WebService/Services/SurfacePointerService.cs-SurfacePointerServicetracks surface-level pointers for layer SBOMs
- Layer SBOM Composition:
src/Scanner/__Libraries/StellaOps.Scanner.Emit/Composition/LayerSbomComposer.cs- Composes per-layer SBOMssrc/Scanner/__Libraries/StellaOps.Scanner.Emit/Composition/SpdxLayerWriter.cs- SPDX format layer SBOM writersrc/Scanner/__Libraries/StellaOps.Scanner.Emit/Composition/CycloneDxLayerWriter.cs- CycloneDX format layer SBOM writer
E2E Test Plan
- Call
GET /scans/{id}/layersand verify a list of container layers with digests and sizes is returned - Call
GET /scans/{id}/layers/{digest}/sbom?format=spdxand verify a valid SPDX SBOM is returned for the specific layer - Call
GET /scans/{id}/layers/{digest}/sbom?format=cyclonedxand verify a valid CycloneDX SBOM is returned - Verify ETag and Cache-Control headers are set for immutable caching of per-layer SBOMs
- Verify content negotiation via Accept header works as an alternative to the format query parameter
- Verify requesting a non-existent layer digest returns 404