From 1759484947d04eace772cf27555f1d6d96d8b526 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 1 Jul 2026 14:30:30 -0400 Subject: [PATCH] Match operator lifecycle versions by major.minor only The lifecycle data spec (REQ-VER-01) requires version names to be MAJOR.MINOR format only. Remove the unnecessary exact-match path in findVersionEntry and match solely on major.minor. See: https://github.com/release-engineering/fbc-update-planner/blob/main/docs/VALIDATION_RULES.md Co-Authored-By: Claude Opus 4.6 (1M context) --- .../__tests__/operator-lifecycle-status.spec.tsx | 10 ++++++++++ .../src/components/operator-lifecycle-status.tsx | 9 +++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/frontend/packages/operator-lifecycle-manager/src/components/__tests__/operator-lifecycle-status.spec.tsx b/frontend/packages/operator-lifecycle-manager/src/components/__tests__/operator-lifecycle-status.spec.tsx index a53f67cc2cb..c4ffd63d642 100644 --- a/frontend/packages/operator-lifecycle-manager/src/components/__tests__/operator-lifecycle-status.spec.tsx +++ b/frontend/packages/operator-lifecycle-manager/src/components/__tests__/operator-lifecycle-status.spec.tsx @@ -81,6 +81,10 @@ describe('getClusterCompatibility', () => { expect(getClusterCompatibility(lifecycle, '2.0.1', '4.17.0')).toBe('compatible'); expect(getClusterCompatibility(lifecycle, '2.0.1', '4.14.0')).toBe('incompatible'); }); + + it('returns no data for an invalid operator version', () => { + expect(getClusterCompatibility(lifecycle, 'latest', '4.15.0')).toBe('no-data'); + }); }); describe('getSupportPhase', () => { @@ -183,6 +187,12 @@ describe('getSupportPhase', () => { expect(getSupportPhase(noPhases, '1.0')).toEqual({ status: SupportPhaseStatus.NoData }); }); + it('returns no data for an invalid operator version', () => { + expect(getSupportPhase(lifecycle, 'latest', new Date('2024-03-15'))).toEqual({ + status: SupportPhaseStatus.NoData, + }); + }); + it('matches operator version by minor version when exact match fails', () => { const result = getSupportPhase(lifecycle, '1.0.5', new Date('2024-03-15')); expect(result).toEqual({ diff --git a/frontend/packages/operator-lifecycle-manager/src/components/operator-lifecycle-status.tsx b/frontend/packages/operator-lifecycle-manager/src/components/operator-lifecycle-status.tsx index d965af04413..55ebdbc32ec 100644 --- a/frontend/packages/operator-lifecycle-manager/src/components/operator-lifecycle-status.tsx +++ b/frontend/packages/operator-lifecycle-manager/src/components/operator-lifecycle-status.tsx @@ -54,10 +54,11 @@ const findVersionEntry = ( if (!operatorVersion) { return versions[0]; } - return ( - versions.find((v) => v.name === operatorVersion) ?? - versions.find((v) => parseMinorVersion(v.name) === parseMinorVersion(operatorVersion)) - ); + const minor = parseMinorVersion(operatorVersion); + if (minor === undefined) { + return undefined; + } + return versions.find((v) => parseMinorVersion(v.name) === minor); }; export type CompatibilityResult = 'compatible' | 'incompatible' | 'no-data';