/** * StorageClassesPage — lists Rook-Ceph StorageClasses. */ import { Loader, NameValueTable, SectionBox, SectionHeader, SimpleTable, StatusLabel, } from '@kinvolk/headlamp-plugin/lib/CommonComponents'; import React, { useState } from 'react'; import { formatAge, formatStorageType, RookCephStorageClass, storageClassType } from '../api/k8s'; import { useRookCephContext } from '../api/RookCephDataContext'; function StorageClassDetail({ sc, pvCount, onClose }: { sc: RookCephStorageClass; pvCount: number; onClose: () => void }) { const type = storageClassType(sc); return (
{sc.metadata.name}
{sc.parameters && Object.keys(sc.parameters).length > 0 && ( ({ name: k, value: v ?? '—' }))} /> )}
); } export default function StorageClassesPage() { const { storageClasses, persistentVolumes, loading, error } = useRookCephContext(); const [selected, setSelected] = useState(null); if (loading) return ; const pvCountByClass = new Map(); for (const pv of persistentVolumes) { const sc = pv.spec.storageClassName ?? ''; pvCountByClass.set(sc, (pvCountByClass.get(sc) ?? 0) + 1); } return ( <> {error && ( {error} }]} /> )} {storageClasses.length === 0 ? ( ) : ( ( ), }, { label: 'Type', getter: (sc: RookCephStorageClass) => ( {formatStorageType(storageClassType(sc))} ), }, { label: 'Provisioner', getter: (sc: RookCephStorageClass) => sc.provisioner }, { label: 'Pool', getter: (sc: RookCephStorageClass) => sc.parameters?.['pool'] ?? '—' }, { label: 'Reclaim', getter: (sc: RookCephStorageClass) => sc.reclaimPolicy ?? '—' }, { label: 'Expansion', getter: (sc: RookCephStorageClass) => sc.allowVolumeExpansion ? 'Yes' : 'No' }, { label: 'PVs', getter: (sc: RookCephStorageClass) => String(pvCountByClass.get(sc.metadata.name) ?? 0) }, { label: 'Age', getter: (sc: RookCephStorageClass) => formatAge(sc.metadata.creationTimestamp) }, ]} data={storageClasses} /> )} {selected && ( <>
setSelected(null)} /> setSelected(null)} /> )} ); }