diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index e51caa298b..18840da5fc 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -1,6 +1,7 @@ import { app, ipcRenderer, remote } from "electron"; import { action, computed, observable, reaction, toJS, when } from "mobx"; import path from "path"; +import { getHostedCluster } from "../common/cluster-store"; import { broadcastMessage, handleRequest, requestMain, subscribeToBroadcast } from "../common/ipc"; import logger from "../main/logger"; import type { InstalledExtension } from "./extension-discovery"; @@ -94,14 +95,14 @@ export class ExtensionLoader { loadOnMain() { logger.info(`${logModule}: load on main`); - this.autoInitExtensions((ext: LensMainExtension) => [ + this.autoInitExtensions(async (ext: LensMainExtension) => [ registries.menuRegistry.add(ext.appMenus) ]); } loadOnClusterManagerRenderer() { logger.info(`${logModule}: load on main renderer (cluster manager)`); - this.autoInitExtensions((ext: LensRendererExtension) => [ + this.autoInitExtensions(async (ext: LensRendererExtension) => [ registries.globalPageRegistry.add(ext.globalPages, ext), registries.globalPageMenuRegistry.add(ext.globalPageMenus, ext), registries.appPreferenceRegistry.add(ext.appPreferences), @@ -112,16 +113,22 @@ export class ExtensionLoader { loadOnClusterRenderer() { logger.info(`${logModule}: load on cluster renderer (dashboard)`); - this.autoInitExtensions((ext: LensRendererExtension) => [ - registries.clusterPageRegistry.add(ext.clusterPages, ext), - registries.clusterPageMenuRegistry.add(ext.clusterPageMenus, ext), - registries.kubeObjectMenuRegistry.add(ext.kubeObjectMenuItems), - registries.kubeObjectDetailRegistry.add(ext.kubeObjectDetailItems), - registries.kubeObjectStatusRegistry.add(ext.kubeObjectStatusTexts) - ]); + const cluster = getHostedCluster(); + this.autoInitExtensions(async (ext: LensRendererExtension) => { + if (await ext.isEnabledForCluster(cluster) === false) { + return []; + } + return [ + registries.clusterPageRegistry.add(ext.clusterPages, ext), + registries.clusterPageMenuRegistry.add(ext.clusterPageMenus, ext), + registries.kubeObjectMenuRegistry.add(ext.kubeObjectMenuItems), + registries.kubeObjectDetailRegistry.add(ext.kubeObjectDetailItems), + registries.kubeObjectStatusRegistry.add(ext.kubeObjectStatusTexts) + ]; + }); } - protected autoInitExtensions(register: (ext: LensExtension) => Function[]) { + protected autoInitExtensions(register: (ext: LensExtension) => Promise) { return reaction(() => this.toJSON(), installedExtensions => { for (const [extId, ext] of installedExtensions) { let instance = this.instances.get(extId); diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index fc7f3ff0df..0dd6980102 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -67,15 +67,16 @@ export class LensExtension { } } - async whenEnabled(handlers: () => Function[]) { + async whenEnabled(handlers: () => Promise) { const disposers: Function[] = []; const unregisterHandlers = () => { disposers.forEach(unregister => unregister()); disposers.length = 0; }; - const cancelReaction = reaction(() => this.isEnabled, isEnabled => { + const cancelReaction = reaction(() => this.isEnabled, async (isEnabled) => { if (isEnabled) { - disposers.push(...handlers()); + const handlerDisposers = await handlers(); + disposers.push(...handlerDisposers); } else { unregisterHandlers(); } diff --git a/src/extensions/lens-renderer-extension.ts b/src/extensions/lens-renderer-extension.ts index c1769f0953..0043f2673f 100644 --- a/src/extensions/lens-renderer-extension.ts +++ b/src/extensions/lens-renderer-extension.ts @@ -1,8 +1,10 @@ import type { AppPreferenceRegistration, ClusterFeatureRegistration, KubeObjectDetailRegistration, KubeObjectMenuRegistration, KubeObjectStatusRegistration, PageMenuRegistration, PageRegistration, StatusBarRegistration, } from "./registries"; +import type { Cluster } from "../main/cluster"; import { observable } from "mobx"; import { LensExtension } from "./lens-extension"; import { getExtensionPageUrl } from "./registries/page-registry"; + export class LensRendererExtension extends LensExtension { @observable.shallow globalPages: PageRegistration[] = []; @observable.shallow clusterPages: PageRegistration[] = []; @@ -24,4 +26,11 @@ export class LensRendererExtension extends LensExtension { }); navigate(pageUrl); } + + /** + * Defines if extension is enabled for a given cluster. Defaults to `true`. + */ + async isEnabledForCluster(cluster: Cluster): Promise { + return true; + } }