diff --git a/.changeset/afraid-zoos-dress.md b/.changeset/afraid-zoos-dress.md deleted file mode 100644 index 6dc8a109c..000000000 --- a/.changeset/afraid-zoos-dress.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-portal-assistant-backend': major -'@openchoreo/backstage-plugin-openchoreo-portal-assistant': major ---- - -Support response streaming and provide the prompt for the AI agent to act diff --git a/.changeset/api-tryout-console.md b/.changeset/api-tryout-console.md deleted file mode 100644 index 8d567dafa..000000000 --- a/.changeset/api-tryout-console.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor ---- - -Add an environment-aware API Try Out console (Swagger UI for OpenAPI, GraphiQL for GraphQL) to the component API view diff --git a/.changeset/background-refresh-indicators.md b/.changeset/background-refresh-indicators.md deleted file mode 100644 index c67a66b2e..000000000 --- a/.changeset/background-refresh-indicators.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@openchoreo/backstage-design-system': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch ---- - -Show a subtle background-refresh indicator on cached views instead of swapping -data in silently. - -Adds a shared `RefreshOverlay` primitive to the design system — a small -top-right spinner (or thin top bar) that overlays a positioned container while a -background revalidation runs, without shifting or blanking the cached content. -`useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; -the data hooks across the portal now thread it through, and the home dashboard, -plane cards, access-control, secrets, project, environment, workflow and -observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained -a `refreshing` prop so the home summary widgets get it for free. diff --git a/.changeset/build-and-deploy-clears-stale-source-data.md b/.changeset/build-and-deploy-clears-stale-source-data.md deleted file mode 100644 index 8257105cf..000000000 --- a/.changeset/build-and-deploy-clears-stale-source-data.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@openchoreo/backstage-plugin-catalog-backend-module': patch ---- - -Fix stale form data in the component-creation Build & Deploy section. -Generated templates now nest deploymentSource and its branch-specific -fields (workflow_name, git_source, workflow_parameters, containerImage, -autoDeploy, ciPlatform, ciIdentifier) under a single buildAndDeploy -object rendered by a composite field, so switching deployment source -clears the previous branch's data atomically — fixes -"instance.workflow requires property \"name\"" when a user picks Build -from Source and then switches to Container Image or External CI. diff --git a/.changeset/build-events-past-runs.md b/.changeset/build-events-past-runs.md deleted file mode 100644 index 8a3597ba1..000000000 --- a/.changeset/build-events-past-runs.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-ci-backend': minor -'@openchoreo/backstage-plugin-openchoreo-ci': minor ---- - -show build events for past workflow runs by querying the observer events endpoint diff --git a/.changeset/cache-catalog-always-revalidate.md b/.changeset/cache-catalog-always-revalidate.md deleted file mode 100644 index dbba74e50..000000000 --- a/.changeset/cache-catalog-always-revalidate.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin': patch ---- - -Cache catalog reads and switch the response cache to always-revalidate. - -The catalog list and entity pages now read through a `CachingCatalogApi` wrapper -(exported from `@openchoreo/backstage-plugin-react`) that routes -`getEntities`/`queryEntities`/`getEntityByRef`/`getEntitiesByRefs` through the -shared `queryClient`, keyed per signed-in user. Previously the catalog used -Backstage's `CatalogApi` directly, so every visit re-fetched from scratch and -flashed a loading skeleton; now a revisited catalog list or entity page paints -instantly from the warm cache. Catalog writes (`refreshEntity`, location -add/remove/update, `removeEntityByUid`) invalidate the cache so user changes show -immediately. - -The `queryClient` default `staleTime` changes from 30s to 0 (always -stale-while-revalidate): a revisited surface paints cached data instantly and -always runs a background refresh, so nothing on screen is left silently stale. -The two hooks that set an explicit 30s `staleTime` now inherit this default. - -The entity-header breadcrumb dropdowns (namespace/project/component sibling -lists) now read their data through `useOpenChoreoQuery` instead of an imperative -`await catalogApi.getEntities(...)`, so reopening a level renders the cached list -instantly (no loading spinner) and only revalidates in the background, rather -than blocking on the network every open. - -The catalog list page seeds its initial rows from the cached `queryEntities` -response (via the newly exported `useUserScopedKey`), so returning to a -previously viewed list paints instantly from cache instead of flashing a -skeleton while `useEntityList` re-fetches. `useUserScopedKey` is now exported -from `@openchoreo/backstage-plugin-react`. - -Both cached-first surfaces now show a quiet inline spinner next to their label -(the "All Components (N)" count and the breadcrumb menu title) while their -background revalidation runs, so a refresh is visible instead of the data -swapping in silently. The spinner tracks the real network refetch on the shared -`queryClient` (via `useIsFetching`), not the surface's own `loading` flag — -which resolves the instant the cached read returns while the revalidation is -still in flight. - -Switching the catalog Kind filter now reflects the newly selected kind -immediately: a cached kind's rows and title appear at once from the cache, and -an uncached kind shows a clean full-page loader under the new kind's title -instead of leaving the previous kind's rows on screen until the fetch resolves. diff --git a/.changeset/cache-platform-plane-fetches.md b/.changeset/cache-platform-plane-fetches.md deleted file mode 100644 index a744f65d8..000000000 --- a/.changeset/cache-platform-plane-fetches.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@openchoreo/backstage-plugin-platform-engineer-core': patch -'@openchoreo/backstage-plugin': patch ---- - -Route the platform "planes" fetches through the response cache so they paint -instantly on revisit instead of re-fetching from the catalog/BFF every time. - -The caching migration had skipped the `platform-engineer-core` plugin, so the -Platform Engineer home/dashboard re-queried every plane list on each visit. -Migrated the three dashboard widgets (`HomePagePlatformDetailsCard`, -`InfrastructureWidget`, `AgentHealthWidget`) and the two observability-plane -"linked planes" cards in the openchoreo plugin to `useOpenChoreoQuery` with -domain-prefixed keys. diff --git a/.changeset/cct-custom-scaffold-template-url.md b/.changeset/cct-custom-scaffold-template-url.md deleted file mode 100644 index fc2b4d2b3..000000000 --- a/.changeset/cct-custom-scaffold-template-url.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@openchoreo/backstage-plugin-catalog-backend-module': minor -'@openchoreo/backstage-plugin-common': minor ---- - -Add support for custom component-creation templates. A (Cluster)ComponentType -can now set the `scaffolder.openchoreo.dev/backstage-template-url` annotation to -point at a hand-authored Backstage scaffolder Template. When present, the catalog -sync fetches that Template from the URL (via the configured `integrations`) and -emits it in place of the auto-generated wizard; when absent, behaviour is -unchanged. Applies to both the periodic and event-driven sync paths. If the URL -cannot be read or does not yield a valid `kind: Template`, an error is logged and -no template is emitted for that type. diff --git a/.changeset/cell-diagram-internal-package.md b/.changeset/cell-diagram-internal-package.md deleted file mode 100644 index b9322398c..000000000 --- a/.changeset/cell-diagram-internal-package.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/cell-diagram': minor -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-backend': patch ---- - -Bring the Cell Diagram library into the repo as the internal package -`@openchoreo/cell-diagram` (previously the external `@wso2/cell-diagram`). The -exported API is unchanged; the frontend and backend plugins now consume the -workspace package. diff --git a/.changeset/cell-diagram-node-navigation.md b/.changeset/cell-diagram-node-navigation.md deleted file mode 100644 index b7adec4c2..000000000 --- a/.changeset/cell-diagram-node-navigation.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor ---- - -Cell Diagram: each component node's ⋮ menu now links to that component's key tabs — Overview, Deploy, Logs, Metrics, and (when an environment has Cilium-backed network observability) Wirelogs — in a project's Cell Diagram tab. diff --git a/.changeset/cleanup-refactor-leftovers.md b/.changeset/cleanup-refactor-leftovers.md deleted file mode 100644 index 6b34deef4..000000000 --- a/.changeset/cleanup-refactor-leftovers.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-backend': patch -'@openchoreo/backstage-plugin-openchoreo-ci-backend': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch -'@openchoreo/backstage-design-system': patch ---- - -chore: remove dead code left over from the OpenAPI-client and New Frontend -System migrations — commented-out blocks, orphaned files/components, and unused -deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, -`useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of -duplicated backend response-type wrappers. No behavioural changes. diff --git a/.changeset/clever-mice-film.md b/.changeset/clever-mice-film.md deleted file mode 100644 index e9c50755d..000000000 --- a/.changeset/clever-mice-film.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-portal-assistant': patch ---- - -Convert the RCA chat to a right drawer where previously it was inbuild to the page diff --git a/.changeset/component-deploy-project-prereq.md b/.changeset/component-deploy-project-prereq.md deleted file mode 100644 index 705a20d46..000000000 --- a/.changeset/component-deploy-project-prereq.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor -'@openchoreo/backstage-plugin-backend': minor ---- - -Block deploying a component to an environment where its project is not deployed, and guide the user to deploy the project first. diff --git a/.changeset/component-events-page.md b/.changeset/component-events-page.md deleted file mode 100644 index 4f9cf76ec..000000000 --- a/.changeset/component-events-page.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': minor -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/openchoreo-client-node': patch ---- - -add component events view and hooks diff --git a/.changeset/component-exec-terminal.md b/.changeset/component-exec-terminal.md deleted file mode 100644 index 429ca09d3..000000000 --- a/.changeset/component-exec-terminal.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor -'@openchoreo/backstage-plugin-backend': minor -'@openchoreo/backstage-plugin-common': minor -'@openchoreo/backstage-plugin-react': minor ---- - -Add a pod-aware exec terminal in the Deploy view. The Terminal lives in the K8s resource-tree drawer reached via Deploy → environment → View K8s Artifacts: it appears as a tab on the Pod node's drawer (with a container picker) when the pod is rendered in the tree, and falls back to the ReleaseBinding drawer when the pod is managed by another operator and the binding is healthy. The exec session targets the selected pod and container via WebSocket. The standalone component-level Terminal tab has been removed. - -Access is gated by the `openchoreo.exec` permission with per-environment ABAC, and the `POST /exec/init` backend endpoint now enforces this permission server-side so direct API calls cannot bypass the UI gate. diff --git a/.changeset/condition-action-selector-compatible.md b/.changeset/condition-action-selector-compatible.md deleted file mode 100644 index 3afc591db..000000000 --- a/.changeset/condition-action-selector-compatible.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Limit the condition action selector to actions compatible with the current selection, so only actions sharing a condition attribute are offered. diff --git a/.changeset/deploy-backstage-empty-state.md b/.changeset/deploy-backstage-empty-state.md deleted file mode 100644 index 745902452..000000000 --- a/.changeset/deploy-backstage-empty-state.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Use the standard Backstage `EmptyState` for the Deploy tab's empty and error states (Component, Project, and Resource), matching the look of other empty states in the app (e.g. "Workflows Not Available" on the Build tab). Replaces the card + custom message + Retry button with a title + description empty state, and the "no environments" state now links to the project's deployment pipeline so it can be reviewed/configured. diff --git a/.changeset/deploy-empty-pipeline-no-default-envs.md b/.changeset/deploy-empty-pipeline-no-default-envs.md deleted file mode 100644 index e8e80f78a..000000000 --- a/.changeset/deploy-empty-pipeline-no-default-envs.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin-backend': patch -'@openchoreo/backstage-plugin': patch ---- - -Fix the Deploy views defaulting to every environment in the namespace when a project's deployment pipeline defines no environments. A resolved pipeline with no promotion paths now yields no environments (the UI shows its empty state), and a pipeline that cannot be resolved (missing `deploymentPipelineRef` or a failed pipeline fetch) surfaces an error state instead of silently listing all environments. - -A permission denial on the deployment-pipeline read (`deploymentpipelines:view`) now surfaces as a Forbidden state instead of a misleading "pipeline missing/misconfigured" error. - -The Component, Project, and Resource Deploy tabs now share the same empty-state and error-state cards (icon, message, and Retry) with consistent, pipeline-focused copy, replacing the plain text lines previously shown on the Project and Resource tabs. diff --git a/.changeset/disable-action-while-env-row-editing.md b/.changeset/disable-action-while-env-row-editing.md deleted file mode 100644 index abae5a645..000000000 --- a/.changeset/disable-action-while-env-row-editing.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Disable the primary action (Create Release / Save Overrides / Deploy) on -the deploy flow while an environment variable or file mount row is in -edit mode, so users can't submit a half-typed row with an empty key or -value. diff --git a/.changeset/enable-add-trait-button-in-yaml-view.md b/.changeset/enable-add-trait-button-in-yaml-view.md deleted file mode 100644 index 5993f90b5..000000000 --- a/.changeset/enable-add-trait-button-in-yaml-view.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': patch ---- - -Fix the "Add Trait" / "Update Trait" button staying disabled in the YAML -view of the trait dialogs even after the user has filled in every -required field. `TraitConfigToggle` now propagates each YAML edit to -the parent (debounced 150 ms; flushed synchronously on blur and when -switching to form view), so schema-validity recomputes as the user -types instead of only on focus loss. diff --git a/.changeset/exec-ws-proxy-doc-refs.md b/.changeset/exec-ws-proxy-doc-refs.md deleted file mode 100644 index 701cadc6b..000000000 --- a/.changeset/exec-ws-proxy-doc-refs.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin-backend': patch ---- - -Update stale code comments that referenced the exec WebSocket proxy's old location (`packages/backend/src/index.ts`); it now lives in and is registered from the `@openchoreo/backstage-plugin-backend` plugin. diff --git a/.changeset/fix-auth-scope-frontend-exposure.md b/.changeset/fix-auth-scope-frontend-exposure.md deleted file mode 100644 index c7d086b6b..000000000 --- a/.changeset/fix-auth-scope-frontend-exposure.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth': patch -'@openchoreo/backstage-plugin-common': patch ---- - -Fix OAuth scopes in the auth code flow: inject configured scope into the passport-oauth2 token exchange and refresh, and expose the scope to the frontend client via `openchoreo.features.auth.scope` so sign-in and session refresh requests use the operator-configured scope instead of hardcoded defaults. diff --git a/.changeset/fix-sidebar-divider-prod.md b/.changeset/fix-sidebar-divider-prod.md deleted file mode 100644 index 48ed44c79..000000000 --- a/.changeset/fix-sidebar-divider-prod.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-design-system': patch -'@openchoreo/backstage-plugin': patch ---- - -Fix sidebar section separators rendering as dark near-black lines in production -builds. The softening rule targeted the divider by its `BackstageSidebarDivider-root` -class prefix, which JSS mangles away in the production bundle; it now targets the -sidebar-nav `hr` element directly, so the light-mode divider stays a subtle grey in -both dev and prod. diff --git a/.changeset/hide-wirelogs-tab-without-cilium.md b/.changeset/hide-wirelogs-tab-without-cilium.md deleted file mode 100644 index 83e832a81..000000000 --- a/.changeset/hide-wirelogs-tab-without-cilium.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': minor ---- - -Add the `useComponentHasAnyCiliumEnabledEnvironment` hook, which resolves on the client whether any of a component's project environments runs Cilium — it fetches the project's environments and probes each backing DataPlane's `networkpolicyprovider` (the same source the Wirelogs page uses to enable/disable individual environments). It returns `false` until the probe confirms at least one Cilium environment. - -The portal uses this to hide the component-level **Wirelogs** tab unless at least one environment runs Cilium (wirelogs are sourced from Cilium Hubble). Previously the tab was always shown and, on a core OpenChoreo setup with no Cilium DataPlanes, rendered an empty "configure Cilium" state — a dead tab with no usable content. Resolving availability at render time means no catalog-sync annotation or DataPlane event cascade is required. diff --git a/.changeset/https-priority-endpoint-urls.md b/.changeset/https-priority-endpoint-urls.md deleted file mode 100644 index da7daf52d..000000000 --- a/.changeset/https-priority-endpoint-urls.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@openchoreo/backstage-plugin-backend': patch ---- - -Prefer HTTPS over HTTP for endpoint URLs surfaced in the API test console. When -a ReleaseBinding endpoint exposes both an `http` and an `https` URL, the console -could show either one, since the frontend selects the first entry of each URL -map and is otherwise scheme-blind — which URL came first was decided by the -upstream control-plane response ordering. The `ReleaseBinding` transformer now -reorders each endpoint's `externalURLs`/`internalURLs` so `https` entries come -first (relative order otherwise preserved), making the existing frontend -selection land on the secure URL with no frontend change. http-only endpoints -and endpoints without URL maps are unaffected. diff --git a/.changeset/import-page-back-button.md b/.changeset/import-page-back-button.md deleted file mode 100644 index 3b38f14ae..000000000 --- a/.changeset/import-page-back-button.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -Add a back button to the purple header of the catalog import (Register / Import to catalog) page so users can return to the APIs and catalog lists. Host-app only (`packages/app`); no published package is affected. diff --git a/.changeset/jolly-jars-learn.md b/.changeset/jolly-jars-learn.md deleted file mode 100644 index 93fe4b0ab..000000000 --- a/.changeset/jolly-jars-learn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch ---- - -Rename RCA agent chat to Portal Assistant diff --git a/.changeset/json-schema-yaml-utils.md b/.changeset/json-schema-yaml-utils.md deleted file mode 100644 index 806b1674d..000000000 --- a/.changeset/json-schema-yaml-utils.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': patch ---- - -Add JSON Schema → annotated YAML utilities (`buildYamlString`, -`buildYamlData`, `generateDefaults`) for editors that toggle between a -structured form and a raw YAML view. `buildYamlString` walks the schema -recursively so nested required scalars get a `# required` hint and -enum-constrained scalars get `# allowed: `; `allOf` composition, -nullable type arrays (`["object", "null"]`), and non-string enum values -are handled. `TraitConfigToggle` now delegates to these helpers in -place of its previous single-level annotation, so deeply-required and -enum fields in trait schemas surface their constraints in the YAML -view. diff --git a/.changeset/lazy-donkeys-repeat.md b/.changeset/lazy-donkeys-repeat.md deleted file mode 100644 index 4f978575c..000000000 --- a/.changeset/lazy-donkeys-repeat.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': minor -'@openchoreo/backstage-plugin': patch ---- - -Fix cached catalog data not refreshing after a change. Creating a component or project -left the project contents table, the namespace projects card and the catalog list showing -the previous contents until you navigated away and back. Cached catalog reads are now -refreshed before they are handed to the page, and the namespace cards update in place when -newer data arrives. diff --git a/.changeset/lazy-olives-repeat.md b/.changeset/lazy-olives-repeat.md deleted file mode 100644 index 4fe5a9477..000000000 --- a/.changeset/lazy-olives-repeat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-portal-assistant-backend': patch -'@openchoreo/backstage-plugin-openchoreo-portal-assistant': patch ---- - -Provide investigation support for deployment issues. diff --git a/.changeset/migrate-portal-to-nfs.md b/.changeset/migrate-portal-to-nfs.md deleted file mode 100644 index 20d67c794..000000000 --- a/.changeset/migrate-portal-to-nfs.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch -'@openchoreo/backstage-plugin-react': patch ---- - -Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. - -The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). - -Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. - -Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. - -Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. diff --git a/.changeset/normalize-role-actions-display.md b/.changeset/normalize-role-actions-display.md deleted file mode 100644 index 4ec36fa15..000000000 --- a/.changeset/normalize-role-actions-display.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Display role actions consistently in collapsed form in Access Control. When a -role grants every action in a category, the Roles table and Role dialog now -show a single "All actions" entry (e.g. "All alerts actions", "All -metrics actions") instead of listing each operation individually, matching how -the action selection dialog already renders them. Roles are still stored as-is; -the collapsing is display-only and re-applies once the action catalog loads. diff --git a/.changeset/notification-channel-management.md b/.changeset/notification-channel-management.md deleted file mode 100644 index 613582f7c..000000000 --- a/.changeset/notification-channel-management.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor -'@openchoreo/backstage-plugin-backend': minor -'@openchoreo/backstage-plugin-common': minor -'@openchoreo/backstage-plugin-react': minor -'@openchoreo/backstage-plugin-catalog-backend-module': minor -'@openchoreo/backstage-plugin-scaffolder-backend-module': minor -'@openchoreo/backstage-design-system': patch ---- - -Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. diff --git a/.changeset/observability-env-error-messages.md b/.changeset/observability-env-error-messages.md deleted file mode 100644 index c147d0450..000000000 --- a/.changeset/observability-env-error-messages.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin-backend': patch ---- - -Replace the generic "No environments found. Make sure your component is properly configured." message on the observability pages (Runtime Logs, Runtime Events, Alerts, Wirelogs, Metrics, Traces, Incidents, Cost Analysis, RCA — component and project scoped) with cause-specific messaging. `useProjectEnvironments` now reports a discriminated status — `empty-pipeline` (the deployment pipeline has no environments), `forbidden` (permission to view the pipeline is denied), or `unavailable` (the pipeline is missing or couldn't be loaded) — and the pages render a cause-specific state via a shared `EnvironmentsStatusNotice` component, using the standard Backstage `EmptyState` (matching the Deploy tab). A missing `deploymentPipelineRef` now returns a clean 404 instead of a 500. diff --git a/.changeset/pod-logs-container-filter.md b/.changeset/pod-logs-container-filter.md deleted file mode 100644 index ea1c8b43b..000000000 --- a/.changeset/pod-logs-container-filter.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/openchoreo-client-node': patch ---- - -Show container names in the resource-tree pod logs tab and add a per-container -filter. The pod logs API now returns logs aggregated across all of a pod's -containers, each entry tagged with its container. For multi-container pods -(for example an app container plus a Dapr sidecar) the logs viewer aligns -each line into timestamp / container / message columns and adds a container -dropdown ("All containers" plus one entry per container) to filter the view. -Single-container pods are unchanged. diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index 7c71cf3bc..000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "mode": "pre", - "tag": "next", - "initialVersions": { - "app": "0.0.0", - "backend": "0.0.0", - "@openchoreo/backstage-design-system": "1.1.1", - "@openchoreo/openapi-client-generator-node": "1.1.1", - "@openchoreo/openchoreo-auth": "1.1.1", - "@openchoreo/openchoreo-client-node": "1.1.1", - "@openchoreo/test-utils": "0.1.0", - "@openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth": "1.1.1", - "@openchoreo/backstage-plugin-catalog-backend-module": "1.1.1", - "@openchoreo/backstage-plugin-catalog-backend-module-openchoreo-users": "1.1.1", - "@openchoreo/backstage-plugin": "1.1.1", - "@openchoreo/backstage-plugin-backend": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-ci": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-ci-backend": "1.1.1", - "@openchoreo/backstage-plugin-common": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-observability": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-observability-backend": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-portal-assistant": "0.1.0", - "@openchoreo/backstage-plugin-openchoreo-portal-assistant-backend": "0.1.0", - "@openchoreo/backstage-plugin-react": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-workflows": "1.1.1", - "@openchoreo/backstage-plugin-openchoreo-workflows-backend": "1.1.1", - "@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy": "1.1.1", - "@openchoreo/backstage-plugin-platform-engineer-core": "1.1.1", - "@openchoreo/backstage-plugin-platform-engineer-core-backend": "1.1.1", - "@openchoreo/backstage-plugin-scaffolder-backend-module": "1.1.1", - "@openchoreo/backstage-plugin-thunder-idp-client-node": "1.1.1", - "@openchoreo/cell-diagram": "0.3.1" - }, - "changesets": [ - "afraid-zoos-dress", - "api-tryout-console", - "background-refresh-indicators", - "build-and-deploy-clears-stale-source-data", - "build-events-past-runs", - "cache-catalog-always-revalidate", - "cache-platform-plane-fetches", - "cct-custom-scaffold-template-url", - "cell-diagram-internal-package", - "cell-diagram-node-navigation", - "cleanup-refactor-leftovers", - "clever-mice-film", - "component-deploy-project-prereq", - "component-events-page", - "component-exec-terminal", - "condition-action-selector-compatible", - "deploy-backstage-empty-state", - "deploy-empty-pipeline-no-default-envs", - "disable-action-while-env-row-editing", - "enable-add-trait-button-in-yaml-view", - "exec-ws-proxy-doc-refs", - "fix-auth-scope-frontend-exposure", - "fix-sidebar-divider-prod", - "hide-wirelogs-tab-without-cilium", - "https-priority-endpoint-urls", - "import-page-back-button", - "jolly-jars-learn", - "json-schema-yaml-utils", - "lazy-donkeys-repeat", - "lazy-olives-repeat", - "migrate-portal-to-nfs", - "normalize-role-actions-display", - "notification-channel-management", - "observability-env-error-messages", - "pin-node-22-22", - "pod-logs-container-filter", - "preselect-project-in-create-wizard", - "project-auto-deploy-on-create", - "project-contents-refresh", - "project-creation-wizard", - "project-deploy-experience", - "projecttype-catalog-support", - "prominent-save-discard-actions", - "rendered-release-summary-tabs", - "resourcetype_condition_for_resource_creation", - "resourcetype_condition_for_resource_update", - "response-cache-foundation", - "select-env-card-default", - "self-contained-query-provider", - "setup-card-auto-deploy-ux", - "surface-autodeploy-failures", - "surface-token-acquisition-failures", - "suspended-pipeline-status", - "trace-span-status-object", - "trace-spans-cache-key", - "traces-table-error-stripe", - "twelve-dryers-try", - "unify-loading-states", - "unpin-node-22-22", - "update-codecov", - "upgrade-backstage-to-1-51", - "virtualized-log-list", - "wirelogs-stream-timeout", - "workflow-list-fetch-all-pages", - "workflow-runs-fetch-all-pages" - ] -} diff --git a/.changeset/project-auto-deploy-on-create.md b/.changeset/project-auto-deploy-on-create.md deleted file mode 100644 index 47d4b0af1..000000000 --- a/.changeset/project-auto-deploy-on-create.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-plugin-catalog-backend-module': minor -'@openchoreo/backstage-plugin-scaffolder-backend-module': minor -'@openchoreo/backstage-plugin-backend': patch ---- - -Add a default-on Auto Deploy toggle to the project creation wizard. When on, `openchoreo:project:create` creates one unpinned ProjectReleaseBinding per deployment-pipeline environment after the project is created, and the control plane seeds the release pin once the first release is cut. Toggling it off shows a warning that the project must be deployed manually from its Deploy tab before components can be deployed. The Deploy tab now shows just-created unpinned bindings (`ProjectReleaseNotSet`) as pending instead of failed. diff --git a/.changeset/project-contents-refresh.md b/.changeset/project-contents-refresh.md deleted file mode 100644 index 9557bb9a8..000000000 --- a/.changeset/project-contents-refresh.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': minor -'@openchoreo/backstage-plugin': patch ---- - -Add a Refresh action to the Project Contents card and back it with the response -cache. - -A Refresh icon button next to the "Project Contents" title re-pulls the table -rows (and their per-environment deployment status) together with the count badge -and type-filter options. `useProjectContentsPage` moves off a hand-rolled -`useEffect` fetch onto `useOpenChoreoQuery`, split into two dependent queries -(page rows + visible-row deployment bindings), so it gains `refetch`/ -`isRefetching` and smoother paging. The card also reserves a full page's height -so navigating to a shorter last page no longer makes the widget jump. - -`useOpenChoreoQuery` gains an optional `keepPreviousData` flag (forwarded as -`placeholderData: keepPreviousData`) so paginated queries can keep the previous -page on screen while the next one loads. It is additive and only applied when -set, so existing callers are unchanged. diff --git a/.changeset/project-creation-wizard.md b/.changeset/project-creation-wizard.md deleted file mode 100644 index c17da2352..000000000 --- a/.changeset/project-creation-wizard.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-catalog-backend-module': patch -'@openchoreo/backstage-plugin-scaffolder-backend-module': patch ---- - -Add a per-ProjectType "Create Project" wizard, mirroring the Resource creation flow. - -Each `ProjectType` / `ClusterProjectType` now generates a scaffolder Template via `PtdToTemplateConverter`, surfaced under a new `?view=projects` browse view with a dedicated "Project" landing card. Selecting a type opens a wizard whose parameters step is driven by the type's `spec.parameters.openAPIV3Schema`, then creates the Project with `spec.type` and `spec.parameters` set via the extended `openchoreo:project:create` action (it falls back to the OpenChoreo API default when these are omitted, keeping the legacy path working). The catalog provider emits these templates during full sync and the event-delta path keeps them current. Replaces the static `create-openchoreo-project` template. diff --git a/.changeset/project-deploy-experience.md b/.changeset/project-deploy-experience.md deleted file mode 100644 index 12c01bbe2..000000000 --- a/.changeset/project-deploy-experience.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-backend': patch -'@openchoreo/backstage-plugin-common': patch ---- - -Add a "Deploy" tab to the Project entity page for the project-release lifecycle. - -The tab renders the project's deployment pipeline as a DAG of environments with live status and drives deploy/promote through `ProjectRelease` / `ProjectReleaseBinding`. A "Set up" card opens a **Configure & Deploy** wizard: step 1 edits `Project.spec.parameters` against the `(Cluster)ProjectType` parameters schema (saving cuts a new `ProjectRelease`), step 2 pins the first environment's binding and edits its `environmentConfigs` overrides. Each environment node supports **Promote** (copy the pinned release forward to the next environment) and **Configure overrides**; all mutating actions gate on the project-update permission. - -Backed by new BFF endpoints (`/project-environment-info`, `/project-release-bindings`, `/update-project-release-binding`, `/project-release-schema`) and matching `OpenChoreoClient` methods. diff --git a/.changeset/projecttype-catalog-support.md b/.changeset/projecttype-catalog-support.md deleted file mode 100644 index a6228e947..000000000 --- a/.changeset/projecttype-catalog-support.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-backend': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-catalog-backend-module': patch -'@openchoreo/backstage-plugin-scaffolder-backend-module': patch -'@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy': patch -'@openchoreo/openchoreo-client-node': patch ---- - -Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. - -The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). - -Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. diff --git a/.changeset/prominent-save-discard-actions.md b/.changeset/prominent-save-discard-actions.md deleted file mode 100644 index bf2ffe554..000000000 --- a/.changeset/prominent-save-discard-actions.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-design-system': patch ---- - -Clarify the save/discard/delete controls in the Workload editor rows -(endpoints, dependencies, environment variables, and file mounts). While -editing a row, a labeled footer bar (Save / Cancel / Delete) makes committing -or discarding clearly visible; read-only rows keep their compact inline -Edit / Delete buttons on a single line. Adds a reusable `EditRowActions` -design-system component shared by all of those row editors. diff --git a/.changeset/rendered-release-summary-tabs.md b/.changeset/rendered-release-summary-tabs.md deleted file mode 100644 index 30b7dea6a..000000000 --- a/.changeset/rendered-release-summary-tabs.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-plugin': minor ---- - -Show **Summary** and **Definition** tabs on the release details page when a rendered release is selected in the resource tree. The Summary tab lists the release's status conditions alongside its owning project, component, environment and target plane, so a failed apply to the data plane surfaces directly in the drawer as `ResourcesApplied=False` with the apply error as the condition message. The Definition tab renders the full rendered release as YAML. - -Rendered releases are not given an Events tab: the release controllers report state through status conditions rather than Kubernetes events, so it would always be empty. Events remain available on the individual resources under a release. diff --git a/.changeset/resourcetype_condition_for_resource_creation.md b/.changeset/resourcetype_condition_for_resource_creation.md deleted file mode 100644 index 51694397f..000000000 --- a/.changeset/resourcetype_condition_for_resource_creation.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy': minor -'@openchoreo/backstage-plugin-react': minor ---- - -Add `resource.resourceType` ABAC condition to resource creation, gating the resource template chooser and the creation wizard per resource type. diff --git a/.changeset/resourcetype_condition_for_resource_update.md b/.changeset/resourcetype_condition_for_resource_update.md deleted file mode 100644 index 7bed091d4..000000000 --- a/.changeset/resourcetype_condition_for_resource_update.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': minor ---- - -Add `resource.resourceType` ABAC condition to resource update, gating the resource definition editor per resource type. diff --git a/.changeset/response-cache-foundation.md b/.changeset/response-cache-foundation.md deleted file mode 100644 index dc32aeb74..000000000 --- a/.changeset/response-cache-foundation.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch ---- - -Introduce a frontend response cache (TanStack Query) behind a swappable seam and -migrate the portal's data-fetching hooks onto it, so cached data paints -instantly on remount and a background refresh no longer blanks the view. - -New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so -plugins never import it directly: - -- `useOpenChoreoQuery` — cached reads, returning the - `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. -- `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached - queries on success (replacing the hand-rolled "call verb then refetch"). -- `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists - (runtime logs/events). -- `useOpenChoreoCache` — imperative cache access for optimistic writes and the - lazy, dynamically-keyed hooks. - -Migrated across the openchoreo, observability, CI and workflows plugins: simple -and parameterized reads, read+mutation hooks, `setInterval` pollers (now -`refetchInterval` with terminal stop conditions), lazy/conditional and -keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` -sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. -The provider is mounted in the app root and the cache is cleared on sign-out. - -The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller -actually sets them — passing an explicit `undefined` overrides the QueryClient -default instead of inheriting it, which resolved `staleTime` to 0 and refetched -on every remount, silently defeating the shared 30s cache. - -The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` -into `loading`; a background refresh kept re-showing their full skeleton (the -"blank on refresh" the cache was meant to remove). They now report `loading` -for the first load only and expose `isRefetching` separately. diff --git a/.changeset/select-env-card-default.md b/.changeset/select-env-card-default.md deleted file mode 100644 index 5d812dda0..000000000 --- a/.changeset/select-env-card-default.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Auto-select a default card in the Environments deploy graph instead of -landing users on an empty detail panel: first env with an active or -pending deployment, else the first failed env, else the first undeployed -env, falling back to the Setup card when only never-deployed envs exist. -Only applies while nothing is selected, so it never overrides a manual -choice. diff --git a/.changeset/self-contained-query-provider.md b/.changeset/self-contained-query-provider.md deleted file mode 100644 index 1c7fd179d..000000000 --- a/.changeset/self-contained-query-provider.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch ---- - -Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each -OpenChoreo plugin now wraps its own extensions in a TanStack Query -`QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` -singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts -the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone -plugin pages) gets response caching with no provider wiring — previously those -surfaces would crash with "No QueryClient set" when a cached tab rendered. - -Scope: this covers surfaces rendered through a plugin's own extension boundary -(NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead -composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX -renders them outside the plugin wrapper, so that host still mounts its own -provider — `OpenChoreoQueryProvider` (also exported here) bundles the -`QueryClientProvider` and the user-scoping context for that case. - -Cross-user isolation is structural: every cache key is namespaced by the -signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, -`useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so -a different user occupies a disjoint key space and can never read the previous -user's permission-scoped responses from the cache — no cache-clearing needed. -Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. diff --git a/.changeset/setup-card-auto-deploy-ux.md b/.changeset/setup-card-auto-deploy-ux.md deleted file mode 100644 index 70d5c7b9a..000000000 --- a/.changeset/setup-card-auto-deploy-ux.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin': patch ---- - -Rework the Environments setup card auto-deploy experience: searchable -release dropdown with a primary "New release" CTA, an empty-state -panel for brand-new components, an optimistic auto-deploy toggle with -inline "Saving…" feedback and permission-aware error handling, and a -controller-truth "Last deployed release" row that polls for the new -release after a save. diff --git a/.changeset/surface-autodeploy-failures.md b/.changeset/surface-autodeploy-failures.md deleted file mode 100644 index 48c633f0c..000000000 --- a/.changeset/surface-autodeploy-failures.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-plugin-common': minor -'@openchoreo/backstage-plugin-backend': minor -'@openchoreo/backstage-plugin': minor ---- - -Surface OpenChoreo controller auto-deploy failures in the Deploy tab. Pre-binding release-generation failures (bad trait, invalid config — from `Component.status.conditions`) now surface on the Setup card and as an error marker on the canvas Set-up tile, instead of leaving the user with no signal. Post-binding render/apply failures (from `ReleaseBinding.status.conditions`) show an actionable error banner with the controller's reason + message in the environment detail panel, instead of a context-free "Failed" badge. Long controller messages are clamped to a compact banner with a "View details" dialog (reason + full message + copy). diff --git a/.changeset/suspended-pipeline-status.md b/.changeset/suspended-pipeline-status.md deleted file mode 100644 index 0ee5ba0e3..000000000 --- a/.changeset/suspended-pipeline-status.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openchoreo/backstage-design-system': minor -'@openchoreo/backstage-plugin': minor -'@openchoreo/backstage-plugin-backend': minor ---- - -Show a "Suspended" status in the deployment pipeline when a component's workload is scaled to zero. The backend reads the suspended state that core already reports on the ReleaseBinding's ResourcesReady condition, and the pipeline badge now shows "Suspended" instead of "Active" for a scaled-to-zero workload. diff --git a/.changeset/trace-span-status-object.md b/.changeset/trace-span-status-object.md deleted file mode 100644 index 3fe3be52d..000000000 --- a/.changeset/trace-span-status-object.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/openchoreo-client-node': patch ---- - -Adapt the tracing views to the OpenTelemetry span status model. The -observability API now returns a span's `status` as a `SpanStatus` object -(`code` of `ok`/`error`/`unset` plus an optional `message`) instead of a plain -status string. The waterfall tooltip now shows the span's status code, the span -details panel gains a dedicated Status section (alongside Attributes and Resource -Attributes) that surfaces the status message, and error spans stay highlighted -based on the status code. This also prevents the span tooltip from crashing when -the status is an object. diff --git a/.changeset/trace-spans-cache-key.md b/.changeset/trace-spans-cache-key.md deleted file mode 100644 index 255fdcfc6..000000000 --- a/.changeset/trace-spans-cache-key.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch ---- - -Fix trace span details never loading from cache. The span cache key included -the filter scope and time window, whose timestamps changed every render, so the -key used to read spans (`getSpans`) no longer matched the one they were cached -under and always returned `undefined`. Spans are now keyed by trace id alone — -a trace id uniquely identifies its spans regardless of the query scope. diff --git a/.changeset/traces-table-error-stripe.md b/.changeset/traces-table-error-stripe.md deleted file mode 100644 index fec192a0d..000000000 --- a/.changeset/traces-table-error-stripe.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch ---- - -Fix the error stripe not rendering on error rows in the traces table. The red -"contains errors" indicator was drawn by CSS targeting table cells (`td`/`th`) -that no longer exist after the table moved to a div-based virtualized layout, -and the span that did render (the tooltip's hover target) had no fill colour. -The stripe is now drawn on the rendered element, so error traces show the red -stripe again. diff --git a/.changeset/twelve-dryers-try.md b/.changeset/twelve-dryers-try.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/twelve-dryers-try.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/unify-loading-states.md b/.changeset/unify-loading-states.md deleted file mode 100644 index f341562b3..000000000 --- a/.changeset/unify-loading-states.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -'@openchoreo/backstage-design-system': minor -'@openchoreo/backstage-plugin-react': minor -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch ---- - -Unify portal loading states behind a shared, token-driven system so every -loader looks and behaves consistently. - -**New shared components** - -- **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` - with a `count` for stacked lines, backed by new `motion` timing tokens), - `Spinner` (theme-coloured circular loader with named sizes - `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for - page/route/section loads). -- **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content - wrapper that keeps content on screen and overlays a spinner during a - background refetch instead of blanking) and `SkeletonRows` (table-body - skeleton helper). - -**Consistency changes** - -- Tables now show skeleton rows instead of a circular overlay (catalog, - Project Contents, namespace cards, observability RCA/Cost Analysis, and the - raw-MUI alert/incident/log tables). -- Overview cards and widgets render skeleton placeholders via the shared - `Skeleton` (including the home-page platform-planes section). -- Page-level loaders use the centered `PageLoader` instead of the Backstage - progress bar — including Backstage's internal route/Suspense fallback and the - app-boot loader. -- Status chips use the themed `Spinner` (removing a hardcoded spinner colour). -- The shared `ErrorState` icon is sized down to read proportionately in - section-level errors. - -Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI -`Skeleton`/`CircularProgress`/`Progress` for new loading states. diff --git a/.changeset/update-codecov.md b/.changeset/update-codecov.md deleted file mode 100644 index a845151cc..000000000 --- a/.changeset/update-codecov.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/upgrade-backstage-to-1-51.md b/.changeset/upgrade-backstage-to-1-51.md deleted file mode 100644 index f496d04fc..000000000 --- a/.changeset/upgrade-backstage-to-1-51.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -'@openchoreo/backstage-design-system': patch -'@openchoreo/backstage-plugin': patch -'@openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth': patch -'@openchoreo/backstage-plugin-catalog-backend-module': patch -'@openchoreo/backstage-plugin-catalog-backend-module-openchoreo-users': patch -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-ci-backend': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-openchoreo-observability-backend': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-openchoreo-workflows-backend': patch -'@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy': patch -'@openchoreo/backstage-plugin-platform-engineer-core': patch -'@openchoreo/backstage-plugin-platform-engineer-core-backend': patch -'@openchoreo/backstage-plugin-react': patch -'@openchoreo/backstage-plugin-scaffolder-backend-module': patch -'@openchoreo/backstage-plugin-thunder-idp-client-node': patch -'@openchoreo/openapi-client-generator-node': patch -'@openchoreo/openchoreo-auth': patch -'@openchoreo/openchoreo-client-node': patch ---- - -Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. - -This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. - -Notable adapter-side changes: - -- Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. -- Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. -- The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. -- React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. diff --git a/.changeset/virtualized-log-list.md b/.changeset/virtualized-log-list.md deleted file mode 100644 index d2caa2ee5..000000000 --- a/.changeset/virtualized-log-list.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -'@openchoreo/backstage-plugin-react': minor -'@openchoreo/backstage-plugin-common': patch -'@openchoreo/backstage-plugin-openchoreo-workflows': patch -'@openchoreo/backstage-plugin-openchoreo-ci': patch -'@openchoreo/backstage-plugin-openchoreo-observability': patch ---- - -Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. - -**New shared primitive (`@openchoreo/backstage-plugin-react`)** - -`VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. - -Alongside the primitive, three small hooks/utilities the consumers compose with: - -- `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. -- `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. -- `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. - -**Surfaces virtualized** - -- **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. -- **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. -- **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. -- **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). -- **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. -- **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. - -**Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** - -`isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. - -**Notable behavioural notes** - -- Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. -- Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). -- Per-row expanded state survives scrolling off-screen and back. -- Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. -- Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. diff --git a/.changeset/wirelogs-stream-timeout.md b/.changeset/wirelogs-stream-timeout.md deleted file mode 100644 index 3b76aa163..000000000 --- a/.changeset/wirelogs-stream-timeout.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-observability': patch -'@openchoreo/backstage-plugin-backend': patch ---- - -Limit how long a wirelogs stream can run. Wirelogs (Cilium Hubble flows) previously streamed indefinitely — there's no upstream timeout, so a forgotten tab could hold an open SSE connection for hours and degrade the browser. - -The backend `/wirelogs/stream` proxy now enforces a hard cap (default 15 minutes, configurable via `openchoreo.observability.wirelogs.streamTimeoutSeconds`): it advertises the cap to the client in a `meta` SSE frame and, on hitting it, sends a `timeout` frame before closing so the UI can label the stop precisely. The wirelogs view layers graduated soft warnings over this — confirmation dialogs at roughly one-third and two-thirds of the cap let the user stop early or knowingly continue, and a toast explains when the server ends the stream (the Start button resumes a fresh session). diff --git a/.changeset/workflow-list-fetch-all-pages.md b/.changeset/workflow-list-fetch-all-pages.md deleted file mode 100644 index 1d01c70e1..000000000 --- a/.changeset/workflow-list-fetch-all-pages.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-workflows-backend': patch ---- - -fetch all pages when listing workflows diff --git a/.changeset/workflow-runs-fetch-all-pages.md b/.changeset/workflow-runs-fetch-all-pages.md deleted file mode 100644 index d8d85ea46..000000000 --- a/.changeset/workflow-runs-fetch-all-pages.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openchoreo/backstage-plugin-openchoreo-workflows-backend': patch ---- - -fetch all pages when listing workflow runs diff --git a/VERSION b/VERSION index 8f890920f..26aaba0e8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0-rc.2 +1.2.0 diff --git a/package.json b/package.json index 1b5e65934..021016364 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.2.0-rc.2", + "version": "1.2.0", "private": true, "repository": { "type": "git", diff --git a/packages/app/package.json b/packages/app/package.json index 00ee9bd31..b80511932 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "1.2.0-rc.2", + "version": "1.2.0", "private": true, "bundled": true, "repository": { diff --git a/packages/backend/package.json b/packages/backend/package.json index e1a82bf40..bd41c8809 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "main": "dist/index.cjs.js", "types": "src/index.ts", "private": true, diff --git a/packages/cell-diagram/CHANGELOG.md b/packages/cell-diagram/CHANGELOG.md index 12812187e..87b5e68d6 100644 --- a/packages/cell-diagram/CHANGELOG.md +++ b/packages/cell-diagram/CHANGELOG.md @@ -1,5 +1,14 @@ # @openchoreo/cell-diagram +## 1.2.0 + +### Minor Changes + +- 436c144: Bring the Cell Diagram library into the repo as the internal package + `@openchoreo/cell-diagram` (previously the external `@wso2/cell-diagram`). The + exported API is unchanged; the frontend and backend plugins now consume the + workspace package. + ## 1.2.0-next.3 ### Minor Changes diff --git a/packages/cell-diagram/package.json b/packages/cell-diagram/package.json index 1d346cb2f..849a713c6 100644 --- a/packages/cell-diagram/package.json +++ b/packages/cell-diagram/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/cell-diagram", - "version": "1.2.0-rc.2", + "version": "1.2.0", "description": "React component library that visualizes OpenChoreo cell architectures.", "license": "Apache-2.0", "main": "src/index.ts", diff --git a/packages/design-system/CHANGELOG.md b/packages/design-system/CHANGELOG.md index cc700f7fe..dce68b1e1 100644 --- a/packages/design-system/CHANGELOG.md +++ b/packages/design-system/CHANGELOG.md @@ -1,5 +1,84 @@ # @openchoreo/backstage-design-system +## 1.2.0 + +### Minor Changes + +- 453b958: Show a "Suspended" status in the deployment pipeline when a component's workload is scaled to zero. The backend reads the suspended state that core already reports on the ReleaseBinding's ResourcesReady condition, and the pipeline badge now shows "Suspended" instead of "Active" for a scaled-to-zero workload. +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- 0d2433f: Fix sidebar section separators rendering as dark near-black lines in production + builds. The softening rule targeted the divider by its `BackstageSidebarDivider-root` + class prefix, which JSS mangles away in the production bundle; it now targets the + sidebar-nav `hr` element directly, so the light-mode divider stays a subtle grey in + both dev and prod. +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 14601f4: Clarify the save/discard/delete controls in the Workload editor rows + (endpoints, dependencies, environment variables, and file mounts). While + editing a row, a labeled footer bar (Save / Cancel / Delete) makes committing + or discarding clearly visible; read-only rows keep their compact inline + Edit / Delete buttons on a single line. Adds a reusable `EditRowActions` + design-system component shared by all of those row editors. +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.3 ### Minor Changes diff --git a/packages/design-system/package.json b/packages/design-system/package.json index d33fb64ee..af9874c0a 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-design-system", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/openapi-client-generator-node/CHANGELOG.md b/packages/openapi-client-generator-node/CHANGELOG.md index 89fbf99c0..b20776e18 100644 --- a/packages/openapi-client-generator-node/CHANGELOG.md +++ b/packages/openapi-client-generator-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @openchoreo/openapi-client-generator-node +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.0 ### Patch Changes diff --git a/packages/openapi-client-generator-node/package.json b/packages/openapi-client-generator-node/package.json index 219f0b351..ac90a57f7 100644 --- a/packages/openapi-client-generator-node/package.json +++ b/packages/openapi-client-generator-node/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/openapi-client-generator-node", - "version": "1.2.0-rc.2", + "version": "1.2.0", "description": "Generic OpenAPI client generator for Backstage plugins", "license": "Apache-2.0", "main": "src/index.ts", diff --git a/packages/openchoreo-auth/CHANGELOG.md b/packages/openchoreo-auth/CHANGELOG.md index 460a26e54..06908f8a7 100644 --- a/packages/openchoreo-auth/CHANGELOG.md +++ b/packages/openchoreo-auth/CHANGELOG.md @@ -1,5 +1,20 @@ # @openchoreo/openchoreo-auth +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.0 ### Patch Changes diff --git a/packages/openchoreo-auth/package.json b/packages/openchoreo-auth/package.json index 1ca3eee8f..4fea055a0 100644 --- a/packages/openchoreo-auth/package.json +++ b/packages/openchoreo-auth/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/openchoreo-auth", - "version": "1.2.0-rc.2", + "version": "1.2.0", "description": "Authentication service for OpenChoreo API integration", "license": "Apache-2.0", "main": "src/index.ts", diff --git a/packages/openchoreo-client-node/CHANGELOG.md b/packages/openchoreo-client-node/CHANGELOG.md index c3e9566ad..d00226a65 100644 --- a/packages/openchoreo-client-node/CHANGELOG.md +++ b/packages/openchoreo-client-node/CHANGELOG.md @@ -1,5 +1,42 @@ # @openchoreo/openchoreo-client-node +## 1.2.0 + +### Patch Changes + +- 529f13c: add component events view and hooks +- 52396b0: Show container names in the resource-tree pod logs tab and add a per-container + filter. The pod logs API now returns logs aggregated across all of a pod's + containers, each entry tagged with its container. For multi-container pods + (for example an app container plus a Dapr sidecar) the logs viewer aligns + each line into timestamp / container / message columns and adds a container + dropdown ("All containers" plus one entry per container) to filter the view. + Single-container pods are unchanged. +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 56b4e95: Adapt the tracing views to the OpenTelemetry span status model. The + observability API now returns a span's `status` as a `SpanStatus` object + (`code` of `ok`/`error`/`unset` plus an optional `message`) instead of a plain + status string. The waterfall tooltip now shows the span's status code, the span + details panel gains a dedicated Status section (alongside Attributes and Resource + Attributes) that surfaces the status message, and error spans stay highlighted + based on the status code. This also prevents the span tooltip from crashing when + the status is an object. +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.2 ### Patch Changes diff --git a/packages/openchoreo-client-node/package.json b/packages/openchoreo-client-node/package.json index 63449297c..181efd208 100644 --- a/packages/openchoreo-client-node/package.json +++ b/packages/openchoreo-client-node/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/openchoreo-client-node", - "version": "1.2.0-rc.2", + "version": "1.2.0", "description": "OpenChoreo API client with auto-generated TypeScript types", "license": "Apache-2.0", "main": "src/index.ts", diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md new file mode 100644 index 000000000..5f4da6ddd --- /dev/null +++ b/packages/test-utils/CHANGELOG.md @@ -0,0 +1,3 @@ +# @openchoreo/test-utils + +## 1.2.0 diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index c1e460648..a23c3daa7 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/test-utils", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "Shared test utilities for OpenChoreo Backstage plugins", "main": "src/index.ts", diff --git a/plugins/auth-backend-module-openchoreo-auth/CHANGELOG.md b/plugins/auth-backend-module-openchoreo-auth/CHANGELOG.md index 4b7dc4732..bd3d0aea9 100644 --- a/plugins/auth-backend-module-openchoreo-auth/CHANGELOG.md +++ b/plugins/auth-backend-module-openchoreo-auth/CHANGELOG.md @@ -1,5 +1,21 @@ # @openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth +## 1.2.0 + +### Patch Changes + +- 39d264c: Fix OAuth scopes in the auth code flow: inject configured scope into the passport-oauth2 token exchange and refresh, and expose the scope to the frontend client via `openchoreo.features.auth.scope` so sign-in and session refresh requests use the operator-configured scope instead of hardcoded defaults. +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.3 ### Patch Changes diff --git a/plugins/auth-backend-module-openchoreo-auth/package.json b/plugins/auth-backend-module-openchoreo-auth/package.json index 7767c759e..73d0c05ef 100644 --- a/plugins/auth-backend-module-openchoreo-auth/package.json +++ b/plugins/auth-backend-module-openchoreo-auth/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-auth-backend-module-openchoreo-auth", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "OpenChoreo authentication backend module for Backstage. Works with any OIDC-compliant IDP configured in OpenChoreo.", "main": "src/index.ts", diff --git a/plugins/catalog-backend-module-openchoreo-users/CHANGELOG.md b/plugins/catalog-backend-module-openchoreo-users/CHANGELOG.md index be654aabf..c40c241e4 100644 --- a/plugins/catalog-backend-module-openchoreo-users/CHANGELOG.md +++ b/plugins/catalog-backend-module-openchoreo-users/CHANGELOG.md @@ -1,5 +1,23 @@ # @openchoreo/backstage-plugin-catalog-backend-module-openchoreo-users +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [8d8bd80] + - @openchoreo/backstage-plugin-thunder-idp-client-node@1.2.0 + ## 1.2.0-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openchoreo-users/package.json b/plugins/catalog-backend-module-openchoreo-users/package.json index 50027aec9..70a450f97 100644 --- a/plugins/catalog-backend-module-openchoreo-users/package.json +++ b/plugins/catalog-backend-module-openchoreo-users/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-catalog-backend-module-openchoreo-users", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "The openchoreo-users backend module for the catalog plugin.", "main": "src/index.ts", diff --git a/plugins/catalog-backend-module-openchoreo/CHANGELOG.md b/plugins/catalog-backend-module-openchoreo/CHANGELOG.md index 42b80295e..46081be15 100644 --- a/plugins/catalog-backend-module-openchoreo/CHANGELOG.md +++ b/plugins/catalog-backend-module-openchoreo/CHANGELOG.md @@ -1,5 +1,71 @@ # @openchoreo/backstage-plugin-catalog-backend-module +## 1.2.0 + +### Minor Changes + +- 18e51cf: Add support for custom component-creation templates. A (Cluster)ComponentType + can now set the `scaffolder.openchoreo.dev/backstage-template-url` annotation to + point at a hand-authored Backstage scaffolder Template. When present, the catalog + sync fetches that Template from the URL (via the configured `integrations`) and + emits it in place of the auto-generated wizard; when absent, behaviour is + unchanged. Applies to both the periodic and event-driven sync paths. If the URL + cannot be read or does not yield a valid `kind: Template`, an error is logged and + no template is emitted for that type. +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 14f1052: Add a default-on Auto Deploy toggle to the project creation wizard. When on, `openchoreo:project:create` creates one unpinned ProjectReleaseBinding per deployment-pipeline environment after the project is created, and the control plane seeds the release pin once the first release is cut. Toggling it off shows a warning that the project must be deployed manually from its Deploy tab before components can be deployed. The Deploy tab now shows just-created unpinned bindings (`ProjectReleaseNotSet`) as pending instead of failed. + +### Patch Changes + +- ffa762f: Fix stale form data in the component-creation Build & Deploy section. + Generated templates now nest deploymentSource and its branch-specific + fields (workflow_name, git_source, workflow_parameters, containerImage, + autoDeploy, ciPlatform, ciIdentifier) under a single buildAndDeploy + object rendered by a composite field, so switching deployment source + clears the previous branch's data atomically — fixes + "instance.workflow requires property \"name\"" when a user picks Build + from Source and then switches to Container Image or External CI. +- 8416223: Add a per-ProjectType "Create Project" wizard, mirroring the Resource creation flow. + + Each `ProjectType` / `ClusterProjectType` now generates a scaffolder Template via `PtdToTemplateConverter`, surfaced under a new `?view=projects` browse view with a dedicated "Project" landing card. Selecting a type opens a wizard whose parameters step is driven by the type's `spec.parameters.openAPIV3Schema`, then creates the Project with `spec.type` and `spec.parameters` set via the extended `openchoreo:project:create` action (it falls back to the OpenChoreo API default when these are omitted, keeping the legacy path working). The catalog provider emits these templates during full sync and the event-delta path keeps them current. Replaces the static `create-openchoreo-project` template. + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [383e7f6] +- Updated dependencies [52396b0] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [1207eda] +- Updated dependencies [284fcd7] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-openchoreo/package.json b/plugins/catalog-backend-module-openchoreo/package.json index 50e97088d..ca12546b8 100644 --- a/plugins/catalog-backend-module-openchoreo/package.json +++ b/plugins/catalog-backend-module-openchoreo/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-catalog-backend-module", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "The openchoreo backend module for the catalog plugin.", "main": "src/index.ts", diff --git a/plugins/openchoreo-backend/CHANGELOG.md b/plugins/openchoreo-backend/CHANGELOG.md index d27110b25..dac7ac727 100644 --- a/plugins/openchoreo-backend/CHANGELOG.md +++ b/plugins/openchoreo-backend/CHANGELOG.md @@ -1,5 +1,88 @@ # @openchoreo/backstage-plugin-backend +## 1.2.0 + +### Minor Changes + +- f126bca: Block deploying a component to an environment where its project is not deployed, and guide the user to deploy the project first. +- cf2203a: Add a pod-aware exec terminal in the Deploy view. The Terminal lives in the K8s resource-tree drawer reached via Deploy → environment → View K8s Artifacts: it appears as a tab on the Pod node's drawer (with a container picker) when the pod is rendered in the tree, and falls back to the ReleaseBinding drawer when the pod is managed by another operator and the binding is healthy. The exec session targets the selected pod and container via WebSocket. The standalone component-level Terminal tab has been removed. + + Access is gated by the `openchoreo.exec` permission with per-environment ABAC, and the `POST /exec/init` backend endpoint now enforces this permission server-side so direct API calls cannot bypass the UI gate. + +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 284fcd7: Surface OpenChoreo controller auto-deploy failures in the Deploy tab. Pre-binding release-generation failures (bad trait, invalid config — from `Component.status.conditions`) now surface on the Setup card and as an error marker on the canvas Set-up tile, instead of leaving the user with no signal. Post-binding render/apply failures (from `ReleaseBinding.status.conditions`) show an actionable error banner with the controller's reason + message in the environment detail panel, instead of a context-free "Failed" badge. Long controller messages are clamped to a compact banner with a "View details" dialog (reason + full message + copy). +- 453b958: Show a "Suspended" status in the deployment pipeline when a component's workload is scaled to zero. The backend reads the suspended state that core already reports on the ReleaseBinding's ResourcesReady condition, and the pipeline badge now shows "Suspended" instead of "Active" for a scaled-to-zero workload. + +### Patch Changes + +- 436c144: Bring the Cell Diagram library into the repo as the internal package + `@openchoreo/cell-diagram` (previously the external `@wso2/cell-diagram`). The + exported API is unchanged; the frontend and backend plugins now consume the + workspace package. +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- f1163a9: Fix the Deploy views defaulting to every environment in the namespace when a project's deployment pipeline defines no environments. A resolved pipeline with no promotion paths now yields no environments (the UI shows its empty state), and a pipeline that cannot be resolved (missing `deploymentPipelineRef` or a failed pipeline fetch) surfaces an error state instead of silently listing all environments. + + A permission denial on the deployment-pipeline read (`deploymentpipelines:view`) now surfaces as a Forbidden state instead of a misleading "pipeline missing/misconfigured" error. + + The Component, Project, and Resource Deploy tabs now share the same empty-state and error-state cards (icon, message, and Retry) with consistent, pipeline-focused copy, replacing the plain text lines previously shown on the Project and Resource tabs. + +- 6b82eae: Update stale code comments that referenced the exec WebSocket proxy's old location (`packages/backend/src/index.ts`); it now lives in and is registered from the `@openchoreo/backstage-plugin-backend` plugin. +- e79c7b3: Prefer HTTPS over HTTP for endpoint URLs surfaced in the API test console. When + a ReleaseBinding endpoint exposes both an `http` and an `https` URL, the console + could show either one, since the frontend selects the first entry of each URL + map and is otherwise scheme-blind — which URL came first was decided by the + upstream control-plane response ordering. The `ReleaseBinding` transformer now + reorders each endpoint's `externalURLs`/`internalURLs` so `https` entries come + first (relative order otherwise preserved), making the existing frontend + selection land on the secure URL with no frontend change. http-only endpoints + and endpoints without URL maps are unaffected. +- d5eff9e: Replace the generic "No environments found. Make sure your component is properly configured." message on the observability pages (Runtime Logs, Runtime Events, Alerts, Wirelogs, Metrics, Traces, Incidents, Cost Analysis, RCA — component and project scoped) with cause-specific messaging. `useProjectEnvironments` now reports a discriminated status — `empty-pipeline` (the deployment pipeline has no environments), `forbidden` (permission to view the pipeline is denied), or `unavailable` (the pipeline is missing or couldn't be loaded) — and the pages render a cause-specific state via a shared `EnvironmentsStatusNotice` component, using the standard Backstage `EmptyState` (matching the Deploy tab). A missing `deploymentPipelineRef` now returns a clean 404 instead of a 500. +- 14f1052: Add a default-on Auto Deploy toggle to the project creation wizard. When on, `openchoreo:project:create` creates one unpinned ProjectReleaseBinding per deployment-pipeline environment after the project is created, and the control plane seeds the release pin once the first release is cut. Toggling it off shows a warning that the project must be deployed manually from its Deploy tab before components can be deployed. The Deploy tab now shows just-created unpinned bindings (`ProjectReleaseNotSet`) as pending instead of failed. +- 71f7b6c: Add a "Deploy" tab to the Project entity page for the project-release lifecycle. + + The tab renders the project's deployment pipeline as a DAG of environments with live status and drives deploy/promote through `ProjectRelease` / `ProjectReleaseBinding`. A "Set up" card opens a **Configure & Deploy** wizard: step 1 edits `Project.spec.parameters` against the `(Cluster)ProjectType` parameters schema (saving cuts a new `ProjectRelease`), step 2 pins the first environment's binding and edits its `environmentConfigs` overrides. Each environment node supports **Promote** (copy the pinned release forward to the next environment) and **Configure overrides**; all mutating actions gate on the project-update permission. + + Backed by new BFF endpoints (`/project-environment-info`, `/project-release-bindings`, `/update-project-release-binding`, `/project-release-schema`) and matching `OpenChoreoClient` methods. + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 5741d00: Limit how long a wirelogs stream can run. Wirelogs (Cilium Hubble flows) previously streamed indefinitely — there's no upstream timeout, so a forgotten tab could hold an open SSE connection for hours and degrade the browser. + + The backend `/wirelogs/stream` proxy now enforces a hard cap (default 15 minutes, configurable via `openchoreo.observability.wirelogs.streamTimeoutSeconds`): it advertises the cap to the client in a `meta` SSE frame and, on hitting it, sends a `timeout` frame before closing so the UI can label the stop precisely. The wirelogs view layers graduated soft warnings over this — confirmation dialogs at roughly one-third and two-thirds of the cap let the user stop early or knowingly continue, and a toast explains when the server ends the stream (the Start button resumes a fresh session). + +- Updated dependencies [ffa762f] +- Updated dependencies [18e51cf] +- Updated dependencies [436c144] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [383e7f6] +- Updated dependencies [52396b0] +- Updated dependencies [14f1052] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [1207eda] +- Updated dependencies [284fcd7] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-catalog-backend-module@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/cell-diagram@1.2.0 + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-backend/package.json b/plugins/openchoreo-backend/package.json index 5b45c664b..939a075cb 100644 --- a/plugins/openchoreo-backend/package.json +++ b/plugins/openchoreo-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-ci-backend/CHANGELOG.md b/plugins/openchoreo-ci-backend/CHANGELOG.md index 2c1236626..83344aaff 100644 --- a/plugins/openchoreo-ci-backend/CHANGELOG.md +++ b/plugins/openchoreo-ci-backend/CHANGELOG.md @@ -1,5 +1,47 @@ # @openchoreo/backstage-plugin-openchoreo-ci-backend +## 1.2.0 + +### Minor Changes + +- 59da378: show build events for past workflow runs by querying the observer events endpoint + +### Patch Changes + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [383e7f6] +- Updated dependencies [52396b0] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [284fcd7] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-ci-backend/package.json b/plugins/openchoreo-ci-backend/package.json index 2839c7aa1..ed6976fac 100644 --- a/plugins/openchoreo-ci-backend/package.json +++ b/plugins/openchoreo-ci-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-ci-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-ci/CHANGELOG.md b/plugins/openchoreo-ci/CHANGELOG.md index 01b9aef11..1219b9534 100644 --- a/plugins/openchoreo-ci/CHANGELOG.md +++ b/plugins/openchoreo-ci/CHANGELOG.md @@ -1,5 +1,203 @@ # @openchoreo/backstage-plugin-openchoreo-ci +## 1.2.0 + +### Minor Changes + +- 59da378: show build events for past workflow runs by querying the observer events endpoint + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and + migrate the portal's data-fetching hooks onto it, so cached data paints + instantly on remount and a background refresh no longer blanks the view. + + New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so + plugins never import it directly: + + - `useOpenChoreoQuery` — cached reads, returning the + `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. + - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached + queries on success (replacing the hand-rolled "call verb then refetch"). + - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists + (runtime logs/events). + - `useOpenChoreoCache` — imperative cache access for optimistic writes and the + lazy, dynamically-keyed hooks. + + Migrated across the openchoreo, observability, CI and workflows plugins: simple + and parameterized reads, read+mutation hooks, `setInterval` pollers (now + `refetchInterval` with terminal stop conditions), lazy/conditional and + keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` + sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. + The provider is mounted in the app root and the cache is cleared on sign-out. + + The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller + actually sets them — passing an explicit `undefined` overrides the QueryClient + default instead of inheriting it, which resolved `staleTime` to 0 and refetched + on every remount, silently defeating the shared 30s cache. + + The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` + into `loading`; a background refresh kept re-showing their full skeleton (the + "blank on refresh" the cache was meant to remove). They now report `loading` + for the first load only and expose `isRefetching` separately. + +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. + + **New shared primitive (`@openchoreo/backstage-plugin-react`)** + + `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. + + Alongside the primitive, three small hooks/utilities the consumers compose with: + + - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. + - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. + - `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. + + **Surfaces virtualized** + + - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. + - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. + - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. + - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). + - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. + - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. + + **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** + + `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. + + **Notable behavioural notes** + + - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. + - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). + - Per-row expanded state survives scrolling off-screen and back. + - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. + - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. + +- Updated dependencies [591df85] +- Updated dependencies [c86de7f] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [8381554] +- Updated dependencies [39d264c] +- Updated dependencies [0d2433f] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [915e2e5] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-react@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-ci/package.json b/plugins/openchoreo-ci/package.json index de08aa840..81d48ac75 100644 --- a/plugins/openchoreo-ci/package.json +++ b/plugins/openchoreo-ci/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-ci", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-common/CHANGELOG.md b/plugins/openchoreo-common/CHANGELOG.md index 2da04ebea..565d36d4d 100644 --- a/plugins/openchoreo-common/CHANGELOG.md +++ b/plugins/openchoreo-common/CHANGELOG.md @@ -1,5 +1,100 @@ # @openchoreo/backstage-plugin-common +## 1.2.0 + +### Minor Changes + +- 18e51cf: Add support for custom component-creation templates. A (Cluster)ComponentType + can now set the `scaffolder.openchoreo.dev/backstage-template-url` annotation to + point at a hand-authored Backstage scaffolder Template. When present, the catalog + sync fetches that Template from the URL (via the configured `integrations`) and + emits it in place of the auto-generated wizard; when absent, behaviour is + unchanged. Applies to both the periodic and event-driven sync paths. If the URL + cannot be read or does not yield a valid `kind: Template`, an error is logged and + no template is emitted for that type. +- cf2203a: Add a pod-aware exec terminal in the Deploy view. The Terminal lives in the K8s resource-tree drawer reached via Deploy → environment → View K8s Artifacts: it appears as a tab on the Pod node's drawer (with a container picker) when the pod is rendered in the tree, and falls back to the ReleaseBinding drawer when the pod is managed by another operator and the binding is healthy. The exec session targets the selected pod and container via WebSocket. The standalone component-level Terminal tab has been removed. + + Access is gated by the `openchoreo.exec` permission with per-environment ABAC, and the `POST /exec/init` backend endpoint now enforces this permission server-side so direct API calls cannot bypass the UI gate. + +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 284fcd7: Surface OpenChoreo controller auto-deploy failures in the Deploy tab. Pre-binding release-generation failures (bad trait, invalid config — from `Component.status.conditions`) now surface on the Setup card and as an error marker on the canvas Set-up tile, instead of leaving the user with no signal. Post-binding render/apply failures (from `ReleaseBinding.status.conditions`) show an actionable error banner with the controller's reason + message in the environment detail panel, instead of a context-free "Failed" badge. Long controller messages are clamped to a compact banner with a "View details" dialog (reason + full message + copy). + +### Patch Changes + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- 529f13c: add component events view and hooks +- 39d264c: Fix OAuth scopes in the auth code flow: inject configured scope into the passport-oauth2 token exchange and refresh, and expose the scope to the frontend client via `openchoreo.features.auth.scope` so sign-in and session refresh requests use the operator-configured scope instead of hardcoded defaults. +- 8416223: Add a per-ProjectType "Create Project" wizard, mirroring the Resource creation flow. + + Each `ProjectType` / `ClusterProjectType` now generates a scaffolder Template via `PtdToTemplateConverter`, surfaced under a new `?view=projects` browse view with a dedicated "Project" landing card. Selecting a type opens a wizard whose parameters step is driven by the type's `spec.parameters.openAPIV3Schema`, then creates the Project with `spec.type` and `spec.parameters` set via the extended `openchoreo:project:create` action (it falls back to the OpenChoreo API default when these are omitted, keeping the legacy path working). The catalog provider emits these templates during full sync and the event-delta path keeps them current. Replaces the static `create-openchoreo-project` template. + +- 71f7b6c: Add a "Deploy" tab to the Project entity page for the project-release lifecycle. + + The tab renders the project's deployment pipeline as a DAG of environments with live status and drives deploy/promote through `ProjectRelease` / `ProjectReleaseBinding`. A "Set up" card opens a **Configure & Deploy** wizard: step 1 edits `Project.spec.parameters` against the `(Cluster)ProjectType` parameters schema (saving cuts a new `ProjectRelease`), step 2 pins the first environment's binding and edits its `environmentConfigs` overrides. Each environment node supports **Promote** (copy the pinned release forward to the next environment) and **Configure overrides**; all mutating actions gate on the project-update permission. + + Backed by new BFF endpoints (`/project-environment-info`, `/project-release-bindings`, `/update-project-release-binding`, `/project-release-schema`) and matching `OpenChoreoClient` methods. + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. + + **New shared primitive (`@openchoreo/backstage-plugin-react`)** + + `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. + + Alongside the primitive, three small hooks/utilities the consumers compose with: + + - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. + - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. + - `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. + + **Surfaces virtualized** + + - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. + - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. + - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. + - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). + - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. + - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. + + **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** + + `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. + + **Notable behavioural notes** + + - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. + - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). + - Per-row expanded state survives scrolling off-screen and back. + - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. + - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. + +- Updated dependencies [529f13c] +- Updated dependencies [52396b0] +- Updated dependencies [2f45e83] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] + - @openchoreo/openchoreo-client-node@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-common/package.json b/plugins/openchoreo-common/package.json index 5992a002d..7173b091d 100644 --- a/plugins/openchoreo-common/package.json +++ b/plugins/openchoreo-common/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-common", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "Common package for shared types and constants", "main": "src/index.ts", diff --git a/plugins/openchoreo-observability-backend/CHANGELOG.md b/plugins/openchoreo-observability-backend/CHANGELOG.md index 902dbf819..fa6f2db46 100644 --- a/plugins/openchoreo-observability-backend/CHANGELOG.md +++ b/plugins/openchoreo-observability-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @openchoreo/backstage-plugin-openchoreo-observability-backend +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [529f13c] +- Updated dependencies [52396b0] +- Updated dependencies [2f45e83] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-observability-backend/package.json b/plugins/openchoreo-observability-backend/package.json index 632d77471..9a0f0ec8b 100644 --- a/plugins/openchoreo-observability-backend/package.json +++ b/plugins/openchoreo-observability-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-observability-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-observability/CHANGELOG.md b/plugins/openchoreo-observability/CHANGELOG.md index 00aed45da..ed1e75c5a 100644 --- a/plugins/openchoreo-observability/CHANGELOG.md +++ b/plugins/openchoreo-observability/CHANGELOG.md @@ -1,5 +1,232 @@ # @openchoreo/backstage-plugin-openchoreo-observability +## 1.2.0 + +### Minor Changes + +- 529f13c: add component events view and hooks +- af359bd: Add the `useComponentHasAnyCiliumEnabledEnvironment` hook, which resolves on the client whether any of a component's project environments runs Cilium — it fetches the project's environments and probes each backing DataPlane's `networkpolicyprovider` (the same source the Wirelogs page uses to enable/disable individual environments). It returns `false` until the probe confirms at least one Cilium environment. + + The portal uses this to hide the component-level **Wirelogs** tab unless at least one environment runs Cilium (wirelogs are sourced from Cilium Hubble). Previously the tab was always shown and, on a core OpenChoreo setup with no Cilium DataPlanes, rendered an empty "configure Cilium" state — a dead tab with no usable content. Resolving availability at render time means no catalog-sync annotation or DataPlane event cascade is required. + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- 7da3c7d: Convert the RCA chat to a right drawer where previously it was inbuild to the page +- 4dd5d2a: Rename RCA agent chat to Portal Assistant +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- d5eff9e: Replace the generic "No environments found. Make sure your component is properly configured." message on the observability pages (Runtime Logs, Runtime Events, Alerts, Wirelogs, Metrics, Traces, Incidents, Cost Analysis, RCA — component and project scoped) with cause-specific messaging. `useProjectEnvironments` now reports a discriminated status — `empty-pipeline` (the deployment pipeline has no environments), `forbidden` (permission to view the pipeline is denied), or `unavailable` (the pipeline is missing or couldn't be loaded) — and the pages render a cause-specific state via a shared `EnvironmentsStatusNotice` component, using the standard Backstage `EmptyState` (matching the Deploy tab). A missing `deploymentPipelineRef` now returns a clean 404 instead of a 500. +- 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and + migrate the portal's data-fetching hooks onto it, so cached data paints + instantly on remount and a background refresh no longer blanks the view. + + New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so + plugins never import it directly: + + - `useOpenChoreoQuery` — cached reads, returning the + `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. + - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached + queries on success (replacing the hand-rolled "call verb then refetch"). + - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists + (runtime logs/events). + - `useOpenChoreoCache` — imperative cache access for optimistic writes and the + lazy, dynamically-keyed hooks. + + Migrated across the openchoreo, observability, CI and workflows plugins: simple + and parameterized reads, read+mutation hooks, `setInterval` pollers (now + `refetchInterval` with terminal stop conditions), lazy/conditional and + keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` + sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. + The provider is mounted in the app root and the cache is cleared on sign-out. + + The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller + actually sets them — passing an explicit `undefined` overrides the QueryClient + default instead of inheriting it, which resolved `staleTime` to 0 and refetched + on every remount, silently defeating the shared 30s cache. + + The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` + into `loading`; a background refresh kept re-showing their full skeleton (the + "blank on refresh" the cache was meant to remove). They now report `loading` + for the first load only and expose `isRefetching` separately. + +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- 56b4e95: Adapt the tracing views to the OpenTelemetry span status model. The + observability API now returns a span's `status` as a `SpanStatus` object + (`code` of `ok`/`error`/`unset` plus an optional `message`) instead of a plain + status string. The waterfall tooltip now shows the span's status code, the span + details panel gains a dedicated Status section (alongside Attributes and Resource + Attributes) that surfaces the status message, and error spans stay highlighted + based on the status code. This also prevents the span tooltip from crashing when + the status is an object. +- d89f030: Fix trace span details never loading from cache. The span cache key included + the filter scope and time window, whose timestamps changed every render, so the + key used to read spans (`getSpans`) no longer matched the one they were cached + under and always returned `undefined`. Spans are now keyed by trace id alone — + a trace id uniquely identifies its spans regardless of the query scope. +- 56b4e95: Fix the error stripe not rendering on error rows in the traces table. The red + "contains errors" indicator was drawn by CSS targeting table cells (`td`/`th`) + that no longer exist after the table moved to a div-based virtualized layout, + and the span that did render (the tooltip's hover target) had no fill colour. + The stripe is now drawn on the rendered element, so error traces show the red + stripe again. +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. + + **New shared primitive (`@openchoreo/backstage-plugin-react`)** + + `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. + + Alongside the primitive, three small hooks/utilities the consumers compose with: + + - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. + - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. + - `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. + + **Surfaces virtualized** + + - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. + - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. + - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. + - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). + - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. + - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. + + **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** + + `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. + + **Notable behavioural notes** + + - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. + - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). + - Per-row expanded state survives scrolling off-screen and back. + - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. + - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. + +- 5741d00: Limit how long a wirelogs stream can run. Wirelogs (Cilium Hubble flows) previously streamed indefinitely — there's no upstream timeout, so a forgotten tab could hold an open SSE connection for hours and degrade the browser. + + The backend `/wirelogs/stream` proxy now enforces a hard cap (default 15 minutes, configurable via `openchoreo.observability.wirelogs.streamTimeoutSeconds`): it advertises the cap to the client in a `meta` SSE frame and, on hitting it, sends a `timeout` frame before closing so the UI can label the stop precisely. The wirelogs view layers graduated soft warnings over this — confirmation dialogs at roughly one-third and two-thirds of the cap let the user stop early or knowingly continue, and a toast explains when the server ends the stream (the Start button resumes a fresh session). + +- Updated dependencies [591df85] +- Updated dependencies [c86de7f] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [8381554] +- Updated dependencies [39d264c] +- Updated dependencies [0d2433f] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [915e2e5] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-react@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-observability/package.json b/plugins/openchoreo-observability/package.json index b1a6a1a42..5fdcff090 100644 --- a/plugins/openchoreo-observability/package.json +++ b/plugins/openchoreo-observability/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-observability", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-portal-assistant-backend/CHANGELOG.md b/plugins/openchoreo-portal-assistant-backend/CHANGELOG.md index 1f93358ab..01a3cd253 100644 --- a/plugins/openchoreo-portal-assistant-backend/CHANGELOG.md +++ b/plugins/openchoreo-portal-assistant-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @openchoreo/backstage-plugin-openchoreo-portal-assistant-backend +## 2.0.0 + +### Major Changes + +- 32417cd: Support response streaming and provide the prompt for the AI agent to act + +### Patch Changes + +- d03eaf7: Provide investigation support for deployment issues. + ## 1.2.0-next.3 ### Patch Changes diff --git a/plugins/openchoreo-portal-assistant-backend/package.json b/plugins/openchoreo-portal-assistant-backend/package.json index a974f2ba6..40f7be2d4 100644 --- a/plugins/openchoreo-portal-assistant-backend/package.json +++ b/plugins/openchoreo-portal-assistant-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-portal-assistant-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "private": true, "main": "src/index.ts", diff --git a/plugins/openchoreo-portal-assistant/CHANGELOG.md b/plugins/openchoreo-portal-assistant/CHANGELOG.md index 785b02850..6923fd419 100644 --- a/plugins/openchoreo-portal-assistant/CHANGELOG.md +++ b/plugins/openchoreo-portal-assistant/CHANGELOG.md @@ -1,5 +1,45 @@ # @openchoreo/backstage-plugin-openchoreo-portal-assistant +## 2.0.0 + +### Major Changes + +- 32417cd: Support response streaming and provide the prompt for the AI agent to act + +### Patch Changes + +- 7da3c7d: Convert the RCA chat to a right drawer where previously it was inbuild to the page +- d03eaf7: Provide investigation support for deployment issues. +- Updated dependencies [591df85] +- Updated dependencies [59da378] +- Updated dependencies [c86de7f] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [8381554] +- Updated dependencies [39d264c] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [915e2e5] +- Updated dependencies [284fcd7] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-react@1.2.0 + - @openchoreo/backstage-plugin-openchoreo-ci@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-portal-assistant/package.json b/plugins/openchoreo-portal-assistant/package.json index 675172cf1..3e0dda0d5 100644 --- a/plugins/openchoreo-portal-assistant/package.json +++ b/plugins/openchoreo-portal-assistant/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-portal-assistant", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "//": "private+publishConfig is the canonical Backstage workspace pattern (see every sibling plugin). private:true blocks accidental yarn publish during day-to-day work; the Backstage CLI's prepack swaps private off and merges publishConfig.* to top-level fields at release time, where access:'public' is needed for scoped packages (npm defaults to 'restricted'). The pair is intentionally co-resident; do NOT remove either key in isolation.", "private": true, diff --git a/plugins/openchoreo-react/CHANGELOG.md b/plugins/openchoreo-react/CHANGELOG.md index a3774ffb1..1e7ea44cb 100644 --- a/plugins/openchoreo-react/CHANGELOG.md +++ b/plugins/openchoreo-react/CHANGELOG.md @@ -1,5 +1,283 @@ # @openchoreo/backstage-plugin-react +## 1.2.0 + +### Minor Changes + +- cf2203a: Add a pod-aware exec terminal in the Deploy view. The Terminal lives in the K8s resource-tree drawer reached via Deploy → environment → View K8s Artifacts: it appears as a tab on the Pod node's drawer (with a container picker) when the pod is rendered in the tree, and falls back to the ReleaseBinding drawer when the pod is managed by another operator and the binding is healthy. The exec session targets the selected pod and container via WebSocket. The standalone component-level Terminal tab has been removed. + + Access is gated by the `openchoreo.exec` permission with per-environment ABAC, and the `POST /exec/init` backend endpoint now enforces this permission server-side so direct API calls cannot bypass the UI gate. + +- b52e578: Fix cached catalog data not refreshing after a change. Creating a component or project + left the project contents table, the namespace projects card and the catalog list showing + the previous contents until you navigated away and back. Cached catalog reads are now + refreshed before they are handed to the page, and the namespace cards update in place when + newer data arrives. +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 4d7ebff: Add a Refresh action to the Project Contents card and back it with the response + cache. + + A Refresh icon button next to the "Project Contents" title re-pulls the table + rows (and their per-environment deployment status) together with the count badge + and type-filter options. `useProjectContentsPage` moves off a hand-rolled + `useEffect` fetch onto `useOpenChoreoQuery`, split into two dependent queries + (page rows + visible-row deployment bindings), so it gains `refetch`/ + `isRefetching` and smoother paging. The card also reserves a full page's height + so navigating to a shorter last page no longer makes the widget jump. + + `useOpenChoreoQuery` gains an optional `keepPreviousData` flag (forwarded as + `placeholderData: keepPreviousData`) so paginated queries can keep the previous + page on screen while the next one loads. It is additive and only applied when + set, so existing callers are unchanged. + +- 1207eda: Add `resource.resourceType` ABAC condition to resource creation, gating the resource template chooser and the creation wizard per resource type. +- 7c76d05: Add `resource.resourceType` ABAC condition to resource update, gating the resource definition editor per resource type. +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. + + **New shared primitive (`@openchoreo/backstage-plugin-react`)** + + `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. + + Alongside the primitive, three small hooks/utilities the consumers compose with: + + - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. + - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. + - `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. + + **Surfaces virtualized** + + - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. + - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. + - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. + - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). + - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. + - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. + + **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** + + `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. + + **Notable behavioural notes** + + - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. + - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). + - Per-row expanded state survives scrolling off-screen and back. + - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. + - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- c86de7f: Cache catalog reads and switch the response cache to always-revalidate. + + The catalog list and entity pages now read through a `CachingCatalogApi` wrapper + (exported from `@openchoreo/backstage-plugin-react`) that routes + `getEntities`/`queryEntities`/`getEntityByRef`/`getEntitiesByRefs` through the + shared `queryClient`, keyed per signed-in user. Previously the catalog used + Backstage's `CatalogApi` directly, so every visit re-fetched from scratch and + flashed a loading skeleton; now a revisited catalog list or entity page paints + instantly from the warm cache. Catalog writes (`refreshEntity`, location + add/remove/update, `removeEntityByUid`) invalidate the cache so user changes show + immediately. + + The `queryClient` default `staleTime` changes from 30s to 0 (always + stale-while-revalidate): a revisited surface paints cached data instantly and + always runs a background refresh, so nothing on screen is left silently stale. + The two hooks that set an explicit 30s `staleTime` now inherit this default. + + The entity-header breadcrumb dropdowns (namespace/project/component sibling + lists) now read their data through `useOpenChoreoQuery` instead of an imperative + `await catalogApi.getEntities(...)`, so reopening a level renders the cached list + instantly (no loading spinner) and only revalidates in the background, rather + than blocking on the network every open. + + The catalog list page seeds its initial rows from the cached `queryEntities` + response (via the newly exported `useUserScopedKey`), so returning to a + previously viewed list paints instantly from cache instead of flashing a + skeleton while `useEntityList` re-fetches. `useUserScopedKey` is now exported + from `@openchoreo/backstage-plugin-react`. + + Both cached-first surfaces now show a quiet inline spinner next to their label + (the "All Components (N)" count and the breadcrumb menu title) while their + background revalidation runs, so a refresh is visible instead of the data + swapping in silently. The spinner tracks the real network refetch on the shared + `queryClient` (via `useIsFetching`), not the surface's own `loading` flag — + which resolves the instant the cached read returns while the revalidation is + still in flight. + + Switching the catalog Kind filter now reflects the newly selected kind + immediately: a cached kind's rows and title appear at once from the cache, and + an uncached kind shows a clean full-page loader under the new kind's title + instead of leaving the previous kind's rows on screen until the fetch resolves. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- 529f13c: add component events view and hooks +- 8381554: Fix the "Add Trait" / "Update Trait" button staying disabled in the YAML + view of the trait dialogs even after the user has filled in every + required field. `TraitConfigToggle` now propagates each YAML edit to + the parent (debounced 150 ms; flushed synchronously on blur and when + switching to form view), so schema-validity recomputes as the user + types instead of only on focus loss. +- 8381554: Add JSON Schema → annotated YAML utilities (`buildYamlString`, + `buildYamlData`, `generateDefaults`) for editors that toggle between a + structured form and a raw YAML view. `buildYamlString` walks the schema + recursively so nested required scalars get a `# required` hint and + enum-constrained scalars get `# allowed: `; `allOf` composition, + nullable type arrays (`["object", "null"]`), and non-string enum values + are handled. `TraitConfigToggle` now delegates to these helpers in + place of its previous single-level annotation, so deeply-required and + enum fields in trait schemas surface their constraints in the YAML + view. +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- d5eff9e: Replace the generic "No environments found. Make sure your component is properly configured." message on the observability pages (Runtime Logs, Runtime Events, Alerts, Wirelogs, Metrics, Traces, Incidents, Cost Analysis, RCA — component and project scoped) with cause-specific messaging. `useProjectEnvironments` now reports a discriminated status — `empty-pipeline` (the deployment pipeline has no environments), `forbidden` (permission to view the pipeline is denied), or `unavailable` (the pipeline is missing or couldn't be loaded) — and the pages render a cause-specific state via a shared `EnvironmentsStatusNotice` component, using the standard Backstage `EmptyState` (matching the Deploy tab). A missing `deploymentPipelineRef` now returns a clean 404 instead of a 500. +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and + migrate the portal's data-fetching hooks onto it, so cached data paints + instantly on remount and a background refresh no longer blanks the view. + + New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so + plugins never import it directly: + + - `useOpenChoreoQuery` — cached reads, returning the + `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. + - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached + queries on success (replacing the hand-rolled "call verb then refetch"). + - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists + (runtime logs/events). + - `useOpenChoreoCache` — imperative cache access for optimistic writes and the + lazy, dynamically-keyed hooks. + + Migrated across the openchoreo, observability, CI and workflows plugins: simple + and parameterized reads, read+mutation hooks, `setInterval` pollers (now + `refetchInterval` with terminal stop conditions), lazy/conditional and + keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` + sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. + The provider is mounted in the app root and the cache is cleared on sign-out. + + The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller + actually sets them — passing an explicit `undefined` overrides the QueryClient + default instead of inheriting it, which resolved `staleTime` to 0 and refetched + on every remount, silently defeating the shared 30s cache. + + The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` + into `loading`; a background refresh kept re-showing their full skeleton (the + "blank on refresh" the cache was meant to remove). They now report `loading` + for the first load only and expose `isRefetching` separately. + +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [591df85] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [0d2433f] +- Updated dependencies [383e7f6] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + ## 1.2.0-next.2 ### Minor Changes diff --git a/plugins/openchoreo-react/package.json b/plugins/openchoreo-react/package.json index ad4468f7c..ea6b6106f 100644 --- a/plugins/openchoreo-react/package.json +++ b/plugins/openchoreo-react/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-react", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "Shared React components, hooks, and utilities for OpenChoreo Backstage plugins", "main": "src/index.ts", diff --git a/plugins/openchoreo-workflows-backend/CHANGELOG.md b/plugins/openchoreo-workflows-backend/CHANGELOG.md index 8ffcb9f6c..7c25f25af 100644 --- a/plugins/openchoreo-workflows-backend/CHANGELOG.md +++ b/plugins/openchoreo-workflows-backend/CHANGELOG.md @@ -1,5 +1,30 @@ # @openchoreo/backstage-plugin-openchoreo-workflows-backend +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- 0b71ed9: fetch all pages when listing workflows +- 7e84bb5: fetch all pages when listing workflow runs +- Updated dependencies [529f13c] +- Updated dependencies [52396b0] +- Updated dependencies [2f45e83] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-workflows-backend/package.json b/plugins/openchoreo-workflows-backend/package.json index 16aa09d77..5d9682d99 100644 --- a/plugins/openchoreo-workflows-backend/package.json +++ b/plugins/openchoreo-workflows-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-workflows-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo-workflows/CHANGELOG.md b/plugins/openchoreo-workflows/CHANGELOG.md index 28e46f78e..4aa45e4ba 100644 --- a/plugins/openchoreo-workflows/CHANGELOG.md +++ b/plugins/openchoreo-workflows/CHANGELOG.md @@ -1,5 +1,211 @@ # @openchoreo/backstage-plugin-openchoreo-workflows +## 1.2.0 + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and + migrate the portal's data-fetching hooks onto it, so cached data paints + instantly on remount and a background refresh no longer blanks the view. + + New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so + plugins never import it directly: + + - `useOpenChoreoQuery` — cached reads, returning the + `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. + - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached + queries on success (replacing the hand-rolled "call verb then refetch"). + - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists + (runtime logs/events). + - `useOpenChoreoCache` — imperative cache access for optimistic writes and the + lazy, dynamically-keyed hooks. + + Migrated across the openchoreo, observability, CI and workflows plugins: simple + and parameterized reads, read+mutation hooks, `setInterval` pollers (now + `refetchInterval` with terminal stop conditions), lazy/conditional and + keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` + sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. + The provider is mounted in the app root and the cache is cleared on sign-out. + + The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller + actually sets them — passing an explicit `undefined` overrides the QueryClient + default instead of inheriting it, which resolved `staleTime` to 0 and refetched + on every remount, silently defeating the shared 30s cache. + + The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` + into `loading`; a background refresh kept re-showing their full skeleton (the + "blank on refresh" the cache was meant to remove). They now report `loading` + for the first load only and expose `isRefetching` separately. + +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- d19ffcf: Virtualize the log/event/trace/wirelog views with a new shared `VirtualizedLogList` primitive. + + **New shared primitive (`@openchoreo/backstage-plugin-react`)** + + `VirtualizedLogList` is a headless windowed list built on `@tanstack/react-virtual`. It handles row windowing, automatic variable/wrapped row-height measurement (via `measureElement`), follow-tail for live streams, scroll-driven load-more (`onReachEnd`), and exposes `header` / `footer` slots that render inside the scroll container so they share the rows' content width and stay aligned with the body cells. + + Alongside the primitive, three small hooks/utilities the consumers compose with: + + - `useRowExpansion()` — tracks expanded row keys in a Set lifted to the parent table, so per-row expansion survives the virtualizer unmounting off-screen rows. + - `useAutoLoadWhenEmpty({ count, hasMore, loading, onLoadMore })` — fires `onLoadMore` once when the list is empty but the server reports more pages, restoring the IntersectionObserver-equivalent "auto-fetch when the sentinel is visible" behaviour now that there is no DOM sentinel. Re-arms on count transitions, doesn't loop on repeated empty responses. + - `makeColumnStyle(flexByKey)` — factory that builds the `getColumnStyle(key)` helper for the div-based tables. Memoizes style objects per key so cell renders return stable references. + + **Surfaces virtualized** + + - **Build Logs** (`openchoreo-ci` `LogsContent`) — per-step build log viewer with accordion sections. Single fetch per step plus periodic polling. + - **Workflow Run Step Logs** (`openchoreo-workflows`) — generic workflow run step logs. Follow-tail pinned to the bottom while a step is running. + - **Runtime Logs** (`openchoreo-observability` `LogsTable` / `LogEntry`) — multi-column observability runtime logs. Sticky multi-column header, severity chips, expand-on-click rows, copy/investigate actions, infinite scroll wired through `onReachEnd` + `useAutoLoadWhenEmpty` (replacing the previous IntersectionObserver sentinel). The Phase-1/2 a11y attributes (`scope="col"`, `role="status"`/`aria-busy`/`aria-hidden`) carry across to the new div-based markup as `role="table"`/`role="row"`/`role="columnheader"` and the load-more spinner. + - **Runtime Events** (`openchoreo-observability` `EventsTable` / `EventEntry`) — same shape as Runtime Logs (multi-column, expand-on-click, infinite scroll). + - **Wirelogs** (`openchoreo-observability` `WirelogsTable`) — Cilium flow stream viewer. The previous hand-rolled `stickToBottomRef` + `useLayoutEffect` is replaced by the primitive's `followTail`, which catches both append and same-length cap-shift / dedupe / replace-by-uuid updates via last-item-key tracking. + - **Traces** (`openchoreo-observability` `TracesTable`) — project-level traces with expand-on-click `WaterfallView`. Click events inside the waterfall are isolated from the row toggle. + + **Shared workflow-status helpers (`@openchoreo/backstage-plugin-common`)** + + `isTerminalStatus(status)` and `isStepLive(step, parentStatus)` replace four near-identical inline copies across `BuildLogs`, `BuildEvents`, `WorkflowRunStepLogs`, `WorkflowRunEvents`, and `RunMetadataContent`. One source of truth, case-insensitive matching, structurally-typed `isStepLive` so it accepts any `{ phase?: string }`-shaped step. + + **Notable behavioural notes** + + - Long runs paint faster and scroll smoothly — only the viewport's worth of rows is mounted regardless of payload size. + - Wrapped multi-line log entries no longer overlap (auto-measured by tanstack instead of the previous hand-rolled measurement on top of react-window v1). + - Per-row expanded state survives scrolling off-screen and back. + - Live streams (running step logs, wirelogs) stay pinned to the newest row while the user is at the bottom; the tail releases as soon as they scroll up. + - Load-more recovers from a server response of `hasMore: true` with no new rows: the user can scroll away and back to the bottom to re-trigger. + +- Updated dependencies [5222138] +- Updated dependencies [591df85] +- Updated dependencies [c86de7f] +- Updated dependencies [591df85] +- Updated dependencies [436c144] +- Updated dependencies [86957df] +- Updated dependencies [62608f5] +- Updated dependencies [f126bca] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [e809b2d] +- Updated dependencies [d5eff9e] +- Updated dependencies [f1163a9] +- Updated dependencies [c7c41b7] +- Updated dependencies [8381554] +- Updated dependencies [0d2433f] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [0b1d374] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [52396b0] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [e384b25] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [84cfaeb] +- Updated dependencies [915e2e5] +- Updated dependencies [c6f1de1] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin@1.2.0 + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-react@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo-workflows/package.json b/plugins/openchoreo-workflows/package.json index 510666ed8..28d72836a 100644 --- a/plugins/openchoreo-workflows/package.json +++ b/plugins/openchoreo-workflows/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-openchoreo-workflows", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/openchoreo/CHANGELOG.md b/plugins/openchoreo/CHANGELOG.md index 9095cbaf9..284ba147f 100644 --- a/plugins/openchoreo/CHANGELOG.md +++ b/plugins/openchoreo/CHANGELOG.md @@ -1,5 +1,326 @@ # @openchoreo/backstage-plugin +## 1.2.0 + +### Minor Changes + +- 5222138: Add an environment-aware API Try Out console (Swagger UI for OpenAPI, GraphiQL for GraphQL) to the component API view +- 86957df: Cell Diagram: each component node's ⋮ menu now links to that component's key tabs — Overview, Deploy, Logs, Metrics, and (when an environment has Cilium-backed network observability) Wirelogs — in a project's Cell Diagram tab. +- f126bca: Block deploying a component to an environment where its project is not deployed, and guide the user to deploy the project first. +- cf2203a: Add a pod-aware exec terminal in the Deploy view. The Terminal lives in the K8s resource-tree drawer reached via Deploy → environment → View K8s Artifacts: it appears as a tab on the Pod node's drawer (with a container picker) when the pod is rendered in the tree, and falls back to the ReleaseBinding drawer when the pod is managed by another operator and the binding is healthy. The exec session targets the selected pod and container via WebSocket. The standalone component-level Terminal tab has been removed. + + Access is gated by the `openchoreo.exec` permission with per-environment ABAC, and the `POST /exec/init` backend endpoint now enforces this permission server-side so direct API calls cannot bypass the UI gate. + +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- e384b25: Show **Summary** and **Definition** tabs on the release details page when a rendered release is selected in the resource tree. The Summary tab lists the release's status conditions alongside its owning project, component, environment and target plane, so a failed apply to the data plane surfaces directly in the drawer as `ResourcesApplied=False` with the apply error as the condition message. The Definition tab renders the full rendered release as YAML. + + Rendered releases are not given an Events tab: the release controllers report state through status conditions rather than Kubernetes events, so it would always be empty. Events remain available on the individual resources under a release. + +- 284fcd7: Surface OpenChoreo controller auto-deploy failures in the Deploy tab. Pre-binding release-generation failures (bad trait, invalid config — from `Component.status.conditions`) now surface on the Setup card and as an error marker on the canvas Set-up tile, instead of leaving the user with no signal. Post-binding render/apply failures (from `ReleaseBinding.status.conditions`) show an actionable error banner with the controller's reason + message in the environment detail panel, instead of a context-free "Failed" badge. Long controller messages are clamped to a compact banner with a "View details" dialog (reason + full message + copy). +- 453b958: Show a "Suspended" status in the deployment pipeline when a component's workload is scaled to zero. The backend reads the suspended state that core already reports on the ReleaseBinding's ResourcesReady condition, and the pipeline badge now shows "Suspended" instead of "Active" for a scaled-to-zero workload. + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- c86de7f: Cache catalog reads and switch the response cache to always-revalidate. + + The catalog list and entity pages now read through a `CachingCatalogApi` wrapper + (exported from `@openchoreo/backstage-plugin-react`) that routes + `getEntities`/`queryEntities`/`getEntityByRef`/`getEntitiesByRefs` through the + shared `queryClient`, keyed per signed-in user. Previously the catalog used + Backstage's `CatalogApi` directly, so every visit re-fetched from scratch and + flashed a loading skeleton; now a revisited catalog list or entity page paints + instantly from the warm cache. Catalog writes (`refreshEntity`, location + add/remove/update, `removeEntityByUid`) invalidate the cache so user changes show + immediately. + + The `queryClient` default `staleTime` changes from 30s to 0 (always + stale-while-revalidate): a revisited surface paints cached data instantly and + always runs a background refresh, so nothing on screen is left silently stale. + The two hooks that set an explicit 30s `staleTime` now inherit this default. + + The entity-header breadcrumb dropdowns (namespace/project/component sibling + lists) now read their data through `useOpenChoreoQuery` instead of an imperative + `await catalogApi.getEntities(...)`, so reopening a level renders the cached list + instantly (no loading spinner) and only revalidates in the background, rather + than blocking on the network every open. + + The catalog list page seeds its initial rows from the cached `queryEntities` + response (via the newly exported `useUserScopedKey`), so returning to a + previously viewed list paints instantly from cache instead of flashing a + skeleton while `useEntityList` re-fetches. `useUserScopedKey` is now exported + from `@openchoreo/backstage-plugin-react`. + + Both cached-first surfaces now show a quiet inline spinner next to their label + (the "All Components (N)" count and the breadcrumb menu title) while their + background revalidation runs, so a refresh is visible instead of the data + swapping in silently. The spinner tracks the real network refetch on the shared + `queryClient` (via `useIsFetching`), not the surface's own `loading` flag — + which resolves the instant the cached read returns while the revalidation is + still in flight. + + Switching the catalog Kind filter now reflects the newly selected kind + immediately: a cached kind's rows and title appear at once from the cache, and + an uncached kind shows a clean full-page loader under the new kind's title + instead of leaving the previous kind's rows on screen until the fetch resolves. + +- 591df85: Route the platform "planes" fetches through the response cache so they paint + instantly on revisit instead of re-fetching from the catalog/BFF every time. + + The caching migration had skipped the `platform-engineer-core` plugin, so the + Platform Engineer home/dashboard re-queried every plane list on each visit. + Migrated the three dashboard widgets (`HomePagePlatformDetailsCard`, + `InfrastructureWidget`, `AgentHealthWidget`) and the two observability-plane + "linked planes" cards in the openchoreo plugin to `useOpenChoreoQuery` with + domain-prefixed keys. + +- 436c144: Bring the Cell Diagram library into the repo as the internal package + `@openchoreo/cell-diagram` (previously the external `@wso2/cell-diagram`). The + exported API is unchanged; the frontend and backend plugins now consume the + workspace package. +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- e809b2d: Limit the condition action selector to actions compatible with the current selection, so only actions sharing a condition attribute are offered. +- d5eff9e: Use the standard Backstage `EmptyState` for the Deploy tab's empty and error states (Component, Project, and Resource), matching the look of other empty states in the app (e.g. "Workflows Not Available" on the Build tab). Replaces the card + custom message + Retry button with a title + description empty state, and the "no environments" state now links to the project's deployment pipeline so it can be reviewed/configured. +- f1163a9: Fix the Deploy views defaulting to every environment in the namespace when a project's deployment pipeline defines no environments. A resolved pipeline with no promotion paths now yields no environments (the UI shows its empty state), and a pipeline that cannot be resolved (missing `deploymentPipelineRef` or a failed pipeline fetch) surfaces an error state instead of silently listing all environments. + + A permission denial on the deployment-pipeline read (`deploymentpipelines:view`) now surfaces as a Forbidden state instead of a misleading "pipeline missing/misconfigured" error. + + The Component, Project, and Resource Deploy tabs now share the same empty-state and error-state cards (icon, message, and Retry) with consistent, pipeline-focused copy, replacing the plain text lines previously shown on the Project and Resource tabs. + +- c7c41b7: Disable the primary action (Create Release / Save Overrides / Deploy) on + the deploy flow while an environment variable or file mount row is in + edit mode, so users can't submit a half-typed row with an empty key or + value. +- 0d2433f: Fix sidebar section separators rendering as dark near-black lines in production + builds. The softening rule targeted the divider by its `BackstageSidebarDivider-root` + class prefix, which JSS mangles away in the production bundle; it now targets the + sidebar-nav `hr` element directly, so the light-mode divider stays a subtle grey in + both dev and prod. +- b52e578: Fix cached catalog data not refreshing after a change. Creating a component or project + left the project contents table, the namespace projects card and the catalog list showing + the previous contents until you navigated away and back. Cached catalog reads are now + refreshed before they are handed to the page, and the namespace cards update in place when + newer data arrives. +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- 0b1d374: Display role actions consistently in collapsed form in Access Control. When a + role grants every action in a category, the Roles table and Role dialog now + show a single "All actions" entry (e.g. "All alerts actions", "All + metrics actions") instead of listing each operation individually, matching how + the action selection dialog already renders them. Roles are still stored as-is; + the collapsing is display-only and re-applies once the action catalog loads. +- 52396b0: Show container names in the resource-tree pod logs tab and add a per-container + filter. The pod logs API now returns logs aggregated across all of a pod's + containers, each entry tagged with its container. For multi-container pods + (for example an app container plus a Dapr sidecar) the logs viewer aligns + each line into timestamp / container / message columns and adds a container + dropdown ("All containers" plus one entry per container) to filter the view. + Single-container pods are unchanged. +- 4d7ebff: Add a Refresh action to the Project Contents card and back it with the response + cache. + + A Refresh icon button next to the "Project Contents" title re-pulls the table + rows (and their per-environment deployment status) together with the count badge + and type-filter options. `useProjectContentsPage` moves off a hand-rolled + `useEffect` fetch onto `useOpenChoreoQuery`, split into two dependent queries + (page rows + visible-row deployment bindings), so it gains `refetch`/ + `isRefetching` and smoother paging. The card also reserves a full page's height + so navigating to a shorter last page no longer makes the widget jump. + + `useOpenChoreoQuery` gains an optional `keepPreviousData` flag (forwarded as + `placeholderData: keepPreviousData`) so paginated queries can keep the previous + page on screen while the next one loads. It is additive and only applied when + set, so existing callers are unchanged. + +- 8416223: Add a per-ProjectType "Create Project" wizard, mirroring the Resource creation flow. + + Each `ProjectType` / `ClusterProjectType` now generates a scaffolder Template via `PtdToTemplateConverter`, surfaced under a new `?view=projects` browse view with a dedicated "Project" landing card. Selecting a type opens a wizard whose parameters step is driven by the type's `spec.parameters.openAPIV3Schema`, then creates the Project with `spec.type` and `spec.parameters` set via the extended `openchoreo:project:create` action (it falls back to the OpenChoreo API default when these are omitted, keeping the legacy path working). The catalog provider emits these templates during full sync and the event-delta path keeps them current. Replaces the static `create-openchoreo-project` template. + +- 71f7b6c: Add a "Deploy" tab to the Project entity page for the project-release lifecycle. + + The tab renders the project's deployment pipeline as a DAG of environments with live status and drives deploy/promote through `ProjectRelease` / `ProjectReleaseBinding`. A "Set up" card opens a **Configure & Deploy** wizard: step 1 edits `Project.spec.parameters` against the `(Cluster)ProjectType` parameters schema (saving cuts a new `ProjectRelease`), step 2 pins the first environment's binding and edits its `environmentConfigs` overrides. Each environment node supports **Promote** (copy the pinned release forward to the next environment) and **Configure overrides**; all mutating actions gate on the project-update permission. + + Backed by new BFF endpoints (`/project-environment-info`, `/project-release-bindings`, `/update-project-release-binding`, `/project-release-schema`) and matching `OpenChoreoClient` methods. + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 14601f4: Clarify the save/discard/delete controls in the Workload editor rows + (endpoints, dependencies, environment variables, and file mounts). While + editing a row, a labeled footer bar (Save / Cancel / Delete) makes committing + or discarding clearly visible; read-only rows keep their compact inline + Edit / Delete buttons on a single line. Adds a reusable `EditRowActions` + design-system component shared by all of those row editors. +- 591df85: Introduce a frontend response cache (TanStack Query) behind a swappable seam and + migrate the portal's data-fetching hooks onto it, so cached data paints + instantly on remount and a background refresh no longer blanks the view. + + New hooks in `@openchoreo/backstage-plugin-react`, all wrapping TanStack Query so + plugins never import it directly: + + - `useOpenChoreoQuery` — cached reads, returning the + `{ data, loading, isRefetching, error, refetch }` shape the loaders consume. + - `useOpenChoreoMutation` — writes that re-throw on error and invalidate cached + queries on success (replacing the hand-rolled "call verb then refetch"). + - `useOpenChoreoInfiniteQuery` — cursor-paginated "load more + live poll" lists + (runtime logs/events). + - `useOpenChoreoCache` — imperative cache access for optimistic writes and the + lazy, dynamically-keyed hooks. + + Migrated across the openchoreo, observability, CI and workflows plugins: simple + and parameterized reads, read+mutation hooks, `setInterval` pollers (now + `refetchInterval` with terminal stop conditions), lazy/conditional and + keyed-Map hooks, the log/event pagination trio, and the `react-use` `useAsync` + sites. `useAsyncOperation` is deprecated in favour of `useOpenChoreoMutation`. + The provider is mounted in the app root and the cache is cleared on sign-out. + + The seam only forwards `staleTime`/`refetchInterval`/`enabled` when a caller + actually sets them — passing an explicit `undefined` overrides the QueryClient + default instead of inheriting it, which resolved `staleTime` to 0 and refetched + on every remount, silently defeating the shared 30s cache. + + The cell-diagram and wirelogs environment hooks no longer fold `isRefetching` + into `loading`; a background refresh kept re-showing their full skeleton (the + "blank on refresh" the cache was meant to remove). They now report `loading` + for the first load only and expose `isRefetching` separately. + +- 84cfaeb: Auto-select a default card in the Environments deploy graph instead of + landing users on an empty detail panel: first env with an active or + pending deployment, else the first failed env, else the first undeployed + env, falling back to the Setup card when only never-deployed envs exist. + Only applies while nothing is selected, so it never overrides a manual + choice. +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- c6f1de1: Rework the Environments setup card auto-deploy experience: searchable + release dropdown with a primary "New release" CTA, an empty-state + panel for brand-new components, an optimistic auto-deploy toggle with + inline "Saving…" feedback and permission-aware error handling, and a + controller-truth "Last deployed release" row that polls for the new + release after a save. +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [591df85] +- Updated dependencies [c86de7f] +- Updated dependencies [18e51cf] +- Updated dependencies [436c144] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [8381554] +- Updated dependencies [39d264c] +- Updated dependencies [0d2433f] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [915e2e5] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-react@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/cell-diagram@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/openchoreo/package.json b/plugins/openchoreo/package.json index d69169247..1c6d3bf8b 100644 --- a/plugins/openchoreo/package.json +++ b/plugins/openchoreo/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/permission-backend-module-openchoreo-policy/CHANGELOG.md b/plugins/permission-backend-module-openchoreo-policy/CHANGELOG.md index adb606289..bf3b93a2b 100644 --- a/plugins/permission-backend-module-openchoreo-policy/CHANGELOG.md +++ b/plugins/permission-backend-module-openchoreo-policy/CHANGELOG.md @@ -1,5 +1,48 @@ # @openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy +## 1.2.0 + +### Minor Changes + +- 1207eda: Add `resource.resourceType` ABAC condition to resource creation, gating the resource template chooser and the creation wizard per resource type. + +### Patch Changes + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [383e7f6] +- Updated dependencies [52396b0] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [284fcd7] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/permission-backend-module-openchoreo-policy/package.json b/plugins/permission-backend-module-openchoreo-policy/package.json index df1abe3e6..dd520872e 100644 --- a/plugins/permission-backend-module-openchoreo-policy/package.json +++ b/plugins/permission-backend-module-openchoreo-policy/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-permission-backend-module-openchoreo-policy", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "OpenChoreo permission policy module for the Backstage permission backend.", "main": "src/index.ts", diff --git a/plugins/platform-engineer-core-backend/CHANGELOG.md b/plugins/platform-engineer-core-backend/CHANGELOG.md index 460fb9bb9..53bb4a889 100644 --- a/plugins/platform-engineer-core-backend/CHANGELOG.md +++ b/plugins/platform-engineer-core-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @openchoreo/backstage-plugin-platform-engineer-core-backend +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [529f13c] +- Updated dependencies [52396b0] +- Updated dependencies [2f45e83] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/platform-engineer-core-backend/package.json b/plugins/platform-engineer-core-backend/package.json index 8fb33e6af..b27f275d2 100644 --- a/plugins/platform-engineer-core-backend/package.json +++ b/plugins/platform-engineer-core-backend/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-platform-engineer-core-backend", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/platform-engineer-core/CHANGELOG.md b/plugins/platform-engineer-core/CHANGELOG.md index ded1903db..f651a2d2f 100644 --- a/plugins/platform-engineer-core/CHANGELOG.md +++ b/plugins/platform-engineer-core/CHANGELOG.md @@ -1,5 +1,143 @@ # @openchoreo/backstage-plugin-platform-engineer-core +## 1.2.0 + +### Patch Changes + +- 591df85: Show a subtle background-refresh indicator on cached views instead of swapping + data in silently. + + Adds a shared `RefreshOverlay` primitive to the design system — a small + top-right spinner (or thin top bar) that overlays a positioned container while a + background revalidation runs, without shifting or blanking the cached content. + `useOpenChoreoQuery`/`useOpenChoreoInfiniteQuery` already expose `isRefetching`; + the data hooks across the portal now thread it through, and the home dashboard, + plane cards, access-control, secrets, project, environment, workflow and + observability surfaces render the overlay from it. `SummaryWidgetWrapper` gained + a `refreshing` prop so the home summary widgets get it for free. + +- 591df85: Route the platform "planes" fetches through the response cache so they paint + instantly on revisit instead of re-fetching from the catalog/BFF every time. + + The caching migration had skipped the `platform-engineer-core` plugin, so the + Platform Engineer home/dashboard re-queried every plane list on each visit. + Migrated the three dashboard widgets (`HomePagePlatformDetailsCard`, + `InfrastructureWidget`, `AgentHealthWidget`) and the two observability-plane + "linked planes" cards in the openchoreo plugin to `useOpenChoreoQuery` with + domain-prefixed keys. + +- 62608f5: chore: remove dead code left over from the OpenAPI-client and New Frontend + System migrations — commented-out blocks, orphaned files/components, and unused + deprecated exports (`LogEntry`/`RuntimeLogsResponse` aliases, `FILTER_PRESETS`, + `useOrgName`, `useRCAReportByAlert`, `UserTypeConfig`), plus consolidation of + duplicated backend response-type wrappers. No behavioural changes. +- e3986a9: Add an `/alpha` entry point that exposes each plugin as a `createFrontendPlugin` for use with Backstage's New Frontend System (NFS). The default entry continues to export the legacy `createPlugin` instance so existing host apps keep working unchanged; adopters on NFS can now import `from '@openchoreo/backstage-plugin-/alpha'` and include the plugin directly in `createApp({ features: [...] })`. + + The `/alpha` exports register each plugin's API factories (e.g. `openChoreoCiClientApiRef`, `genericWorkflowsClientApiRef`, the three observability backend clients, `openChoreoClientApiRef`) and one top-level page where applicable (`platform-engineer-core`'s dashboard view, `openchoreo-workflows`' generic workflows page, `openchoreo-ci`'s workflows entity tab). + + Entity tabs and overview cards that previously lived in the host's `EntityPage.tsx` now ride through each plugin's `/alpha` export as `EntityContentBlueprint` and `EntityCardBlueprint` extensions, with the right kind filters. Adopters on `/alpha` get the full entity-page contributions automatically: the OpenChoreo CI plugin contributes the Build tab (scoped to `kind:component`); the observability plugin contributes the 10 component- and system-page tabs (Logs, Events, Metrics, Alerts, Wirelogs, Traces, Incidents, RCA Reports, Cost Analysis) plus a registry API for host-injected log-row action renderers; the OpenChoreo plugin contributes the Deploy tab, the system Cell Diagram tab, the shared Resource Definition tab, and 30+ overview cards spanning every OpenChoreo platform kind (Environment, DataPlane, WorkflowPlane, ObservabilityPlane, DeploymentPipeline, the ComponentType / ResourceType / TraitType families, and the Workflow family); the generic-workflows plugin contributes the Runs tab on `Workflow` and `ClusterWorkflow` entities of type `Generic`. The react plugin exposes a new `FeatureGatedContent` component so plugin authors can gate routable extensions on the OpenChoreo feature flags without rolling their own empty-state wrapper. + + Custom catalog-graph relations, entity-presentation kind icons, and the scaffolder form-decorator override are now actually applied at runtime — the original migration registered them but they were silently overwritten by upstream defaults at startup. The form-decorator override also stops dropping decorators contributed by other plugins. + + Adopters still on the default (legacy) export are unaffected. This addresses the body of [openchoreo/openchoreo#3568](https://github.com/openchoreo/openchoreo/issues/3568) — adopters can drop `--legacy` from the `@backstage/create-app` step when installing the plugin suite into an existing Backstage host. + +- 915e2e5: Self-contain the response cache for NFS-mounted OpenChoreo surfaces. Each + OpenChoreo plugin now wraps its own extensions in a TanStack Query + `QueryClientProvider` via `PluginWrapperBlueprint`, around a shared `queryClient` + singleton exported from `@openchoreo/backstage-plugin-react`. A host that mounts + the plugins' `/alpha` features (auto-mounted entity tabs/cards and the standalone + plugin pages) gets response caching with no provider wiring — previously those + surfaces would crash with "No QueryClient set" when a cached tab rendered. + + Scope: this covers surfaces rendered through a plugin's own extension boundary + (NFS auto-mounted tabs/cards and standalone plugin pages). A host that instead + composes OpenChoreo tab components itself via legacy `EntityLayout.Route` JSX + renders them outside the plugin wrapper, so that host still mounts its own + provider — `OpenChoreoQueryProvider` (also exported here) bundles the + `QueryClientProvider` and the user-scoping context for that case. + + Cross-user isolation is structural: every cache key is namespaced by the + signed-in user's entityRef inside the cache seam (`useOpenChoreoQuery`, + `useOpenChoreoInfiniteQuery`, `useOpenChoreoMutation`, `useOpenChoreoCache`), so + a different user occupies a disjoint key space and can never read the previous + user's permission-scoped responses from the cache — no cache-clearing needed. + Multiple OpenChoreo plugins share the same `queryClient`, so there is one cache. + +- c572a46: Unify portal loading states behind a shared, token-driven system so every + loader looks and behaves consistently. + + **New shared components** + + - **design-system**: `Skeleton` (token-driven shimmer — `text`/`rect`/`circle` + with a `count` for stacked lines, backed by new `motion` timing tokens), + `Spinner` (theme-coloured circular loader with named sizes + `chip`/`button`/`inline`/`page`), and `PageLoader` (centered `Spinner` for + page/route/section loads). + - **backstage-plugin-react**: `ContentLoader` (loading/error/empty/content + wrapper that keeps content on screen and overlays a spinner during a + background refetch instead of blanking) and `SkeletonRows` (table-body + skeleton helper). + + **Consistency changes** + + - Tables now show skeleton rows instead of a circular overlay (catalog, + Project Contents, namespace cards, observability RCA/Cost Analysis, and the + raw-MUI alert/incident/log tables). + - Overview cards and widgets render skeleton placeholders via the shared + `Skeleton` (including the home-page platform-planes section). + - Page-level loaders use the centered `PageLoader` instead of the Backstage + progress bar — including Backstage's internal route/Suspense fallback and the + app-boot loader. + - Status chips use the themed `Spinner` (removing a hardcoded spinner colour). + - The shared `ErrorState` icon is sized down to read proportionately in + section-level errors. + + Prefer `Skeleton`/`Spinner`/`PageLoader` and `ContentLoader` over raw MUI + `Skeleton`/`CircularProgress`/`Progress` for new loading states. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [591df85] +- Updated dependencies [c86de7f] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [8381554] +- Updated dependencies [39d264c] +- Updated dependencies [0d2433f] +- Updated dependencies [8381554] +- Updated dependencies [b52e578] +- Updated dependencies [e3986a9] +- Updated dependencies [383e7f6] +- Updated dependencies [d5eff9e] +- Updated dependencies [4d7ebff] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [14601f4] +- Updated dependencies [1207eda] +- Updated dependencies [7c76d05] +- Updated dependencies [591df85] +- Updated dependencies [915e2e5] +- Updated dependencies [284fcd7] +- Updated dependencies [453b958] +- Updated dependencies [c572a46] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-design-system@1.2.0 + - @openchoreo/backstage-plugin-react@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/platform-engineer-core/package.json b/plugins/platform-engineer-core/package.json index ace33b562..1ac7338f9 100644 --- a/plugins/platform-engineer-core/package.json +++ b/plugins/platform-engineer-core/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-platform-engineer-core", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "main": "src/index.ts", "types": "src/index.ts", diff --git a/plugins/scaffolder-backend-module-openchoreo/CHANGELOG.md b/plugins/scaffolder-backend-module-openchoreo/CHANGELOG.md index 7d591ad1e..b637a8943 100644 --- a/plugins/scaffolder-backend-module-openchoreo/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-openchoreo/CHANGELOG.md @@ -1,5 +1,56 @@ # @openchoreo/backstage-plugin-scaffolder-backend-module +## 1.2.0 + +### Minor Changes + +- 383e7f6: Add Backstage management for OpenChoreo notification channels (email and webhook), the platform resource that alert rules send notifications to. Notification channels are now browsable and creatable from the catalog and /create pages alongside Environments and other platform resources, with dedicated create/read/update/delete permissions, a catalog relation to their target Environment, and a raw-definition editor. +- 14f1052: Add a default-on Auto Deploy toggle to the project creation wizard. When on, `openchoreo:project:create` creates one unpinned ProjectReleaseBinding per deployment-pipeline environment after the project is created, and the control plane seeds the release pin once the first release is cut. Toggling it off shows a warning that the project must be deployed manually from its Deploy tab before components can be deployed. The Deploy tab now shows just-created unpinned bindings (`ProjectReleaseNotSet`) as pending instead of failed. + +### Patch Changes + +- 8416223: Add a per-ProjectType "Create Project" wizard, mirroring the Resource creation flow. + + Each `ProjectType` / `ClusterProjectType` now generates a scaffolder Template via `PtdToTemplateConverter`, surfaced under a new `?view=projects` browse view with a dedicated "Project" landing card. Selecting a type opens a wizard whose parameters step is driven by the type's `spec.parameters.openAPIV3Schema`, then creates the Project with `spec.type` and `spec.parameters` set via the extended `openchoreo:project:create` action (it falls back to the OpenChoreo API default when these are omitted, keeping the legacy path working). The catalog provider emits these templates during full sync and the event-delta path keeps them current. Replaces the static `create-openchoreo-project` template. + +- 2f45e83: Add Backstage catalog and UI support for the new OpenChoreo `ProjectType` (namespaced) and `ClusterProjectType` (cluster-scoped) platform-engineer abstractions introduced by the project-release-lifecycle epic. + + The catalog provider now ingests both kinds (full sync and near-real-time event deltas), translates them into dedicated entity kinds, and links each `Project` to the `ProjectType` / `ClusterProjectType` it references via `spec.type` (an `instanceOf` / `hasInstance` relation). Both kinds get first-class Overview pages — rendering their `parameters` / `environmentConfigs` schemas, `validations`, and `resources` templates — plus a Definition tab showing the raw CR, and they appear throughout the catalog UI (kind registry, icons, graph labels, About card). + + Permission wiring enables create / edit / delete on both kinds for authorized users, and a scaffolder creation wizard is added for each (grouped under "Platform Resources"). The generated OpenChoreo API client is re-synced from core `main` to pick up the `ProjectType` / `ClusterProjectType` schemas, their REST endpoints, and the new `Project.spec.type` field. + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + +- Updated dependencies [ffa762f] +- Updated dependencies [18e51cf] +- Updated dependencies [62608f5] +- Updated dependencies [529f13c] +- Updated dependencies [cf2203a] +- Updated dependencies [39d264c] +- Updated dependencies [383e7f6] +- Updated dependencies [52396b0] +- Updated dependencies [14f1052] +- Updated dependencies [8416223] +- Updated dependencies [71f7b6c] +- Updated dependencies [2f45e83] +- Updated dependencies [284fcd7] +- Updated dependencies [56b4e95] +- Updated dependencies [8d8bd80] +- Updated dependencies [d19ffcf] + - @openchoreo/backstage-plugin-catalog-backend-module@1.2.0 + - @openchoreo/backstage-plugin-common@1.2.0 + - @openchoreo/openchoreo-client-node@1.2.0 + - @openchoreo/openchoreo-auth@1.2.0 + ## 1.2.0-next.2 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-openchoreo/package.json b/plugins/scaffolder-backend-module-openchoreo/package.json index ee1b3a922..eb434d30e 100644 --- a/plugins/scaffolder-backend-module-openchoreo/package.json +++ b/plugins/scaffolder-backend-module-openchoreo/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-scaffolder-backend-module", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "The openchoreo module for @backstage/plugin-scaffolder-backend", "main": "src/index.ts", diff --git a/plugins/thunder-idp-client-node/CHANGELOG.md b/plugins/thunder-idp-client-node/CHANGELOG.md index f1c7b07d0..f70136717 100644 --- a/plugins/thunder-idp-client-node/CHANGELOG.md +++ b/plugins/thunder-idp-client-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @openchoreo/backstage-plugin-thunder-idp-client-node +## 1.2.0 + +### Patch Changes + +- 8d8bd80: Upgrade the OpenChoreo Backstage plugin suite to Backstage v1.51.0. + + This bump aligns every `@backstage/*` peer dependency with the v1.51.0 line and adapts the plugins to the API shapes introduced across v1.44–v1.51. Adopters running the OpenChoreo plugins on a host Backstage app must be on Backstage v1.51.0 (or newer) after this release; older host versions will hit peer-dep mismatches. + + Notable adapter-side changes: + + - Scaffolder backend actions now use the v4.0 `schema.input: { field: z => z.type(...) }` field-per-arrow shape introduced after v1.43.3. + - Permission rules inline their `paramsSchema` at the `createPermissionRule` call site and import Zod via `zod/v3` to match what `@backstage/plugin-permission-node@0.11.0` was compiled against. + - The catalog backend module reads `catalogProcessingExtensionPoint` from the stable export (no `/alpha`) and registers permission rules through `coreServices.permissionsRegistry`. + - React 18 + Node 22 are required at runtime, in line with Backstage v1.50+. + ## 1.2.0-next.0 ### Patch Changes diff --git a/plugins/thunder-idp-client-node/package.json b/plugins/thunder-idp-client-node/package.json index 7223a3b51..c318f4578 100644 --- a/plugins/thunder-idp-client-node/package.json +++ b/plugins/thunder-idp-client-node/package.json @@ -1,6 +1,6 @@ { "name": "@openchoreo/backstage-plugin-thunder-idp-client-node", - "version": "1.2.0-rc.2", + "version": "1.2.0", "license": "Apache-2.0", "description": "Node.js library for the thunder-idp-client plugin", "main": "src/index.ts",