1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-19 05:19:39 +02:00
portainer/app/react/kubernetes/helm/HelmApplicationView/ReleaseDetails/ResourcesTable/useResourceRows.ts

97 lines
2.4 KiB
TypeScript

import { useMemo } from 'react';
import { StatusBadgeType } from '@@/StatusBadge';
import { GenericResource } from '../../../types';
import { ResourceLink, ResourceRow } from './types';
// from defined routes in app/kubernetes/__module.js
const kindToUrlMap = {
Deployment: 'kubernetes.applications.application',
DaemonSet: 'kubernetes.applications.application',
StatefulSet: 'kubernetes.applications.application',
Pod: 'kubernetes.applications.application',
Ingress: 'kubernetes.ingresses',
ConfigMap: 'kubernetes.configmaps.configmap',
Secret: 'kubernetes.secrets.secret',
PersistentVolumeClaim: 'kubernetes.volumes.volume',
};
const statusToColorMap: Record<string, StatusBadgeType> = {
Healthy: 'success',
Progressing: 'warning',
Degraded: 'danger',
Failed: 'danger',
Unhealthy: 'danger',
Unknown: 'mutedLite',
};
export function useResourceRows(resources?: GenericResource[]): ResourceRow[] {
return useMemo(() => getResourceRows(resources), [resources]);
}
function getResourceRows(resources?: GenericResource[]): ResourceRow[] {
if (!resources) {
return [];
}
return resources.map(getResourceRow);
}
function getResourceRow(resource: GenericResource): ResourceRow {
const {
reason = '',
status = '',
message = '',
} = resource.status.healthSummary || {};
return {
id: `${resource.kind}/${resource.metadata.name}/${resource.metadata.namespace}`,
name: {
label: resource.metadata.name,
link: getResourceLink(resource),
},
resourceType: resource.kind ?? '-',
describe: {
name: resource.metadata.name,
namespace: resource.metadata.namespace,
resourceType: resource.kind,
},
status: {
label: reason ?? 'Unknown',
type: statusToColorMap[status] ?? 'default',
},
statusMessage: message ?? '-',
};
}
function getResourceLink(resource: GenericResource): ResourceLink | null {
const { namespace, name } = resource.metadata;
const to = kindToUrlMap[resource.kind as keyof typeof kindToUrlMap];
// If the resource kind is not supported, return null
if (!to) {
return null;
}
// If the resource is not namespaced, return the link to the resource with the name only
if (!namespace) {
return {
to,
params: {
name,
},
};
}
// If the resource is namespaced, return the link to the resource with the namespace and name
return {
to,
params: {
namespace,
name,
},
};
}