PluginExtensions: Made it possible to enable extensions admin page in non-development environments (#95820)

* Added feature flag for toggling extensions admin page.

* fixed typo.

* require restart

---------

Co-authored-by: Erik Sundell <erik.sundell87@gmail.com>
This commit is contained in:
Marcus Andersson 2024-11-05 16:55:10 +01:00 committed by GitHub
parent 6fd3620d50
commit c7a7f7dce5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 40 additions and 6 deletions

View File

@ -217,6 +217,7 @@ Experimental features might be changed or removed without prior notice.
| `prometheusUsesCombobox` | Use new combobox component for Prometheus query editor | | `prometheusUsesCombobox` | Use new combobox component for Prometheus query editor |
| `dashboardSchemaV2` | Enables the new dashboard schema version 2, implementing changes necessary for dynamic dashboards and dashboards as code. | | `dashboardSchemaV2` | Enables the new dashboard schema version 2, implementing changes necessary for dynamic dashboards and dashboards as code. |
| `playlistsWatcher` | Enables experimental watcher for playlists | | `playlistsWatcher` | Enables experimental watcher for playlists |
| `enableExtensionsAdminPage` | Enables the extension admin page regardless of development mode |
## Development feature toggles ## Development feature toggles

View File

@ -228,4 +228,5 @@ export interface FeatureToggles {
azureMonitorDisableLogLimit?: boolean; azureMonitorDisableLogLimit?: boolean;
dashboardSchemaV2?: boolean; dashboardSchemaV2?: boolean;
playlistsWatcher?: boolean; playlistsWatcher?: boolean;
enableExtensionsAdminPage?: boolean;
} }

View File

@ -1570,6 +1570,13 @@ var (
Owner: grafanaAppPlatformSquad, Owner: grafanaAppPlatformSquad,
RequiresRestart: true, RequiresRestart: true,
}, },
{
Name: "enableExtensionsAdminPage",
Description: "Enables the extension admin page regardless of development mode",
Stage: FeatureStageExperimental,
Owner: grafanaPluginsPlatformSquad,
RequiresRestart: true,
},
} }
) )

View File

@ -209,3 +209,4 @@ prometheusUsesCombobox,experimental,@grafana/observability-metrics,false,false,f
azureMonitorDisableLogLimit,GA,@grafana/partner-datasources,false,false,false azureMonitorDisableLogLimit,GA,@grafana/partner-datasources,false,false,false
dashboardSchemaV2,experimental,@grafana/dashboards-squad,false,false,true dashboardSchemaV2,experimental,@grafana/dashboards-squad,false,false,true
playlistsWatcher,experimental,@grafana/grafana-app-platform-squad,false,true,false playlistsWatcher,experimental,@grafana/grafana-app-platform-squad,false,true,false
enableExtensionsAdminPage,experimental,@grafana/plugins-platform-backend,false,true,false

1 Name Stage Owner requiresDevMode RequiresRestart FrontendOnly
209 azureMonitorDisableLogLimit GA @grafana/partner-datasources false false false
210 dashboardSchemaV2 experimental @grafana/dashboards-squad false false true
211 playlistsWatcher experimental @grafana/grafana-app-platform-squad false true false
212 enableExtensionsAdminPage experimental @grafana/plugins-platform-backend false true false

View File

@ -846,4 +846,8 @@ const (
// FlagPlaylistsWatcher // FlagPlaylistsWatcher
// Enables experimental watcher for playlists // Enables experimental watcher for playlists
FlagPlaylistsWatcher = "playlistsWatcher" FlagPlaylistsWatcher = "playlistsWatcher"
// FlagEnableExtensionsAdminPage
// Enables the extension admin page regardless of development mode
FlagEnableExtensionsAdminPage = "enableExtensionsAdminPage"
) )

View File

@ -1201,6 +1201,22 @@
"frontend": true "frontend": true
} }
}, },
{
"metadata": {
"name": "enableExtensionsAdminPage",
"resourceVersion": "1730819353237",
"creationTimestamp": "2024-11-05T09:18:42Z",
"annotations": {
"grafana.app/updatedTimestamp": "2024-11-05 15:09:13.237578 +0000 UTC"
}
},
"spec": {
"description": "Enables the extension admin page regardless of development mode",
"stage": "experimental",
"codeowner": "@grafana/plugins-platform-backend",
"requiresRestart": true
}
},
{ {
"metadata": { "metadata": {
"name": "enableNativeHTTPHistogram", "name": "enableNativeHTTPHistogram",

View File

@ -105,7 +105,7 @@ func (s *ServiceImpl) getAdminNode(c *contextmodel.ReqContext) (*navtree.NavLink
}) })
} }
if s.cfg.Env == setting.Dev { if (s.cfg.Env == setting.Dev) || s.features.IsEnabled(ctx, featuremgmt.FlagEnableExtensionsAdminPage) && hasAccess(pluginaccesscontrol.AdminAccessEvaluator) {
pluginsNodeLinks = append(pluginsNodeLinks, &navtree.NavLink{ pluginsNodeLinks = append(pluginsNodeLinks, &navtree.NavLink{
Text: "Extensions", Text: "Extensions",
Icon: "plug", Icon: "plug",

View File

@ -203,9 +203,13 @@ export function getAppRoutes(): RouteDescriptor[] {
{ {
path: '/admin/extensions', path: '/admin/extensions',
navId: 'extensions', navId: 'extensions',
component: isDevEnv roles: () =>
contextSrv.evaluatePermission([AccessControlAction.PluginsInstall, AccessControlAction.PluginsWrite]),
component:
isDevEnv || config.featureToggles.enableExtensionsAdminPage
? SafeDynamicImport( ? SafeDynamicImport(
() => import(/* webpackChunkName: "PluginExtensionsLog" */ 'app/features/plugins/extensions/logs/LogViewer') () =>
import(/* webpackChunkName: "PluginExtensionsLog" */ 'app/features/plugins/extensions/logs/LogViewer')
) )
: () => <Navigate replace to="/admin" />, : () => <Navigate replace to="/admin" />,
}, },