import { Server } from 'lucide-react'; import { useCurrentStateAndParams } from '@uirouter/react'; import { useMemo } from 'react'; import { Pod } from 'kubernetes-types/core/v1'; import { IndexOptional } from '@/react/kubernetes/configs/types'; import { createStore } from '@/react/kubernetes/datatables/default-kube-datatable-store'; import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; import { useEnvironment } from '@/react/portainer/environments/queries'; import { useKubernetesVersion } from '@/react/kubernetes/queries/useKubernetesVersion'; import { notifyError, notifySuccess } from '@/portainer/services/notifications'; import { TableSettingsMenu, TableSettingsMenuAutoRefresh } from '@@/datatables'; import { useTableState } from '@@/datatables/useTableState'; import { CardExpandableList } from '@@/datatables/CardExpandableList'; import { NestedDatatable } from '@@/datatables/NestedDatatable'; import { useApplication } from '../../queries/useApplication'; import { useApplicationPods } from '../../queries/useApplicationPods'; import { useDeletePodMutation } from '../../queries/useDeletePodMutation'; import { ContainerRowData, PodRowData } from './types'; import { getPodColumns } from './columns/pod'; import { getContainerColumns } from './columns/container'; import { computeContainerStatus } from './computeContainerStatus'; import { computePodStatus } from './computePodStatus'; const storageKey = 'k8sContainersDatatable'; const settingsStore = createStore(storageKey); export function ApplicationContainersDatatable() { const environmentId = useEnvironmentId(); const useServerMetricsQuery = useEnvironment( environmentId, (env) => !!env?.Kubernetes?.Configuration.UseServerMetrics ); const tableState = useTableState(settingsStore, storageKey); const { params: { name, namespace, 'resource-type': resourceType }, } = useCurrentStateAndParams(); const applicationQuery = useApplication( environmentId, namespace, name, resourceType, { autoRefreshRate: tableState.autoRefreshRate * 1000, } ); const podsQuery = useApplicationPods( environmentId, namespace, name, applicationQuery.data, { autoRefreshRate: tableState.autoRefreshRate * 1000, } ); const versionQuery = useKubernetesVersion(environmentId); const deletePodMutation = useDeletePodMutation( environmentId, namespace, name ); const podRows = useContainersRowData(podsQuery.data); const containerColumns = useMemo( () => getContainerColumns(!!useServerMetricsQuery.data), [useServerMetricsQuery.data] ); const podColumns = useMemo( () => getPodColumns({ supportsRestartStrategy: !!versionQuery.data?.supportsPodRestart, isDeleting: deletePodMutation.isLoading, isLoading: versionQuery.isLoading, onDelete: (podName) => { deletePodMutation.mutate( { podName }, { onSuccess: () => notifySuccess('Success', `Pod '${podName}' deleted`), onError: (error) => notifyError( 'Failure', error as Error, `Unable to delete pod '${podName}'` ), } ); }, }), [versionQuery, deletePodMutation] ); return (