/** * 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 (
{ if (e.key === 'Escape') onClose(); }} style={{ position: 'fixed', top: 0, right: 0, bottom: 0, width: '480px', backgroundColor: 'var(--mui-palette-background-paper, #fff)', boxShadow: '-4px 0 16px rgba(0,0,0,0.15)', zIndex: 1300, overflowY: 'auto', padding: '24px', }} >
{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)} /> )} ); }