Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3e757db799 | |||
| 81b0b35089 |
+18
-1
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.2.2] - 2026-02-19
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **Duplicate columns** — Protocol and Pool columns on mixed-driver clusters (tns-csi + rook-ceph) are now merged into a single shared column rather than duplicated; whichever plugin loads first owns the column and the second merges into it
|
||||||
|
- **Plugin settings name** — settings entry now registers as `tns-csi` instead of `headlamp-tns-csi-plugin`
|
||||||
|
|
||||||
|
## [0.2.1] - 2026-02-19
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **OverviewPage crash** — brace mismatch in `TnsCsiDataContext` placed TrueNAS pool stats fetch outside the outer try block, breaking the entire context provider
|
||||||
|
- **PV Pool column** — tns-csi driver writes `datasetName` (e.g. `pool0/pvc-abc`), not `pool`, into `volumeAttributes`; Pool is now correctly derived from the first path segment
|
||||||
|
- **App bar badge removed** — removed the colored tns-csi status bubble from the top nav bar
|
||||||
|
|
||||||
## [0.2.0] - 2026-02-18
|
## [0.2.0] - 2026-02-18
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -47,6 +62,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- TypeScript strict mode with zero `any` types
|
- TypeScript strict mode with zero `any` types
|
||||||
- ESLint + Prettier code quality tooling
|
- ESLint + Prettier code quality tooling
|
||||||
|
|
||||||
[Unreleased]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.0...HEAD
|
[Unreleased]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.2...HEAD
|
||||||
|
[0.2.2]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.1...v0.2.2
|
||||||
|
[0.2.1]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.2.0...v0.2.1
|
||||||
[0.2.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.1.0...v0.2.0
|
[0.2.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/compare/v0.1.0...v0.2.0
|
||||||
[0.1.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/tag/v0.1.0
|
[0.1.0]: https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/tag/v0.1.0
|
||||||
|
|||||||
+7
-13
@@ -1,4 +1,4 @@
|
|||||||
version: "0.2.1"
|
version: "0.2.2"
|
||||||
name: headlamp-tns-csi-plugin
|
name: headlamp-tns-csi-plugin
|
||||||
displayName: TrueNAS CSI (tns-csi)
|
displayName: TrueNAS CSI (tns-csi)
|
||||||
description: >-
|
description: >-
|
||||||
@@ -47,19 +47,13 @@ links:
|
|||||||
url: https://github.com/longhorn/kbench
|
url: https://github.com/longhorn/kbench
|
||||||
|
|
||||||
changes:
|
changes:
|
||||||
- kind: added
|
- kind: fixed
|
||||||
description: "Overview dashboard: driver health, storage summary, protocol distribution, non-Bound PVC alerts"
|
description: "Duplicate Protocol/Pool columns on mixed-driver clusters now merged into a single shared column"
|
||||||
- kind: added
|
- kind: fixed
|
||||||
description: "Storage Classes, Volumes, Snapshots pages with slide-in detail panels"
|
description: "Plugin settings entry renamed from headlamp-tns-csi-plugin to tns-csi"
|
||||||
- kind: added
|
|
||||||
description: "Metrics page: Prometheus WebSocket health, volume ops, CSI ops from controller pod"
|
|
||||||
- kind: added
|
|
||||||
description: "Benchmark page: kbench Job+PVC lifecycle, FIO log parser, results with IOPS/bandwidth/latency cards"
|
|
||||||
- kind: added
|
|
||||||
description: "PVC detail injection: TNS-CSI section on Headlamp PVC detail pages"
|
|
||||||
|
|
||||||
annotations:
|
annotations:
|
||||||
headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/download/v0.2.1/headlamp-tns-csi-plugin-0.2.1.tar.gz"
|
headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-tns-csi-plugin/releases/download/v0.2.2/headlamp-tns-csi-plugin-0.2.2.tar.gz"
|
||||||
headlamp/plugin/archive-checksum: "sha256:9d53ae89996be6edbfbdb239c95d9d808fcab2de19c23b8f7b8d9abe1c51877b"
|
headlamp/plugin/archive-checksum: "sha256:fa6506d581ea5a609598912596995f3dd2b2501ee4f66aff5f6cd93beb525549"
|
||||||
headlamp/plugin/version-compat: ">=0.20.0"
|
headlamp/plugin/version-compat: ">=0.20.0"
|
||||||
headlamp/plugin/distro-compat: "in-cluster,web,app"
|
headlamp/plugin/distro-compat: "in-cluster,web,app"
|
||||||
|
|||||||
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "headlamp-tns-csi-plugin",
|
"name": "headlamp-tns-csi-plugin",
|
||||||
"version": "0.2.1",
|
"version": "0.2.2",
|
||||||
"description": "Headlamp plugin for TNS-CSI driver visibility and benchmarking",
|
"description": "Headlamp plugin for TNS-CSI driver visibility and benchmarking",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
+31
-3
@@ -187,12 +187,40 @@ registerDetailsViewSection(({ resource }) => {
|
|||||||
// Table column processors — native StorageClass and PV tables
|
// Table column processors — native StorageClass and PV tables
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Merges incoming columns into existing ones by label.
|
||||||
|
// If a column with the same label already exists, the incoming getValue/render
|
||||||
|
// takes priority and falls back to the existing one (for mixed-driver tables).
|
||||||
|
function mergeColumns<T>(
|
||||||
|
existing: T[],
|
||||||
|
incoming: Array<{ label: string; getValue: (r: unknown) => unknown; render: (r: unknown) => React.ReactNode }>
|
||||||
|
): T[] {
|
||||||
|
type ObjCol = { label: string; getValue: (r: unknown) => unknown; render: (r: unknown) => React.ReactNode };
|
||||||
|
const isObjCol = (c: unknown): c is ObjCol =>
|
||||||
|
typeof c === 'object' && c !== null && 'label' in c;
|
||||||
|
const result = [...existing];
|
||||||
|
const toAppend: typeof incoming = [];
|
||||||
|
for (const col of incoming) {
|
||||||
|
const idx = result.findIndex(c => isObjCol(c) && (c as ObjCol).label === col.label);
|
||||||
|
if (idx !== -1) {
|
||||||
|
const prev = result[idx] as ObjCol;
|
||||||
|
result[idx] = {
|
||||||
|
label: col.label,
|
||||||
|
getValue: (r: unknown) => col.getValue(r) ?? prev.getValue(r),
|
||||||
|
render: (r: unknown) => col.getValue(r) !== null ? col.render(r) : prev.render(r),
|
||||||
|
} as unknown as T;
|
||||||
|
} else {
|
||||||
|
toAppend.push(col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [...result, ...(toAppend as unknown as T[])];
|
||||||
|
}
|
||||||
|
|
||||||
registerResourceTableColumnsProcessor(({ id, columns }) => {
|
registerResourceTableColumnsProcessor(({ id, columns }) => {
|
||||||
if (id === 'headlamp-storageclasses') {
|
if (id === 'headlamp-storageclasses') {
|
||||||
return [...columns, ...buildStorageClassColumns()];
|
return mergeColumns(columns, buildStorageClassColumns());
|
||||||
}
|
}
|
||||||
if (id === 'headlamp-persistentvolumes') {
|
if (id === 'headlamp-persistentvolumes') {
|
||||||
return [...columns, ...buildPVColumns()];
|
return mergeColumns(columns, buildPVColumns());
|
||||||
}
|
}
|
||||||
return columns;
|
return columns;
|
||||||
});
|
});
|
||||||
@@ -210,4 +238,4 @@ registerDetailsViewHeaderAction(({ resource }) => {
|
|||||||
// Plugin settings
|
// Plugin settings
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
registerPluginSettings('headlamp-tns-csi-plugin', TnsCsiSettings, true);
|
registerPluginSettings('tns-csi', TnsCsiSettings, true);
|
||||||
|
|||||||
Reference in New Issue
Block a user