feat: add Filesystems/ObjectStores pages, fix CSI selectors, remove app bar badge (#2)

- Remove AppBarClusterBadge registration (top-bar health bubble)
- Fix CSI pod selectors to match actual pod labels in this cluster
  (was: csi-rbdplugin-provisioner, now: rook-ceph.rbd.csi.ceph.com-ctrlplugin)
- Add FilesystemsPage with detail drawer (Active MDS, data pools, status)
- Add ObjectStoresPage with detail drawer (gateway port, instances, endpoints)
- Register Filesystems and Object Stores as sidebar entries with routes
- Enhance PodsPage OSD table with OSD ID, device class, store type,
  and failure domain columns from pod labels

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
This commit was merged in pull request #2.
This commit is contained in:
2026-02-18 21:23:53 -05:00
committed by GitHub
parent 91e50fc316
commit c30fc18b43
7 changed files with 412 additions and 23 deletions
+35 -1
View File
@@ -39,6 +39,40 @@ function PodTable({ pods, title }: { pods: RookCephPod[]; title: string }) {
);
}
function OsdTable({ pods }: { pods: RookCephPod[] }) {
if (pods.length === 0) return null;
return (
<SectionBox title={`OSDs (${pods.length})`}>
<SimpleTable
columns={[
{ label: 'OSD ID', getter: (p) => p.metadata.labels?.['osd'] ?? p.metadata.name },
{
label: 'Status',
getter: (p) => {
const st = isPodReady(p) ? 'success' : p.status?.phase === 'Pending' ? 'warning' : 'error';
return (
<StatusLabel status={st}>
{p.status?.phase ?? 'Unknown'}
</StatusLabel>
);
},
},
{
label: 'Node',
getter: (p) => p.spec?.nodeName ?? p.metadata.labels?.['topology-location-host'] ?? '—',
},
{ label: 'Device Class', getter: (p) => p.metadata.labels?.['device-class'] ?? '—' },
{ label: 'Store', getter: (p) => p.metadata.labels?.['osd-store'] ?? '—' },
{ label: 'Failure Domain', getter: (p) => p.metadata.labels?.['failure-domain'] ?? '—' },
{ label: 'Restarts', getter: (p) => String(getPodRestarts(p)) },
{ label: 'Age', getter: (p) => formatAge(p.metadata.creationTimestamp) },
]}
data={pods}
/>
</SectionBox>
);
}
export default function PodsPage() {
const {
operatorPods,
@@ -84,7 +118,7 @@ export default function PodsPage() {
<PodTable pods={operatorPods} title="Operator" />
<PodTable pods={monPods} title="Monitors (MON)" />
<PodTable pods={mgrPods} title="Managers (MGR)" />
<PodTable pods={osdPods} title="OSDs" />
<OsdTable pods={osdPods} />
<PodTable pods={csiRbdPods} title="CSI RBD Provisioner" />
<PodTable pods={csiCephfsPods} title="CSI CephFS Provisioner" />