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.
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/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}
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 ?? "--"}
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/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/__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",
+ },
},
},
{
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