An OpenShift Console dynamic plugin that provides an AI-driven cluster update experience. It integrates with OpenShift Lightspeed proposals (via the agentic.openshift.io API) to assess upgrade readiness, show OLM operator compatibility, and let users approve or reject AI-generated update plans.
- Update Plan — Shows the active AI-generated update proposal with risk assessment, readiness checks, OLM operator compatibility, API deprecation checks, and approve/deny actions.
- Active Update Plans — Lists all non-terminal Lightspeed proposals.
- Update History — Shows the ClusterVersion update history.
- Graceful Degradation — Works without the Lightspeed Proposal CRD installed. The Update History tab is always functional; AI features show a warning banner when unavailable.
- OpenShift 4.22+ (uses ConsolePlugin CRD v1 API, Console SDK 4.22)
- Node.js 18+ and Yarn 4.x
- oc CLI
- Docker or podman 3.2.0+ (for running the console locally)
In one terminal:
yarn install
yarn startIn another terminal:
oc login # log into your OpenShift cluster
yarn start-consoleNavigate to http://localhost:9000/administration/cluster-update.
The plugin dev server runs on port 9001 with CORS enabled. The console bridge runs on port 9000.
Without the Lightspeed agentic operator installed, Proposals have no analysis data. To test with mock data:
-
Verify CVO-created Proposals exist:
oc -n openshift-lightspeed get proposals.agentic.openshift.io
-
Get the Proposal UID:
oc -n openshift-lightspeed get proposals.agentic.openshift.io -o custom-columns=NAME:.metadata.name,UID:.metadata.uid
-
Update
mock-analysis-result.yamlwith the correct Proposal name and UID inownerReferences, then apply:oc apply -f mock-analysis-result.yaml
-
Patch the Proposal status to reference the AnalysisResult (see comments in
mock-analysis-result.yamlfor the full command). -
Patch the AnalysisResult status subresource with options data (the
statusfield is a subresource, sooc applywon't set it — useoc patch --subresource status).
yarn lint # eslint + prettier + stylelint (with --fix)
yarn test # Jest unit testsThe .stylelintrc.yaml enforces strict rules to prevent breaking console:
- No hex colors — use PatternFly CSS variables
- No naked element selectors (
table,div, etc.) - No
.pf-or.co-prefixed classes - Prefix all custom classes with
cluster-update-plugin__
docker build -t quay.io/my-repository/cluster-update-console-plugin:latest .
# For Apple Silicon: add --platform=linux/amd64helm upgrade -i cluster-update-console-plugin charts/openshift-console-plugin \
-n cluster-update-console-plugin \
--create-namespace \
--set plugin.image=quay.io/my-repository/cluster-update-console-plugin:latestThe i18n namespace is plugin__cluster-update-console-plugin. Use the useTranslation hook:
import { I18N_NAMESPACE } from '../utils/constants';
const { t } = useTranslation(I18N_NAMESPACE);For labels in console-extensions.json:
"name": "%plugin__cluster-update-console-plugin~Cluster Update%"Run yarn i18n after adding or changing messages to update locale files.