Plugins: Never disable add new data source for core plugins (#81774)

This commit is contained in:
Hugo Kiyodi Oshiro 2024-02-05 09:32:58 +01:00 committed by GitHub
parent d9f7eda284
commit ed62aefeb0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 107 additions and 5 deletions

View File

@ -0,0 +1,79 @@
import { render, screen } from '@testing-library/react';
import React from 'react';
import { TestProvider } from 'test/helpers/TestProvider';
import { PluginSignatureStatus } from '@grafana/data';
import { config } from '@grafana/runtime';
import { ContextSrv, setContextSrv } from 'app/core/services/context_srv';
import { AccessControlAction } from 'app/types';
import { CatalogPlugin } from '../../types';
import { GetStartedWithDataSource } from './GetStartedWithDataSource';
const plugin: CatalogPlugin = {
description: 'The test plugin',
downloads: 5,
id: 'test-plugin',
info: {
logos: { small: '', large: '' },
},
name: 'Testing Plugin',
orgName: 'Test',
popularity: 0,
signature: PluginSignatureStatus.valid,
publishedAt: '2020-09-01',
updatedAt: '2021-06-28',
hasUpdate: false,
isInstalled: false,
isCore: false,
isDev: false,
isEnterprise: false,
isDisabled: false,
isDeprecated: false,
isPublished: true,
};
describe('GetStartedWithDataSource', () => {
const oldFeatureTogglesManagedPluginsInstall = config.featureToggles.managedPluginsInstall;
const oldPluginAdminExternalManageEnabled = config.pluginAdminExternalManageEnabled;
config.featureToggles.managedPluginsInstall = true;
config.pluginAdminExternalManageEnabled = true;
const contextSrv = new ContextSrv();
contextSrv.user.permissions = {
[AccessControlAction.DataSourcesCreate]: true,
[AccessControlAction.DataSourcesWrite]: true,
};
setContextSrv(contextSrv);
afterAll(() => {
config.featureToggles.managedPluginsInstall = oldFeatureTogglesManagedPluginsInstall;
config.pluginAdminExternalManageEnabled = oldPluginAdminExternalManageEnabled;
});
it('should disable button when managedPluginsInstall and pluginAdminExternalManaged are enabled, but plugin.isFullyInstalled is false', () => {
render(
<TestProvider>
<GetStartedWithDataSource plugin={{ ...plugin, isFullyInstalled: false }} />
</TestProvider>
);
const el = screen.getByRole('button', { hidden: true });
expect(el).toHaveTextContent(/Add new data source/i);
expect(el).toBeDisabled();
});
it('should disable button when managedPluginsInstall and pluginAdminExternalManaged are enabled, but plugin.isFullyInstalled is true', () => {
render(
<TestProvider>
<GetStartedWithDataSource plugin={{ ...plugin, isFullyInstalled: true }} />
</TestProvider>
);
const el = screen.getByRole('button', { hidden: true });
expect(el).toHaveTextContent(/Add new data source/i);
expect(el).toBeEnabled();
});
});

View File

@ -3,7 +3,6 @@ import React, { useCallback } from 'react';
import { DataSourcePluginMeta } from '@grafana/data';
import { config } from '@grafana/runtime';
import { Button } from '@grafana/ui';
import configCore from 'app/core/config';
import { useDataSourcesRoutes, addDataSource } from 'app/features/datasources/state';
import { useDispatch } from 'app/types';
@ -31,9 +30,7 @@ export function GetStartedWithDataSource({ plugin }: Props): React.ReactElement
}
const disabledButton =
configCore.featureToggles.managedPluginsInstall &&
config.pluginAdminExternalManageEnabled &&
!plugin.isFullyInstalled;
config.featureToggles.managedPluginsInstall && config.pluginAdminExternalManageEnabled && !plugin.isFullyInstalled;
return (
<Button

View File

@ -88,6 +88,30 @@ describe('Plugins/Helpers', () => {
expect(findMerged('plugin-5')).not.toBeUndefined();
expect(findMerged('plugin-5')?.isDeprecated).toBe(true);
});
test('core plugins should be fullyInstalled in cloud', () => {
const corePluginId = 'plugin-core';
const oldFeatureTogglesManagedPluginsInstall = config.featureToggles.managedPluginsInstall;
const oldPluginAdminExternalManageEnabled = config.pluginAdminExternalManageEnabled;
config.featureToggles.managedPluginsInstall = true;
config.pluginAdminExternalManageEnabled = true;
const merged = mergeLocalsAndRemotes({
local: [...localPlugins, getLocalPluginMock({ id: corePluginId, signature: PluginSignatureStatus.internal })],
remote: [...remotePlugins, getRemotePluginMock({ slug: corePluginId })],
});
const findMerged = (mergedId: string) => merged.find(({ id }) => id === mergedId);
expect(merged).toHaveLength(5);
expect(findMerged(corePluginId)).not.toBeUndefined();
expect(findMerged(corePluginId)?.isCore).toBe(true);
expect(findMerged(corePluginId)?.isFullyInstalled).toBe(true);
config.featureToggles.managedPluginsInstall = oldFeatureTogglesManagedPluginsInstall;
config.pluginAdminExternalManageEnabled = oldPluginAdminExternalManageEnabled;
});
});
describe('mergeLocalAndRemote()', () => {

View File

@ -47,7 +47,9 @@ export function mergeLocalsAndRemotes({
// for managed instances, check if plugin is installed, but not yet present in the current instance
if (configCore.featureToggles.managedPluginsInstall && config.pluginAdminExternalManageEnabled) {
catalogPlugin.isFullyInstalled = instancesSet.has(remotePlugin.slug) && catalogPlugin.isInstalled;
catalogPlugin.isFullyInstalled = catalogPlugin.isCore
? true
: instancesSet.has(remotePlugin.slug) && catalogPlugin.isInstalled;
catalogPlugin.isInstalled = instancesSet.has(remotePlugin.slug) || catalogPlugin.isInstalled;
}