From 8a07e81a3da6ea5e0e40caca3c7dfa2c896f1593 Mon Sep 17 00:00:00 2001 From: Hubert Date: Mon, 20 Oct 2025 14:28:57 +0200 Subject: [PATCH 1/3] fix --- src/components/Graphs/graphUtils.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/Graphs/graphUtils.ts b/src/components/Graphs/graphUtils.ts index 390eed08..6747943c 100644 --- a/src/components/Graphs/graphUtils.ts +++ b/src/components/Graphs/graphUtils.ts @@ -8,6 +8,17 @@ export const getStatusCondition = (conditions?: Condition[]): Condition | undefi return conditions.find((c) => c.type === 'Ready' || c.type === 'Healthy'); }; +export const resolveProviderTypeFromApiVersion = (apiVersion: string): string => { + // Extract domain from apiVersion (e.g. "account.btp.sap.crossplane.io/v1alpha1" -> "account.btp.sap.crossplane.io") + const domain = apiVersion.split('/')[0] || ''; + + // Remove "account" to normalize provider names + // e.g "account.btp.sap.crossplane.io" -> "btp.sap.crossplane.io" + const normalizedDomain = domain.replace(/^account\./, ''); + + return normalizedDomain || 'unknown'; +}; + export const resolveProviderType = (configName: string, providerConfigsList: ProviderConfigs[]): string => { for (const configList of providerConfigsList || []) { const match = configList.items?.find((item) => item.metadata?.name === configName); @@ -98,7 +109,7 @@ export function buildTreeData( const id = `${name}-${apiVersion}`; const kind = item?.kind; const providerConfigName = item?.spec?.providerConfigRef?.name ?? 'unknown'; - const providerType = resolveProviderType(providerConfigName, providerConfigsList); + const providerType = resolveProviderTypeFromApiVersion(apiVersion); const statusCond = getStatusCondition(item?.status?.conditions); const status = statusCond?.status === 'True' ? 'OK' : 'ERROR'; From e4b40307519d00f07d1d5e77fc1d6a08279b1c89 Mon Sep 17 00:00:00 2001 From: Hubert Date: Mon, 20 Oct 2025 14:34:18 +0200 Subject: [PATCH 2/3] removing old function + new tests --- src/components/Graphs/graphUtils.spec.ts | 47 ++++++++---------------- src/components/Graphs/graphUtils.ts | 17 --------- 2 files changed, 15 insertions(+), 49 deletions(-) diff --git a/src/components/Graphs/graphUtils.spec.ts b/src/components/Graphs/graphUtils.spec.ts index 15831bac..3e760f73 100644 --- a/src/components/Graphs/graphUtils.spec.ts +++ b/src/components/Graphs/graphUtils.spec.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi } from 'vitest'; -import { getStatusCondition, resolveProviderType, generateColorMap, buildTreeData } from './graphUtils'; +import { getStatusCondition, resolveProviderTypeFromApiVersion, generateColorMap, buildTreeData } from './graphUtils'; import { ProviderConfigs, ManagedResourceGroup, ManagedResourceItem } from '../../lib/shared/types'; describe('getStatusCondition', () => { @@ -26,41 +26,24 @@ describe('getStatusCondition', () => { }); }); -describe('resolveProviderType', () => { - it('returns correct providerType if found', () => { - const configs: ProviderConfigs[] = [ - { - provider: 'provider-a', - items: [ - { metadata: { name: 'foo' }, apiVersion: 'btp/v1' }, - { metadata: { name: 'bar' }, apiVersion: 'cloudfoundry/v1' }, - ], - }, - { - provider: 'provider-b', - items: [{ metadata: { name: 'baz' }, apiVersion: 'gardener/v1' }], - }, - ] as any; - expect(resolveProviderType('foo', configs)).toBe('provider-btp'); - expect(resolveProviderType('bar', configs)).toBe('provider-cf'); - expect(resolveProviderType('baz', configs)).toBe('provider-gardener'); +describe('resolveProviderTypeFromApiVersion', () => { + it('extracts domain from apiVersion and removes "account." prefix', () => { + expect(resolveProviderTypeFromApiVersion('account.btp.sap.crossplane.io/v1alpha1')).toBe('btp.sap.crossplane.io'); }); - it('returns apiVersion or configName if no match for known providers', () => { - const configs: ProviderConfigs[] = [ - { - provider: 'provider-a', - items: [{ metadata: { name: 'other' }, apiVersion: 'custom/v1' }], - }, - ] as any; - expect(resolveProviderType('other', configs)).toBe('custom/v1'); + it('extracts domain from apiVersion without "account." prefix', () => { + expect(resolveProviderTypeFromApiVersion('cloudfoundry.crossplane.io/v1alpha1')).toBe('cloudfoundry.crossplane.io'); + expect(resolveProviderTypeFromApiVersion('gardener.crossplane.io/v1beta1')).toBe('gardener.crossplane.io'); + expect(resolveProviderTypeFromApiVersion('kubernetes.crossplane.io/v1')).toBe('kubernetes.crossplane.io'); + }); + + it('returns "unknown" for empty apiVersion', () => { + expect(resolveProviderTypeFromApiVersion('')).toBe('unknown'); }); - it('returns configName if not found', () => { - const configs: ProviderConfigs[] = [ - { provider: 'provider-a', items: [{ metadata: { name: 'foo' }, apiVersion: 'btp/v1' }] }, - ] as any; - expect(resolveProviderType('notfound', configs)).toBe('notfound'); + it('handles apiVersion without version part', () => { + expect(resolveProviderTypeFromApiVersion('btp.sap.crossplane.io')).toBe('btp.sap.crossplane.io'); + expect(resolveProviderTypeFromApiVersion('account.btp.sap.crossplane.io')).toBe('btp.sap.crossplane.io'); }); }); diff --git a/src/components/Graphs/graphUtils.ts b/src/components/Graphs/graphUtils.ts index 6747943c..c45c0c04 100644 --- a/src/components/Graphs/graphUtils.ts +++ b/src/components/Graphs/graphUtils.ts @@ -19,23 +19,6 @@ export const resolveProviderTypeFromApiVersion = (apiVersion: string): string => return normalizedDomain || 'unknown'; }; -export const resolveProviderType = (configName: string, providerConfigsList: ProviderConfigs[]): string => { - for (const configList of providerConfigsList || []) { - const match = configList.items?.find((item) => item.metadata?.name === configName); - - if (match) { - const apiVersion = match.apiVersion?.toLowerCase() || ''; - if (apiVersion.includes('btp')) return 'provider-btp'; - if (apiVersion.includes('cloudfoundry')) return 'provider-cf'; - if (apiVersion.includes('gardener')) return 'provider-gardener'; - if (apiVersion.includes('kubernetes')) return 'provider-kubernetes'; - return apiVersion || configName; - } - } - - return configName; -}; - export const generateColorMap = (items: NodeData[], colorBy: string): Record => { const colors = [ '#FFC933', // MANGO 4 From bbcf4e92ded3f691a53a3bb4c3a3f0e6d6ccbeb0 Mon Sep 17 00:00:00 2001 From: Hubert Date: Tue, 28 Oct 2025 10:00:53 +0100 Subject: [PATCH 3/3] PR changes --- src/components/Graphs/graphUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Graphs/graphUtils.ts b/src/components/Graphs/graphUtils.ts index c45c0c04..00235285 100644 --- a/src/components/Graphs/graphUtils.ts +++ b/src/components/Graphs/graphUtils.ts @@ -10,7 +10,7 @@ export const getStatusCondition = (conditions?: Condition[]): Condition | undefi export const resolveProviderTypeFromApiVersion = (apiVersion: string): string => { // Extract domain from apiVersion (e.g. "account.btp.sap.crossplane.io/v1alpha1" -> "account.btp.sap.crossplane.io") - const domain = apiVersion.split('/')[0] || ''; + const domain = apiVersion?.split('/')[0] || ''; // Remove "account" to normalize provider names // e.g "account.btp.sap.crossplane.io" -> "btp.sap.crossplane.io"