From 786e46c071e7a3e14da9b8223211d6e1d12f46db Mon Sep 17 00:00:00 2001 From: Zaggy21 Date: Thu, 2 Jul 2026 16:35:07 +0200 Subject: [PATCH 1/5] feat(greenhouse): add pluginDefinitionVersion to schema and PluginPreset list On-behalf-of: @SAP krzysztof.zagorski@sap.com Signed-off-by: Zaggy21 --- .../PluginPresets/PluginPresetsDataGrid/DataRows/index.tsx | 1 + .../admin/PluginPresets/PluginPresetsDataGrid/index.test.tsx | 4 ++++ .../admin/PluginPresets/PluginPresetsDataGrid/index.tsx | 5 +++-- .../src/components/admin/__mocks__/pluginPresets.ts | 1 + apps/greenhouse/src/components/admin/types/schema.d.ts | 2 ++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/DataRows/index.tsx b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/DataRows/index.tsx index c94aa788af..b20d711227 100644 --- a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/DataRows/index.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/DataRows/index.tsx @@ -65,6 +65,7 @@ export const DataRows = ({ colSpan }: DataRowsProps) => { {preset.spec?.plugin?.pluginDefinitionRef.name || preset.spec?.plugin?.pluginDefinition} + {preset.status?.pluginDefinitionVersion ?? "--"} {!isReady(preset) ? getReadyCondition(preset)?.message : ""} {preset.metadata?.labels?.[SUPPORT_GROUP_LABEL]} diff --git a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.test.tsx b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.test.tsx index c16ad261ec..cfea749eb5 100644 --- a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.test.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.test.tsx @@ -76,6 +76,7 @@ describe("PluginPresetsDataGrid", () => { expect(screen.getByText("Instances")).toBeInTheDocument() expect(screen.getByText("Name")).toBeInTheDocument() expect(screen.getByText("PluginDefinition")).toBeInTheDocument() + expect(screen.getByText("Version")).toBeInTheDocument() expect(screen.getByText("Message")).toBeInTheDocument() // Check for data - verify all 5 presets are rendered @@ -85,6 +86,9 @@ describe("PluginPresetsDataGrid", () => { expect(screen.getByText("preset-4")).toBeInTheDocument() expect(screen.getByText("preset-5")).toBeInTheDocument() + // Check version is displayed + expect(screen.getByText("1.2.3")).toBeInTheDocument() + // Check some instance counts expect(screen.getByText("2/3")).toBeInTheDocument() expect(screen.getByText("0/2")).toBeInTheDocument() diff --git a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.tsx b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.tsx index f515f24401..bf0d50fef6 100644 --- a/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresets/PluginPresetsDataGrid/index.tsx @@ -11,12 +11,12 @@ import { LoadingDataRow } from "../../common/LoadingDataRow" import { ErrorBoundary } from "../../common/ErrorBoundary" import { getErrorDataRowComponent } from "../../common/getErrorDataRow" -const COLUMN_SPAN = 7 +const COLUMN_SPAN = 8 export const PluginPresetsDataGrid = () => { const { filterSettings } = useLoaderData({ from: "/admin/plugin-presets/" }) return ( - + @@ -24,6 +24,7 @@ export const PluginPresetsDataGrid = () => { Instances Name PluginDefinition + Version Message Support Group diff --git a/apps/greenhouse/src/components/admin/__mocks__/pluginPresets.ts b/apps/greenhouse/src/components/admin/__mocks__/pluginPresets.ts index 961050f80b..a5334b553f 100644 --- a/apps/greenhouse/src/components/admin/__mocks__/pluginPresets.ts +++ b/apps/greenhouse/src/components/admin/__mocks__/pluginPresets.ts @@ -29,6 +29,7 @@ export const mockPluginPresets: MockPluginPresetsResponse = { status: { readyPlugins: 2, totalPlugins: 3, + pluginDefinitionVersion: "1.2.3", statusConditions: { conditions: [ { diff --git a/apps/greenhouse/src/components/admin/types/schema.d.ts b/apps/greenhouse/src/components/admin/types/schema.d.ts index d6d697fbec..3a634aeb43 100644 --- a/apps/greenhouse/src/components/admin/types/schema.d.ts +++ b/apps/greenhouse/src/components/admin/types/schema.d.ts @@ -967,6 +967,8 @@ export interface components { status?: { /** @description FailedPlugins is the number of failed Plugins managed by the PluginPreset. */ failedPlugins?: number + /** @description PluginDefinitionVersion is the version of the PluginDefinition referenced by this PluginPreset. */ + pluginDefinitionVersion?: string /** @description PluginStatuses contains statuses of Plugins managed by the PluginPreset. */ pluginStatuses?: { pluginName?: string From a075f6986d62b622fe545202965778b20bfe025a Mon Sep 17 00:00:00 2001 From: Zaggy21 Date: Thu, 2 Jul 2026 16:56:31 +0200 Subject: [PATCH 2/5] feat(greenhouse): add Version field to PpluginPreset detail On-behalf-of: @SAP krzysztof.zagorski@sap.com Signed-off-by: Zaggy21 --- .../admin/PluginPresetDetail/Overview/Details.test.tsx | 4 ++++ .../components/admin/PluginPresetDetail/Overview/Details.tsx | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.test.tsx b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.test.tsx index a911df98b0..3b1b40f2fe 100644 --- a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.test.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.test.tsx @@ -26,6 +26,9 @@ describe("Details", () => { pluginDefinition: "test-plugin-def", }, }, + status: { + pluginDefinitionVersion: "2.0.0", + }, } render(
) @@ -33,5 +36,6 @@ describe("Details", () => { expect(screen.getByText("Details")).toBeInTheDocument() expect(screen.getByText("test-preset")).toBeInTheDocument() expect(screen.getByText("test-plugin-def")).toBeInTheDocument() + expect(screen.getByText("2.0.0")).toBeInTheDocument() }) }) diff --git a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx index 5635532ae2..73b11439a3 100644 --- a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx @@ -32,6 +32,10 @@ export const Details: React.FC = ({ pluginPreset }) => ( PluginDefinition {pluginPreset.spec?.plugin?.pluginDefinitionRef?.name} + + Version + {pluginPreset.status?.pluginDefinitionVersion ?? "--"} + Release Name {pluginPreset.spec?.plugin?.releaseName ?? "--"} From 606122b6fcbce92faa246f96af06b81d00b2d725 Mon Sep 17 00:00:00 2001 From: Zaggy21 Date: Thu, 2 Jul 2026 17:08:34 +0200 Subject: [PATCH 3/5] feat(greenhouse): add Helm Chart fields to Plugin instance detail On-behalf-of: @SAP krzysztof.zagorski@sap.com Signed-off-by: Zaggy21 --- .../admin/PluginInstanceDetail/Overview/Details.test.tsx | 9 +++++++++ .../admin/PluginInstanceDetail/Overview/Details.tsx | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.test.tsx b/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.test.tsx index a73fef5f7b..5bf0642f40 100644 --- a/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.test.tsx +++ b/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.test.tsx @@ -25,6 +25,13 @@ describe("Details", () => { deletionPolicy: "Delete", releaseName: "Release", }, + status: { + helmChart: { + name: "my-chart", + repository: "https://charts.example.com", + version: "3.1.4", + }, + }, } render(
) @@ -36,5 +43,7 @@ describe("Details", () => { expect(screen.getAllByText("test-team").length).toBeGreaterThan(0) expect(screen.getByText("test-cluster")).toBeInTheDocument() expect(screen.getByText("Release")).toBeInTheDocument() + expect(screen.getByText("my-chart")).toBeInTheDocument() + expect(screen.getByText("3.1.4")).toBeInTheDocument() }) }) diff --git a/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx b/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx index 820e117823..a55a6b44b3 100644 --- a/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx +++ b/apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx @@ -47,6 +47,14 @@ export const Details: React.FC = ({ plugin }) => { PluginDefinition {plugin.spec?.pluginDefinitionRef?.name ?? NO_VALUE_DEFAULT} + + Helm Chart + {plugin.status?.helmChart?.name ?? NO_VALUE_DEFAULT} + + + Helm Chart Version + {plugin.status?.helmChart?.version ?? NO_VALUE_DEFAULT} + Release Name {plugin.spec?.releaseName ?? NO_VALUE_DEFAULT} From 3c7d4e276130ce43abc407d832e3ae045ce9090d Mon Sep 17 00:00:00 2001 From: Arturo Reuschenbach Puncernau Date: Fri, 10 Jul 2026 13:07:21 +0200 Subject: [PATCH 4/5] chore(greenhouse): add a changeset Signed-off-by: Arturo Reuschenbach Puncernau --- .changeset/four-experts-wish.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/four-experts-wish.md diff --git a/.changeset/four-experts-wish.md b/.changeset/four-experts-wish.md new file mode 100644 index 0000000000..1d6bd058f6 --- /dev/null +++ b/.changeset/four-experts-wish.md @@ -0,0 +1,5 @@ +--- +"@cloudoperators/juno-app-greenhouse": patch +--- + +Visualizes PluginDefinition versions in the Greenhouse dashboard so operators can quickly see which version is deployed where. Adds PluginPreset.status.pluginDefinitionVersion to the PluginPreset list and PluginPreset detail, and Plugin.status.helmChart fields to the Plugin instance detail. From d65d4c62a350846f872963284886d89f64b1a5fb Mon Sep 17 00:00:00 2001 From: Zaggy21 Date: Fri, 10 Jul 2026 13:39:35 +0200 Subject: [PATCH 5/5] feat(greenhouse): add Helm Chart Version column to Plugin instance lists On-behalf-of: @SAP krzysztof.zagorski@sap.com Signed-off-by: Zaggy21 --- .../admin/ClusterDetail/Overview/PluginInstances.test.tsx | 2 ++ .../admin/ClusterDetail/Overview/PluginInstances.tsx | 4 +++- .../PluginPresetDetail/Overview/PluginInstances.test.tsx | 2 ++ .../admin/PluginPresetDetail/Overview/PluginInstances.tsx | 5 ++++- apps/greenhouse/src/components/admin/__mocks__/plugins.ts | 5 +++++ 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.test.tsx b/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.test.tsx index c845e3f08b..b052396c14 100644 --- a/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.test.tsx +++ b/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.test.tsx @@ -72,7 +72,9 @@ describe("PluginInstances", () => { expect(screen.getByText("Plugin Name")).toBeInTheDocument() expect(screen.getByText("PluginPreset")).toBeInTheDocument() expect(screen.getByText("Status")).toBeInTheDocument() + expect(screen.getByText("Helm Chart Version")).toBeInTheDocument() expect(screen.getByText("plugin-1")).toBeInTheDocument() expect(screen.getByText("plugin-2")).toBeInTheDocument() + expect(screen.getByText("1.2.3")).toBeInTheDocument() }, 20000) }) diff --git a/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.tsx b/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.tsx index e723fba0cf..8a34aa33c9 100644 --- a/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.tsx +++ b/apps/greenhouse/src/components/admin/ClusterDetail/Overview/PluginInstances.tsx @@ -30,7 +30,7 @@ const isPluginReady = (plugin: Plugin) => { return plugin.status?.statusConditions?.conditions?.some((c) => c.type === "Ready" && c.status === "True") ?? false } -const COLUMN_SPAN = 5 +const COLUMN_SPAN = 6 const DataRows = ({ colSpan, plugins }: { colSpan: number; plugins: Plugin[] }) => { const navigate = useNavigate({ from: "/admin/clusters/$clusterName" }) @@ -71,6 +71,7 @@ const DataRows = ({ colSpan, plugins }: { colSpan: number; plugins: Plugin[] }) {ready ? "Ready" : "Not Ready"} {plugin.metadata?.name || NO_VALUE_DEFAULT} {pluginPresetName || NO_VALUE_DEFAULT} + {plugin.status?.helmChart?.version ?? NO_VALUE_DEFAULT} {canNavigateToDetails && ( e.stopPropagation()}> @@ -121,6 +122,7 @@ export const PluginInstances = () => { Status Plugin Name PluginPreset + Helm Chart Version diff --git a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.test.tsx b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.test.tsx index 6c889e10c8..dda69b537d 100644 --- a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.test.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.test.tsx @@ -70,7 +70,9 @@ describe("PluginInstances", () => { expect(screen.getByText("Plugin Name")).toBeInTheDocument() expect(screen.getByText("Cluster")).toBeInTheDocument() expect(screen.getByText("Status")).toBeInTheDocument() + expect(screen.getByText("Helm Chart Version")).toBeInTheDocument() expect(screen.getByText("plugin-1")).toBeInTheDocument() expect(screen.getByText("plugin-2")).toBeInTheDocument() + expect(screen.getByText("1.2.3")).toBeInTheDocument() }) }) diff --git a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.tsx b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.tsx index 7b242000f7..ac299b1791 100644 --- a/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.tsx +++ b/apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/PluginInstances.tsx @@ -22,13 +22,14 @@ import { LoadingDataRow } from "../../common/LoadingDataRow" import { ErrorBoundary } from "../../common/ErrorBoundary" import { getErrorDataRowComponent } from "../../common/getErrorDataRow" import { Plugin } from "../../types/k8sTypes" +import { NO_VALUE_DEFAULT } from "../../constants" import { fetchPlugins, FETCH_PLUGINS_CACHE_KEY } from "../../api/plugins/fetchPlugins" const isPluginReady = (plugin: Plugin) => { return plugin.status?.statusConditions?.conditions?.some((c) => c.type === "Ready" && c.status === "True") ?? false } -const COLUMN_SPAN = 5 +const COLUMN_SPAN = 6 const DataRows = ({ colSpan }: { colSpan: number }) => { const { pluginPresetName } = useParams({ from: "/admin/plugin-presets/$pluginPresetName" }) @@ -70,6 +71,7 @@ const DataRows = ({ colSpan }: { colSpan: number }) => { {plugin.metadata?.name} {plugin.spec?.clusterName} {ready ? "Ready" : "Not Ready"} + {plugin.status?.helmChart?.version ?? NO_VALUE_DEFAULT} e.stopPropagation()}> @@ -117,6 +119,7 @@ export const PluginInstances = () => { Plugin Name Cluster Status + Helm Chart Version diff --git a/apps/greenhouse/src/components/admin/__mocks__/plugins.ts b/apps/greenhouse/src/components/admin/__mocks__/plugins.ts index b8f5126ec3..884cb3dc12 100644 --- a/apps/greenhouse/src/components/admin/__mocks__/plugins.ts +++ b/apps/greenhouse/src/components/admin/__mocks__/plugins.ts @@ -39,6 +39,11 @@ export const mockPlugins: MockPluginsResponse = { }, ], }, + helmChart: { + name: "plugin-def-1", + repository: "https://charts.example.com", + version: "1.2.3", + }, }, }, {