Skip to content

Conversation

@lokanandaprabhu
Copy link
Collaborator

Description

  • Remove dynamic-plugins-info frontend and backend plugins
  • Update marketplace catalog entities and packages
  • Update dynamic plugin wrappers and configurations
  • Remove dynamic-plugins-info test files
  • Update e2e tests to use marketplace extensions instead

Which issue(s) does this PR fix

- Remove dynamic-plugins-info frontend and backend plugins
- Update marketplace catalog entities and packages
- Update dynamic plugin wrappers and configurations
- Remove dynamic-plugins-info test files
- Update e2e tests to use marketplace extensions instead

Fixes RHIDP-8301
@qodo-merge-pro
Copy link

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis 🔶

RHIDP-8301 - Partially compliant

Compliant requirements:

  • Remove the dynamic-plugins-info frontend and backend plugins and integrate functionality into the extensions/marketplace plugin.
  • Clean up/remove internal.plugins/tab workarounds and the InstallationContextProvider from the extensions code base; simplify installed alert logic.

Non-compliant requirements:

  • Add an icon with count to the "Installed plugins" tab and also add an icon to the "Catalog" tab using TabbedLayout tabProps.
  • Show only human-readable plugin name in the installed list, deduplicating backend/frontend into a single row.
  • Display only Name, Version, and Actions columns in the installed list.
  • Enable search, sort, and pagination for the installed plugins table; show empty-state message for no results.

Requires further human verification:

  • Verify UI changes: presence of "Installed plugins" tab in extensions with icon and count; and icon on the catalog tab.
  • Validate installed list behavior: human-readable names, deduplication, columns (Name, Version, Actions), search/sort/pagination, and empty-state message as per Figma.
  • E2E checks that the new endpoint /api/extensions/loaded-plugins is served and used across the app.
⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🔒 No security concerns identified
⚡ Recommended focus areas for review

Possible Issue

The test now requests /api/extensions/loaded-plugins without a baseURL. Ensure Playwright request context baseURL or server routing provides this path; otherwise tests may fail or hit wrong host.

const loadedPluginsEndpoint = "/api/extensions/loaded-plugins";
const response = await context.get(loadedPluginsEndpoint, {
  headers: authHeader,
});
Admin Menu Filtering

Filtering now checks name includes 'admin' rather than strict equality. This could unintentionally include items whose names contain 'admin' as a substring; confirm naming conventions or tighten the predicate.

  : menuItems.filter(mi => !mi.name.startsWith('default.'));

menuItemArray = isBottomMenuSection
  ? menuItemArray.filter(mi => mi.name.includes('admin'))
  : menuItemArray.filter(mi => !mi.name.includes('admin'));
Menu Parent Renaming

Parent changed to default.admin and added icon mapping 'admin'. Verify all related menuItems and consumers expect 'default.admin' and that the 'admin' icon key exists in CommonIcons.

  menuItems:
    default.create:
      title: ''
    default.admin:
      title: Administration
      textKey: menuItem.administration
      icon: admin
red-hat-developer-hub.backstage-plugin-global-header:
📄 References
  1. No matching references available

@qodo-merge-pro
Copy link

PR Type

Enhancement, Bug fix


Description

  • Remove dynamic-plugins-info frontend and backend plugins from codebase

  • Update marketplace catalog entities with improved package titles and configurations

  • Refactor application components to use consistent React import patterns

  • Update dynamic plugin configurations and menu item structure for administration section


File Walkthrough

Relevant files
Configuration changes
5 files
initializeRemotePlugins.ts
Remove dynamic-plugins-info from ignored static plugins list
+1/-4     
dynamic-plugins.default.yaml
Update marketplace and admin menu configurations                 
+17/-12 
Dockerfile
Replace dynamic-plugins-info with theme-wrapper in Docker build
+1/-2     
Dockerfile
Replace dynamic-plugins-info with theme-wrapper in Docker build
+1/-2     
.sonarcloud.properties
Remove dynamic-plugins-info from SonarCloud exclusions     
+1/-1     
Tests
1 files
analytics.ts
Update loaded plugins endpoint to use extensions API         
+1/-1     
Documentation
3 files
deploy-keycloak.sh
Update Keycloak documentation links to version 26.2           
+2/-2     
keycloak-quickstart.md
Update Keycloak operator documentation link to version 26.2
+1/-1     
CONTRIBUTING.md
Update Dockerfile example to use licensed-users-info-backend
+1/-1     
Enhancement
13 files
ApplicationProvider.tsx
Refactor React imports and rename Component prop variable
+23/-17 
ApplicationListener.tsx
Refactor React imports and rename Component prop variable
+11/-11 
scaffolder-integrations.yaml
Add new scaffolder integrations plugin catalog entity       
+36/-0   
red-hat-developer-hub-backstage-plugin-catalog-backend-module-m.yaml
Update package title and version for catalog backend module
+3/-3     
red-hat-developer-hub-backstage-plugin-marketplace-backend.yaml
Update marketplace backend package version and title         
+3/-3     
red-hat-developer-hub-backstage-plugin-marketplace.yaml
Update marketplace frontend package version and title       
+3/-3     
ApplicationHeaders.tsx
Refactor React imports to use explicit named imports         
+11/-5   
package.json
Add exports and typesVersions configuration for alpha module
+15/-0   
ContextMenuAwareEntityLayout.tsx
Refactor React imports to use explicit named imports         
+8/-2     
red-hat-developer-hub-backstage-plugin-global-header.yaml
Update global header package title configuration                 
+2/-2     
CommonIcons.tsx
Add AdminIcon to common icons mapping                                       
+2/-0     
backstage-community-plugin-catalog-backend-module-scaffolder-re.yaml
Update package title to shortened version                               
+1/-2     
package.json
Add new theme-wrapper package configuration                           
+5/-0     
Bug fix
3 files
Root.tsx
Remove AdminIcon import and update admin menu filtering   
+4/-8     
all.yaml
Fix Azure repositories package filename reference               
+1/-1     
parfuemerie-douglas-scaffolder-backend-module-azure-repositories.yaml
Fix package name and update title                                               
+2/-2     
Dependencies
5 files
package.json
Bump marketplace backend plugin version to 0.11.0               
+3/-3     
package.json
Bump catalog backend module marketplace version to 0.7.1 
+2/-2     
package.json
Add core-plugin-api dependency and sideEffects configuration
+4/-2     
package.json
Bump marketplace frontend plugin version to 0.11.2             
+2/-2     
package.json
Add resolutions for permission-backend and catalog-react packages
+3/-1     
Additional files
101 files
.dockerignore +0/-2     
apic-backstage-plugin.yaml +1/-1     
backstage-community-plugin-3scale-backend.yaml +1/-1     
backstage-community-plugin-acr.yaml +1/-1     
backstage-community-plugin-analytics-provider-segment.yaml +1/-1     
backstage-community-plugin-azure-devops-backend.yaml +1/-1     
backstage-community-plugin-azure-devops.yaml +1/-1     
backstage-community-plugin-catalog-backend-module-keycloak.yaml +1/-1     
backstage-community-plugin-catalog-backend-module-pingidentity.yaml +1/-1     
backstage-community-plugin-dynatrace.yaml +1/-1     
backstage-community-plugin-github-actions.yaml +1/-1     
backstage-community-plugin-github-issues.yaml +1/-1     
backstage-community-plugin-jenkins-backend.yaml +1/-1     
backstage-community-plugin-jenkins.yaml +1/-1     
backstage-community-plugin-jfrog-artifactory.yaml +1/-1     
backstage-community-plugin-lighthouse.yaml +1/-1     
backstage-community-plugin-nexus-repository-manager.yaml +1/-1     
backstage-community-plugin-ocm-backend.yaml +1/-1     
backstage-community-plugin-ocm.yaml +1/-1     
backstage-community-plugin-quay.yaml +1/-1     
backstage-community-plugin-rbac.yaml +1/-1     
backstage-community-plugin-redhat-argocd.yaml +1/-1     
backstage-community-plugin-scaffolder-backend-module-kubernetes.yaml +1/-1     
backstage-community-plugin-scaffolder-backend-module-quay.yaml +1/-1     
backstage-community-plugin-scaffolder-backend-module-regex.yaml +1/-1     
backstage-community-plugin-scaffolder-backend-module-servicenow.yaml +1/-1     
backstage-community-plugin-scaffolder-backend-module-sonarqube.yaml +1/-1     
backstage-community-plugin-servicenow-backend.yaml +1/-1     
backstage-community-plugin-servicenow.yaml +1/-1     
backstage-community-plugin-sonarqube-backend.yaml +1/-1     
backstage-community-plugin-sonarqube.yaml +1/-1     
backstage-community-plugin-tech-radar-backend.yaml +1/-1     
backstage-community-plugin-tech-radar.yaml +1/-1     
backstage-community-plugin-tekton.yaml +1/-1     
backstage-community-plugin-topology.yaml +1/-1     
backstage-plugin-catalog-backend-module-bitbucket-cloud.yaml +1/-1     
backstage-plugin-catalog-backend-module-bitbucket-server.yaml +1/-1     
backstage-plugin-catalog-backend-module-github-org.yaml +1/-1     
backstage-plugin-catalog-backend-module-github.yaml +1/-1     
backstage-plugin-catalog-backend-module-gitlab-org.yaml +1/-1     
backstage-plugin-catalog-backend-module-gitlab.yaml +1/-1     
backstage-plugin-catalog-backend-module-ldap.yaml +1/-1     
backstage-plugin-catalog-backend-module-msgraph.yaml +1/-1     
backstage-plugin-kubernetes-backend.yaml +1/-1     
backstage-plugin-kubernetes.yaml +1/-1     
backstage-plugin-notifications-backend-module-email.yaml +1/-1     
backstage-plugin-notifications-backend.yaml +1/-1     
backstage-plugin-notifications.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-azure.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-bitbucket-cloud.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-bitbucket-server.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-gerrit.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-github.yaml +1/-1     
backstage-plugin-scaffolder-backend-module-gitlab.yaml +1/-1     
backstage-plugin-signals-backend.yaml +1/-1     
backstage-plugin-signals.yaml +1/-1     
backstage-plugin-techdocs-backend.yaml +1/-1     
backstage-plugin-techdocs-module-addons-contrib.yaml +1/-1     
backstage-plugin-techdocs.yaml +1/-1     
dynatrace-backstage-plugin-dql-backend.yaml +1/-1     
dynatrace-backstage-plugin-dql.yaml +1/-1     
immobiliarelabs-backstage-plugin-gitlab-backend.yaml +1/-1     
immobiliarelabs-backstage-plugin-gitlab.yaml +1/-1     
pagerduty-backstage-plugin-backend.yaml +1/-1     
pagerduty-backstage-plugin.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-bulk-import-backend.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-bulk-import.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-dynamic-home-page.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-global-floating-action-b.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-lightspeed-backend.yaml +1/-1     
red-hat-developer-hub-backstage-plugin-lightspeed.yaml +1/-1     
redhat-backstage-plugin-orchestrator-backend.yaml +1/-1     
redhat-backstage-plugin-orchestrator-form-widgets.yaml +1/-1     
redhat-backstage-plugin-orchestrator.yaml +1/-1     
redhat-backstage-plugin-scaffolder-backend-module-orchestrator.yaml +1/-1     
rhdh-backstage-plugin-adoption-insights-backend.yaml +1/-1     
rhdh-backstage-plugin-adoption-insights.yaml +1/-1     
rhdh-backstage-plugin-analytics-module-adoption-insights.yaml +1/-1     
rhdh-backstage-plugin-quickstart.yaml +1/-1     
roadiehq-backstage-plugin-argo-cd-backend.yaml +1/-1     
roadiehq-backstage-plugin-datadog.yaml +1/-1     
roadiehq-backstage-plugin-github-insights.yaml +1/-1     
roadiehq-backstage-plugin-github-pull-requests.yaml +1/-1     
roadiehq-backstage-plugin-jira.yaml +1/-1     
roadiehq-backstage-plugin-security-insights.yaml +1/-1     
roadiehq-scaffolder-backend-argocd.yaml +1/-1     
roadiehq-scaffolder-backend-module-http-request.yaml +1/-1     
roadiehq-scaffolder-backend-module-utils.yaml +1/-1     
azure-repositories.yaml +1/-1     
dynamic-plugins-info.spec.ts +0/-92   
package.json +0/-1     
App.tsx +0/-51   
package.json +0/-1     
index.ts +0/-1     
.eslintrc.js +0/-1     
.lintstagedrc.json +0/-4     
.prettierignore +0/-2     
.prettierrc.js +0/-20   
README.md +0/-12   
data.ts +0/-154 
Additional files not shown

@qodo-merge-pro
Copy link

qodo-merge-pro bot commented Oct 13, 2025

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
Consider automating the generation of human-readable titles

Instead of manually updating titles in over 80 YAML files, create a script to
automate the generation of human-readable titles from package names. This will
improve consistency and maintainability.

Examples:

catalog-entities/marketplace/packages/backstage-community-plugin-scaffolder-backend-module-sonarqube.yaml [3-6]
metadata:
  name: backstage-community-plugin-scaffolder-backend-module-sonarqube
  namespace: rhdh
  title: "Scaffolder Backend Module SonarQube"
catalog-entities/marketplace/packages/red-hat-developer-hub-backstage-plugin-marketplace-backend.yaml [3-6]

Solution Walkthrough:

Before:

# In catalog-entities/marketplace/packages/some-package.yaml
apiVersion: extensions.backstage.io/v1alpha1
kind: Package
metadata:
  name: backstage-community-plugin-scaffolder-backend-module-sonarqube
  # Title is the full package name, which is not very readable.
  title: "@backstage-community/plugin-scaffolder-backend-module-sonarqube"
spec:
  packageName: "@backstage-community/plugin-scaffolder-backend-module-sonarqube"
  ...

# This manual update pattern is repeated across more than 80 files in the PR.

After:

# A script to automate title generation, e.g., scripts/generate-titles.py
import yaml
from pathlib import Path

def generate_human_readable_title(package_name):
    # ... logic to convert package name to title ...
    # e.g., "@backstage/plugin-foo-bar" -> "Foo Bar"
    pass

for yaml_file in Path('catalog-entities/marketplace/packages').glob('*.yaml'):
    with open(yaml_file, 'r+') as f:
        data = yaml.safe_load(f)
        package_name = data['spec']['packageName']
        data['metadata']['title'] = generate_human_readable_title(package_name)
        f.seek(0)
        yaml.dump(data, f)
        f.truncate()
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a significant maintainability issue with manually updating titles in over 80 YAML files and proposes a valuable automation script to prevent errors and reduce future effort.

Medium
Possible issue
Use a more specific filter

Refine the administration menu item filter to use an exact match with
'default.admin' instead of the broader mi.name.includes('admin').

packages/app/src/components/Root/Root.tsx [433-434]

 menuItemArray = isBottomMenuSection
-  ? menuItemArray.filter(mi => mi.name.includes('admin'))
-  : menuItemArray.filter(mi => !mi.name.includes('admin'));
+  ? menuItemArray.filter(mi => mi.name === 'default.admin')
+  : menuItemArray.filter(mi => mi.name !== 'default.admin');

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that using .includes('admin') is brittle and proposes a more robust solution by filtering for the exact name 'default.admin', which prevents potential miscategorization of menu items.

Medium
General
Render sidebar group dynamically

Dynamically render the "Administration" SidebarGroup by using the title and icon
from the default.admin menu item, instead of using a hardcoded label.

packages/app/src/components/Root/Root.tsx [526-528]

-<SidebarGroup label="Administration">
-  {renderMenuItems(true, true)}
-</SidebarGroup>
+{showAdministration && (
+  <>
+    <SidebarDivider />
+    <SidebarGroup
+      label={menuItems.find(mi => mi.name === 'default.admin')?.title ?? 'Administration'}
+      icon={menuItems.find(mi => mi.name === 'default.admin')?.icon}
+    >
+      {renderMenuItems(true, true)}
+    </SidebarGroup>
+  </>
+)}

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 6

__

Why: This suggestion improves code quality by making the SidebarGroup rendering data-driven from the default.admin menu item configuration, which also restores the icon that was removed in the PR.

Low
  • Update

@github-actions
Copy link
Contributor

@github-actions
Copy link
Contributor

@github-actions
Copy link
Contributor

@HusneShabbir
Copy link
Contributor

/lgtm
Thanks for looking into this @lokanandaprabhu

@openshift-ci
Copy link

openshift-ci bot commented Oct 13, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: HusneShabbir
Once this PR has been reviewed and has the lgtm label, please assign invinciblejai for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@christoph-jerolimov
Copy link
Member

#3366 was merged so I guess its fine to close this

@openshift-merge-robot
Copy link
Collaborator

PR needs rebase.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants