From 1249f00d8601992e064a5a5ad9b2680b05ed3171 Mon Sep 17 00:00:00 2001 From: castrojo Date: Tue, 8 Sep 2026 15:20:25 +0000 Subject: [PATCH] fix(feed-items): supply NVIDIA versions at the data shape the release feed consumes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FeedItems.tsx reads app.osInfo.majorPackages.NVIDIA from static/data/firehose-apps.json, but fetch-firehose.js only ever wrote Podman, systemd, and bootc into majorPackages — NVIDIA ships as an akmod built outside the OS image so it never shows up in the Syft SBOM scan for the OS stream itself. Reuse the companion-stream NVIDIA lookup already built for the Driver Versions page (fetch-github-driver-versions.js) so buildOsApp can resolve the matching NVIDIA driver version for the latest bluefin-stable and bluefin-lts release and add it to osInfo.majorPackages.NVIDIA. Fixes #1096 Signed-off-by: castrojo --- scripts/fetch-firehose.js | 41 +++++++++++++++++++++++-- scripts/fetch-firehose.test.js | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/scripts/fetch-firehose.js b/scripts/fetch-firehose.js index 121604cb6..f1f9f232a 100644 --- a/scripts/fetch-firehose.js +++ b/scripts/fetch-firehose.js @@ -1,11 +1,40 @@ const fs = require("fs"); const path = require("path"); +const { + buildNvidiaMapFromSbomStream, + buildLtsNvidiaByTagFromSbom, + resolveCompanionNvidia, +} = require("./fetch-github-driver-versions.js"); + const OUTPUT_DIR = path.join(__dirname, "..", "static", "data"); const OUTPUT_FILE = path.join(OUTPUT_DIR, "firehose-apps.json"); const SBOM_FILE = path.join(OUTPUT_DIR, "sbom-attestations.json"); const SOURCE_URL = "https://castrojo.github.io/bluefin-releases/apps.json"; +/** + * Per-OS-stream builders for the companion NVIDIA release map. + * NVIDIA ships as an akmod built outside the OS image (not in Syft scans), + * so its version has to be looked up from a companion SBOM stream — same + * approach fetch-github-driver-versions.js uses for the Driver Versions page. + */ +const NVIDIA_MAP_BUILDER_BY_STREAM = { + "bluefin-stable": (sbomCache) => + buildNvidiaMapFromSbomStream(sbomCache, "bluefin-nvidia-open-stable"), + "bluefin-lts": (sbomCache) => buildLtsNvidiaByTagFromSbom(sbomCache), +}; + +/** + * Resolve the NVIDIA driver version for a release entry of a given OS stream. + * Returns null when the stream has no companion NVIDIA map or no match is found. + */ +function resolveNvidiaVersion(streamId, sbomCache, releaseEntry, cacheKey) { + const buildMap = NVIDIA_MAP_BUILDER_BY_STREAM[streamId]; + if (!buildMap) return null; + const nvidiaByTag = buildMap(sbomCache); + return resolveCompanionNvidia(nvidiaByTag, releaseEntry, cacheKey); +} + // Cache configuration — match the 6h pipeline schedule of bluefin-releases. // Set FIREHOSE_CACHE_HOURS=0 to always fetch (used in CI via pages.yml). const CACHE_MAX_AGE_HOURS = Number(process.env.FIREHOSE_CACHE_HOURS ?? 6); @@ -69,7 +98,7 @@ function sortedReleases(stream) { * Build a FirehoseOsInfo object from a SBOM packageVersions record. * Returns null if packageVersions is absent. */ -function buildOsInfo(streamId, packageVersions) { +function buildOsInfo(streamId, packageVersions, nvidiaVersion = null) { if (!packageVersions) return null; const info = { stream: streamId }; @@ -83,6 +112,8 @@ function buildOsInfo(streamId, packageVersions) { if (packageVersions.podman) majorPackages["Podman"] = packageVersions.podman; if (packageVersions.systemd) majorPackages["systemd"] = packageVersions.systemd; if (packageVersions.bootc) majorPackages["bootc"] = packageVersions.bootc; + const nvidia = packageVersions.nvidia || nvidiaVersion; + if (nvidia) majorPackages["NVIDIA"] = nvidia; if (Object.keys(majorPackages).length > 0) { info.majorPackages = majorPackages; @@ -157,7 +188,13 @@ function buildOsApp(spec, sbomCache) { currentReleaseDate = `${currentReleaseVersion}T00:00:00Z`; updatedAt = currentReleaseDate; } - osInfo = buildOsInfo(spec.streamId, latestWithVersions.packageVersions); + const nvidiaVersion = resolveNvidiaVersion( + spec.streamId, + sbomCache, + latestWithVersions, + latestWithVersions.cacheKey, + ); + osInfo = buildOsInfo(spec.streamId, latestWithVersions.packageVersions, nvidiaVersion); } else if (releases.length > 0) { // Have releases but none with packageVersions yet (SBOM not populated for this entry) const first = releases[0]; diff --git a/scripts/fetch-firehose.test.js b/scripts/fetch-firehose.test.js index 676b8c5de..41ae8befc 100644 --- a/scripts/fetch-firehose.test.js +++ b/scripts/fetch-firehose.test.js @@ -42,6 +42,61 @@ test("buildOsInfo keeps core OS versions and major packages", () => { }); }); +test("buildOsInfo includes NVIDIA when packageVersions has it directly", () => { + const info = buildOsInfo("bluefin-stable", { + kernel: "6.14.0", + podman: "5.4", + nvidia: "580.65.06", + }); + + assert.equal(info.majorPackages.NVIDIA, "580.65.06"); +}); + +test("buildOsInfo includes NVIDIA from the companion-stream lookup fallback", () => { + const info = buildOsInfo( + "bluefin-stable", + { kernel: "6.14.0", podman: "5.4" }, + "580.65.06", + ); + + assert.equal(info.majorPackages.NVIDIA, "580.65.06"); +}); + +test("buildOsApp resolves NVIDIA for bluefin-stable from the bluefin-nvidia-open-stable companion stream", () => { + const spec = { + streamId: "bluefin-stable", + appId: "bluefin-os-stable", + name: "Bluefin OS (Stable)", + summary: "Stable track", + ghReleasesUrl: "https://github.com/projectbluefin/bluefin/releases", + }; + const sbomCache = { + streams: { + "bluefin-stable": { + releases: { + "stable-20260402": { + tag: "stable-20260402", + packageVersions: { kernel: "6.14.1", podman: "5.8.2", systemd: "259.5", bootc: "1.15.2" }, + }, + }, + }, + "bluefin-nvidia-open-stable": { + releases: { + "nvidia-open-stable-20260402": { + tag: "nvidia-open-stable-20260402", + packageVersions: { nvidia: "580.65.06" }, + }, + }, + }, + }, + }; + + const app = buildOsApp(spec, sbomCache); + + assert.equal(app.osInfo.majorPackages.NVIDIA, "580.65.06"); + assert.equal(app.osInfo.majorPackages.Podman, "5.8.2"); +}); + test("buildOsApp picks the newest populated release and computes package diffs", () => { const spec = { streamId: "bluefin-stable",