Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 15 additions & 32 deletions src/components/Graphs/graphUtils.spec.ts
Original file line number Diff line number Diff line change
@@ -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', () => {
Expand All @@ -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');
});
});

Expand Down
24 changes: 9 additions & 15 deletions src/components/Graphs/graphUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,15 @@ export const getStatusCondition = (conditions?: Condition[]): Condition | undefi
return conditions.find((c) => c.type === 'Ready' || c.type === 'Healthy');
};

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;
}
}
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 configName;
return normalizedDomain || 'unknown';
};

export const generateColorMap = (items: NodeData[], colorBy: string): Record<string, string> => {
Expand Down Expand Up @@ -98,7 +92,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';

Expand Down
Loading