Plugins: Disable uninstall while cloud uninstall is not completed (#81907)

This commit is contained in:
Hugo Kiyodi Oshiro 2024-02-19 12:00:47 +01:00 committed by GitHub
parent 7f77be8f85
commit 4910a901de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 84 additions and 1 deletions

View File

@ -168,4 +168,79 @@ describe('InstallControlsButton', () => {
expect(button).toBeEnabled();
});
});
describe('uninstall button on prem', () => {
const store = configureStore({
plugins: getPluginsStateMock([]),
});
it('should be disabled when is Installing', () => {
store.dispatch({ type: 'plugins/uninstall/pending' });
render(
<TestProvider store={store}>
<InstallControlsButton plugin={{ ...plugin }} pluginStatus={PluginStatus.UNINSTALL} />
</TestProvider>
);
const button = screen.getByText('Uninstalling').closest('button');
expect(button).toBeDisabled();
});
it('should be enabled when it is not Installing', () => {
store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } });
render(
<TestProvider store={store}>
<InstallControlsButton plugin={{ ...plugin }} pluginStatus={PluginStatus.UNINSTALL} />
</TestProvider>
);
const button = screen.getByText('Uninstall').closest('button');
expect(button).toBeEnabled();
});
});
describe('uninstall button on managed instance', () => {
const oldFeatureTogglesManagedPluginsInstall = config.featureToggles.managedPluginsInstall;
const oldPluginAdminExternalManageEnabled = config.pluginAdminExternalManageEnabled;
beforeAll(() => {
config.featureToggles.managedPluginsInstall = true;
config.pluginAdminExternalManageEnabled = true;
});
afterAll(() => {
config.featureToggles.managedPluginsInstall = oldFeatureTogglesManagedPluginsInstall;
config.pluginAdminExternalManageEnabled = oldPluginAdminExternalManageEnabled;
});
const store = configureStore({
plugins: getPluginsStateMock([]),
});
it('should be disabled when isInstalling=false but isUninstallingFromInstance=true', () => {
store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } });
render(
<TestProvider store={store}>
<InstallControlsButton
plugin={{ ...plugin, isUninstallingFromInstance: true }}
pluginStatus={PluginStatus.UNINSTALL}
/>
</TestProvider>
);
const button = screen.getByText('Uninstall').closest('button');
expect(button).toBeDisabled();
});
it('should be enabled when isInstalling=false and isUninstallingFromInstance=false', () => {
store.dispatch({ type: 'plugins/uninstall/fulfilled', payload: { id: '', changes: {} } });
render(
<TestProvider store={store}>
<InstallControlsButton
plugin={{ ...plugin, isUninstallingFromInstance: false }}
pluginStatus={PluginStatus.UNINSTALL}
/>
</TestProvider>
);
const button = screen.getByText('Uninstall').closest('button');
expect(button).toBeEnabled();
});
});
});

View File

@ -114,6 +114,11 @@ export function InstallControlsButton({
};
if (pluginStatus === PluginStatus.UNINSTALL) {
const disableUninstall =
config.pluginAdminExternalManageEnabled && configCore.featureToggles.managedPluginsInstall
? plugin.isUninstallingFromInstance
: isUninstalling;
return (
<>
<ConfirmModal
@ -126,7 +131,7 @@ export function InstallControlsButton({
onDismiss={hideConfirmModal}
/>
<HorizontalGroup align="flex-start" width="auto" height="auto">
<Button variant="destructive" disabled={isUninstalling} onClick={showConfirmModal}>
<Button variant="destructive" disabled={disableUninstall} onClick={showConfirmModal}>
{uninstallBtnText}
</Button>
</HorizontalGroup>

View File

@ -60,6 +60,8 @@ export function mergeLocalsAndRemotes({
instancesMap.has(remotePlugin.slug) &&
catalogPlugin.hasUpdate &&
catalogPlugin.installedVersion !== instancePlugin?.version;
catalogPlugin.isUninstallingFromInstance = Boolean(localCounterpart) && !instancesMap.has(remotePlugin.slug);
}
catalogPlugins.push(catalogPlugin);

View File

@ -62,6 +62,7 @@ export interface CatalogPlugin extends WithAccessControlMetadata {
// instance plugins may not be fully installed, which means a new instance
// running the plugin didn't started yet
isFullyInstalled?: boolean;
isUninstallingFromInstance?: boolean;
isUpdatingFromInstance?: boolean;
iam?: IdentityAccessManagement;
}