feat(greenhouse): add Exposed Services#1585
Conversation
🦋 Changeset detectedLatest commit: 6ec4840 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Pull request overview
Adds a new Greenhouse Admin page to list services exposed by plugins across clusters, and refactors plugin instance details to show exposed services as compact links rather than a separate grid.
Changes:
- Added
/admin/exposed-servicesroute, navigation entry, data grid, filters, and API fetch helpers for exposed services. - Moved exposed-services rendering out of the Plugin Instance “Overview” section and into the “Details” table as link(s).
- Updated the PluginPresets page to use
DataGridToolbarfor its header/refresh area.
Reviewed changes
Copilot reviewed 20 out of 21 changed files in this pull request and generated 19 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/greenhouse/src/routes/admin/exposed-services.tsx | Adds new admin route and loader output for Exposed Services page. |
| apps/greenhouse/src/routeTree.gen.ts | Registers the new route in the generated TanStack Router tree. |
| apps/greenhouse/src/components/admin/constants.ts | Adds cluster + exposed-services selector constants and a new filter id. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts | Fetches plugin resources with exposed services and applies filtering/sorting. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts | Fetches filter value lists for the Exposed Services page. |
| apps/greenhouse/src/components/admin/ExposedServices/* | Implements page layout, filters UI, and the exposed-services data grid. |
| apps/greenhouse/src/components/admin/mocks/exposedServices.ts | Adds mock response data for exposed services tests. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/*.test.tsx | Adds initial unit test coverage for the new data grid. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx | Removes the dedicated Exposed Services section from the instance overview. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx | Adds exposed services link list into the instance “Details” table. |
| apps/greenhouse/src/components/admin/Layout/Navigation.tsx | Adds “Exposed Services” entry to the admin nav. |
| apps/greenhouse/src/components/admin/PluginPresets/index.tsx | Switches header area to DataGridToolbar. |
| apps/greenhouse/src/components/admin/types/schema.d.ts | Introduces a new ExposedServices schema type. |
| apps/greenhouse/src/components/admin/types/k8sTypes.ts | Exports ExposedServices type alias from the schema. |
| .changeset/wide-cups-beam.md | Adds changeset entry for the new feature/refactor. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Yes, it should. |
There was a problem hiding this comment.
Pull request overview
Adds an Admin “Exposed Services” view in the Greenhouse app to list services exposed by plugins across clusters, and adjusts existing pages to reflect the new central location for this information.
Changes:
- Introduces
/admin/exposed-servicesroute + navigation entry and new Exposed Services page (filters + datagrid). - Adds API fetch utilities to query plugins with exposed services (labelSelector-based) and derives filter options.
- Removes the Exposed Services datagrid from plugin instance overview and surfaces exposed service links inline under “Details”; updates PluginPresets toolbar usage.
Reviewed changes
Copilot reviewed 20 out of 21 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/greenhouse/src/routes/admin/exposed-services.tsx | New admin route with search validation and default-filter redirect behavior. |
| apps/greenhouse/src/routeTree.gen.ts | Generated route tree updated to include the new exposed-services route. |
| apps/greenhouse/src/components/admin/types/schema.d.ts | Adds schema typing for plugins filtered to those with exposed services. |
| apps/greenhouse/src/components/admin/types/k8sTypes.ts | Exposes PluginsWithExposedServices type alias from the schema. |
| apps/greenhouse/src/components/admin/constants.ts | Adds constants for exposed-services label selector, filter IDs, and default “no value” marker. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts | New API helper to fetch plugins-with-exposed-services and derive filter dropdown values. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts | New API helper to fetch, flatten, filter, and sort exposed services for the grid. |
| apps/greenhouse/src/components/admin/mocks/exposedServices.ts | Mock response data for exposed services used by new UI tests. |
| apps/greenhouse/src/components/admin/PluginPresets/index.tsx | Switches the PluginPresets page header area to use DataGridToolbar. |
| apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx | Uses SUPPORT_GROUP_LABEL constant for the owning team label lookup. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx | Removes the dedicated Exposed Services section from plugin instance overview. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx | Removes the old per-plugin exposed services datagrid component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx | Removes tests for the deleted ExposedServices component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx | Adds inline exposed service links under “Details” for plugin instances. |
| apps/greenhouse/src/components/admin/Layout/Navigation.tsx | Adds “Exposed Services” to the admin navigation. |
| apps/greenhouse/src/components/admin/ExposedServices/index.tsx | New Exposed Services overview page (heading + refresh toolbar + grid + filters). |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx | Filter controls for exposed services (selected filters + search). |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx | Exposed services datagrid wrapper with Suspense + error handling. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx | RTL test coverage for exposed services rendering/link behavior. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx | Suspense-driven datagrid rows fetching and rendering service entries. |
| .changeset/wide-cups-beam.md | Changeset documenting the new admin feature and UI move. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Adds a new Greenhouse admin page to list all plugin-exposed services across clusters, while refactoring the plugin instance detail page to show exposed services inline within the Details section.
Changes:
- Introduce
/admin/exposed-servicesroute with filters (cluster/plugin/support group) and a DataGrid listing flattened exposed services. - Move exposed-services display out of the plugin instance “Overview” section into the “Details” table as link(s).
- Refine existing admin UI pages (PluginPresets toolbar) and extend shared admin constants/types/utilities.
Reviewed changes
Copilot reviewed 21 out of 22 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/greenhouse/src/routes/admin/exposed-services.tsx | New route with search validation, default filter redirect, and loader-provided filter settings + crumb. |
| apps/greenhouse/src/routeTree.gen.ts | Registers the new admin route in the generated route tree. |
| apps/greenhouse/src/components/admin/utils.ts | Adds getSafeExternalUrl helper for sanitizing external links. |
| apps/greenhouse/src/components/admin/types/schema.d.ts | Adds a PluginsWithExposedServices schema type used by the new feature. |
| apps/greenhouse/src/components/admin/types/k8sTypes.ts | Exposes PluginsWithExposedServices type alias. |
| apps/greenhouse/src/components/admin/constants.ts | Adds exposed-services label selector, new filter IDs, and a default placeholder constant. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts | Fetches plugins with exposed services and derives filter value lists. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts | Fetches plugins with exposed services, flattens/sorts/services, and applies filters/search. |
| apps/greenhouse/src/components/admin/mocks/exposedServices.ts | Adds mock API response data for tests. |
| apps/greenhouse/src/components/admin/PluginPresets/index.tsx | Switches the header area to DataGridToolbar. |
| apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx | Uses the shared SUPPORT_GROUP_LABEL constant for owning team display. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx | Removes the dedicated Exposed Services section from the overview layout. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx | Removes the old per-plugin exposed-services DataGrid component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx | Removes tests that covered the deleted per-plugin DataGrid component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx | Adds inline “Exposed Services” row with safe external links + icon. |
| apps/greenhouse/src/components/admin/Layout/Navigation.tsx | Adds “Exposed Services” item to admin navigation. |
| apps/greenhouse/src/components/admin/ExposedServices/index.tsx | New page container with toolbar + refresh and integration with filters/grid. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx | New filters/search UI wired to URL state and filter API query. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx | New DataGrid shell with suspense + error boundary. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx | Adds a test verifying exposed services render and link behavior. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx | Suspense-powered row rendering using the flattened exposed services query. |
| .changeset/wide-cups-beam.md | Changeset for the new exposed-services feature. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Adds a new Greenhouse admin page to view exposed services across all clusters/plugins, default-filtered by support group, and refactors plugin instance details to show exposed services as inline links instead of a dedicated section.
Changes:
- Introduce
/admin/exposed-servicesroute, navigation entry, page layout, filters, and a DataGrid-backed list. - Add API helpers/types/mocks for fetching plugins that expose services (via label selector) and flattening them for display/filtering.
- Update plugin instance and preset details to reuse constants and present exposed services in the “Details” section; update PluginPresets page to use
DataGridToolbar.
Reviewed changes
Copilot reviewed 22 out of 23 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/greenhouse/src/routes/admin/exposed-services.tsx | New admin route with search validation, default support-group filters, and loader-provided filter settings/crumb. |
| apps/greenhouse/src/routeTree.gen.ts | Registers the new exposed-services route in the generated route tree. |
| apps/greenhouse/src/components/admin/utils.ts | Adds getSafeExternalUrl helper for sanitizing external links. |
| apps/greenhouse/src/components/admin/types/schema.d.ts | Adds PluginsWithExposedServices schema type used by the new exposed-services feature. |
| apps/greenhouse/src/components/admin/types/k8sTypes.ts | Exports PluginsWithExposedServices type alias for use in API/UI layers. |
| apps/greenhouse/src/components/admin/constants.ts | Adds label selector constant and filter IDs for cluster/plugin; introduces a shared “no value” placeholder constant. |
| apps/greenhouse/src/components/admin/common/ExternalLink.tsx | New reusable external link component that uses getSafeExternalUrl. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts | Fetches plugins with exposed services and derives filter value lists (cluster/plugin/support group). |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts | Fetches and flattens exposed services into rows; applies filtering/search and sorting. |
| apps/greenhouse/src/components/admin/mocks/exposedServices.ts | Adds mock plugin data with exposed services for tests. |
| apps/greenhouse/src/components/admin/PluginPresets/index.tsx | Replaces custom toolbar layout with DataGridToolbar. |
| apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx | Uses shared SUPPORT_GROUP_LABEL constant instead of inline string. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx | Removes the old exposed-services section from the plugin instance overview page. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx | Removes the old per-plugin exposed services DataGrid component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx | Removes tests for the deleted exposed-services section component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx | Adds exposed service links inline under “Details” using ExternalLink. |
| apps/greenhouse/src/components/admin/Layout/Navigation.tsx | Adds “Exposed Services” navigation item to the admin navigation. |
| apps/greenhouse/src/components/admin/ExposedServices/index.tsx | New exposed-services overview page container with filters, refresh, and DataGrid. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx | New filter bar (filter select, clear-all, search) for exposed services. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx | New DataGrid wrapper with ErrorBoundary + Suspense integration. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx | Tests exposed-services grid rendering/link behavior using mock data. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx | Suspense-driven rows component fetching and rendering flattened exposed services. |
| .changeset/wide-cups-beam.md | Changeset for the new exposed-services feature and UI refactor. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Adds an “Exposed Services” admin view to Greenhouse to list services exposed by plugins across clusters, and adjusts existing admin pages to use shared patterns/components.
Changes:
- Added
/admin/exposed-servicesroute, navigation entry, data fetching, filtering UI, and datagrid rendering. - Moved plugin instance “Exposed Services” from a dedicated section into the “Details” grid using safe external links.
- Updated Plugin Presets page toolbar usage and improved default-filter redirect behavior there.
Reviewed changes
Copilot reviewed 23 out of 24 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/greenhouse/src/routes/admin/plugin-presets/index.tsx | Preserves existing search params when applying default filters via redirect. |
| apps/greenhouse/src/routes/admin/exposed-services.tsx | New route with default-filter logic and loader data for the Exposed Services page. |
| apps/greenhouse/src/routeTree.gen.ts | Generated route tree updated to include /admin/exposed-services. |
| apps/greenhouse/src/components/admin/utils.ts | Adds getSafeExternalUrl helper for sanitizing external link hrefs. |
| apps/greenhouse/src/components/admin/types/schema.d.ts | Adds PluginsWithExposedServices schema typing for exposed-services payloads. |
| apps/greenhouse/src/components/admin/types/k8sTypes.ts | Exposes PluginsWithExposedServices type alias. |
| apps/greenhouse/src/components/admin/constants.ts | Adds label selector constant, NO_VALUE placeholder, and new filter IDs. |
| apps/greenhouse/src/components/admin/common/ExternalLink.tsx | New component rendering safe external links with icon and fallback text. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServicesFilters.ts | Fetches plugins (label-selected) and derives filter value sets. |
| apps/greenhouse/src/components/admin/api/exposed-services/fetchExposedServices.ts | Fetches plugins (label-selected) and flattens exposed-services into rows with client-side filtering/sorting. |
| apps/greenhouse/src/components/admin/mocks/exposedServices.ts | Adds mock API response data for exposed-services tests. |
| apps/greenhouse/src/components/admin/PluginPresets/index.tsx | Switches Plugin Presets summary/refresh header to DataGridToolbar. |
| apps/greenhouse/src/components/admin/PluginPresetDetail/Overview/Details.tsx | Uses SUPPORT_GROUP_LABEL constant for owning team display. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/index.tsx | Removes the separate Exposed Services section from the overview layout. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.tsx | Removes the old plugin-instance exposed-services datagrid component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/ExposedServices.test.tsx | Removes tests tied to the deleted ExposedServices component. |
| apps/greenhouse/src/components/admin/PluginInstanceDetail/Overview/Details.tsx | Adds exposed-services links into Details table and uses shared ExternalLink. |
| apps/greenhouse/src/components/admin/Layout/Navigation.tsx | Adds “Exposed Services” nav item. |
| apps/greenhouse/src/components/admin/ExposedServices/index.tsx | New page container: heading, filters, toolbar, and grid composition. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesFilters.tsx | New filter/search UI that writes filter state to URL search params. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.tsx | New datagrid shell with Suspense + ErrorBoundary rows. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/index.test.tsx | Adds test coverage for exposed-services grid rendering/link behavior. |
| apps/greenhouse/src/components/admin/ExposedServices/ExposedServicesDataGrid/DataRows/index.tsx | Implements Suspense-driven data rows using flattened exposed-services query. |
| .changeset/wide-cups-beam.md | Changeset for the new feature and detail-page adjustment. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| Pill, | ||
| Stack, | ||
| ContentHeading, | ||
| Icon, |
| {flattenedExposedServices.map((service, index) => ( | ||
| <DataGridRow key={`${service.serviceName}-${index}`}> |
| const exposedServices = plugin.status?.exposedServices || {} | ||
| const exposedServicesEntries = Object.entries(exposedServices) | ||
| const exposedServicesLinks = exposedServicesEntries.map(([url, service], index) => ( | ||
| <span key={`${url}-${service.name}-${index}`}> |





Summary
Add a list of exposed services for all clusters to
GreenhouseunderExposed Servicesnavigation tabExposed Services
Filters by
supportGroupas default. This has all filters cleared.Before Plugin Instance Detail Page
After Plugin Instance Detail Page
Changes Made
DetailsPluginPresetspage to useDataGridToolbarNOTE Will raise a separate issues for:
Exposed Servicespage, navigating to its detail pageRelated Issues
Screenshots (if applicable)
Testing Instructions
Checklist
PR Manifesto
Review the PR Manifesto for best practises.