From 26e72487d4efe45983a1cbadd1d8707840a94e4f Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 14 May 2021 17:24:22 -0400 Subject: [PATCH] Explicitly initialize registries - Helps moves towards turning on banning CyclicImports Signed-off-by: Sebastian Malton --- src/common/protocol-handler/router.ts | 2 +- src/extensions/extension-loader.ts | 28 +- src/extensions/interfaces/registrations.ts | 2 +- src/extensions/lens-extension.ts | 2 +- .../__tests__/page-registry.test.ts | 20 +- .../registries/app-preference-registry.ts | 2 - src/extensions/registries/base-registry.ts | 3 +- src/extensions/registries/command-registry.ts | 2 - .../registries/entity-setting-registry.ts | 2 - .../registries/kube-object-detail-registry.ts | 6 +- .../registries/kube-object-menu-registry.ts | 2 - .../registries/kube-object-status-registry.ts | 2 - src/extensions/registries/menu-registry.ts | 2 - .../registries/page-menu-registry.ts | 2 - src/extensions/registries/page-registry.ts | 8 +- ...andler-registry.ts => protocol-handler.ts} | 0 .../registries/status-bar-registry.ts | 2 - .../registries/welcome-menu-registry.ts | 2 - src/main/index.ts | 2 + .../initializers/index.ts} | 18 +- .../initializers/registries.ts} | 13 +- src/main/menu.ts | 4 +- src/renderer/api/catalog-entity.ts | 4 +- .../api/kube-object-detail-registry.ts | 2 +- src/renderer/bootstrap.tsx | 8 + src/renderer/components/+apps/index.ts | 1 - .../+config-autoscalers/hpa-details.tsx | 19 - .../limit-range-details.tsx | 9 - .../+config-maps/config-map-details.tsx | 19 - .../pod-disruption-budgets-details.tsx | 9 - .../resource-quota-details.tsx | 9 - .../+config-secrets/secret-details.tsx | 9 - .../components/+config/config.command.ts | 66 --- src/renderer/components/+config/index.ts | 1 - .../+custom-resources/crd-details.tsx | 9 - .../+entity-settings/entity-settings.tsx | 4 +- .../components/+events/event-details.tsx | 9 - .../+namespaces/namespace-details.tsx | 9 - .../+network-endpoints/endpoint-details.tsx | 18 - .../+network-ingresses/ingress-details.tsx | 18 - .../network-policy-details.tsx | 19 - .../+network-services/service-details.tsx | 19 - src/renderer/components/+network/index.ts | 1 - src/renderer/components/+nodes/index.ts | 1 - .../components/+nodes/node-details.tsx | 19 - .../pod-security-policy-details.tsx | 9 - .../components/+preferences/preferences.tsx | 6 +- .../storage-class-details.tsx | 19 - .../volume-claim-details.tsx | 19 - .../+storage-volumes/volume-details.tsx | 19 - .../role-binding-details.tsx | 35 -- .../+user-management-roles/role-details.tsx | 34 -- .../service-accounts-details.tsx | 18 - .../service-accounts.tsx | 22 +- src/renderer/components/+welcome/welcome.tsx | 27 +- .../+workloads-cronjobs/cronjob-details.tsx | 18 - .../+workloads-cronjobs/cronjobs.tsx | 9 - .../daemonset-details.tsx | 18 - .../deployment-details.tsx | 18 - .../+workloads-deployments/deployments.tsx | 9 - .../+workloads-jobs/job-details.tsx | 18 - .../+workloads-pods/pod-details.tsx | 19 - .../replicaset-details.tsx | 18 - .../+workloads-replicasets/replicasets.tsx | 9 - .../statefulset-details.tsx | 20 - .../+workloads-statefulsets/statefulsets.tsx | 9 - src/renderer/components/+workloads/index.ts | 1 - .../+workloads/workloads.command.ts | 66 --- src/renderer/components/app.tsx | 16 +- .../cluster-manager/bottom-bar.test.tsx | 28 +- .../components/cluster-manager/bottom-bar.tsx | 4 +- .../cluster-manager/cluster-manager.tsx | 4 +- .../cluster-settings/cluster-settings.tsx | 206 ++++---- ...w-metrics.tsx => cluster-show-metrics.tsx} | 0 .../cluster-settings/components/index.ts | 29 ++ .../components/remove-cluster-button.tsx | 57 --- .../components/cluster-settings/index.ts | 1 - .../command-palette/command-container.tsx | 6 +- .../command-palette/command-dialog.tsx | 53 ++- src/renderer/components/dock/dock.tsx | 9 - .../components/hotbar/hotbar-cell.tsx | 1 - .../components/hotbar/hotbar-menu.tsx | 1 - .../components/hotbar/hotbar.commands.tsx | 48 -- .../kube-object-status-icon.tsx | 4 +- .../kube-object/kube-object-details.tsx | 4 +- .../kube-object/kube-object-menu.tsx | 5 +- src/renderer/components/layout/sidebar.tsx | 10 +- .../initializers/command-registry.tsx | 187 ++++++++ .../initializers/entity-settings-registry.ts | 70 +++ src/renderer/initializers/index.ts | 27 ++ .../kube-object-detail-registry.ts | 443 ++++++++++++++++++ .../initializers/kube-object-menu-registry.ts | 68 +++ .../registries.ts} | 45 +- .../welcome-menu-registry.ts} | 33 +- src/renderer/lens-app.tsx | 10 +- webpack.extensions.ts | 1 + 96 files changed, 1093 insertions(+), 1125 deletions(-) rename src/extensions/registries/{protocol-handler-registry.ts => protocol-handler.ts} (100%) rename src/{renderer/components/+apps/apps.command.ts => main/initializers/index.ts} (68%) rename src/{renderer/components/+nodes/node.command.ts => main/initializers/registries.ts} (77%) delete mode 100644 src/renderer/components/+config/config.command.ts delete mode 100644 src/renderer/components/+workloads/workloads.command.ts rename src/renderer/components/cluster-settings/components/{show-metrics.tsx => cluster-show-metrics.tsx} (100%) create mode 100644 src/renderer/components/cluster-settings/components/index.ts delete mode 100644 src/renderer/components/cluster-settings/components/remove-cluster-button.tsx delete mode 100644 src/renderer/components/hotbar/hotbar.commands.tsx create mode 100644 src/renderer/initializers/command-registry.tsx create mode 100644 src/renderer/initializers/entity-settings-registry.ts create mode 100644 src/renderer/initializers/index.ts create mode 100644 src/renderer/initializers/kube-object-detail-registry.ts create mode 100644 src/renderer/initializers/kube-object-menu-registry.ts rename src/renderer/{components/+network/network.command.ts => initializers/registries.ts} (57%) rename src/renderer/{components/cluster-settings/cluster-settings.command.ts => initializers/welcome-menu-registry.ts} (67%) diff --git a/src/common/protocol-handler/router.ts b/src/common/protocol-handler/router.ts index 59101b5aa7..0fd264db60 100644 --- a/src/common/protocol-handler/router.ts +++ b/src/common/protocol-handler/router.ts @@ -29,7 +29,7 @@ import { RoutingError, RoutingErrorType } from "./error"; import { ExtensionsStore } from "../../extensions/extensions-store"; import { ExtensionLoader } from "../../extensions/extension-loader"; import type { LensExtension } from "../../extensions/lens-extension"; -import type { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler-registry"; +import type { RouteHandler, RouteParams } from "../../extensions/registries/protocol-handler"; // IPC channel for protocol actions. Main broadcasts the open-url events to this channel. export const ProtocolHandlerIpcPrefix = "protocol-handler"; diff --git a/src/extensions/extension-loader.ts b/src/extensions/extension-loader.ts index b024ddd761..df230601cb 100644 --- a/src/extensions/extension-loader.ts +++ b/src/extensions/extension-loader.ts @@ -207,11 +207,13 @@ export class ExtensionLoader extends Singleton { } loadOnMain() { + registries.MenuRegistry.createInstance(); + logger.debug(`${logModule}: load on main`); this.autoInitExtensions(async (extension: LensMainExtension) => { // Each .add returns a function to remove the item const removeItems = [ - registries.menuRegistry.add(extension.appMenus) + registries.MenuRegistry.getInstance().add(extension.appMenus) ]; this.events.on("remove", (removedExtension: LensRendererExtension) => { @@ -230,12 +232,12 @@ export class ExtensionLoader extends Singleton { logger.debug(`${logModule}: load on main renderer (cluster manager)`); this.autoInitExtensions(async (extension: LensRendererExtension) => { const removeItems = [ - registries.globalPageRegistry.add(extension.globalPages, extension), - registries.appPreferenceRegistry.add(extension.appPreferences), - registries.entitySettingRegistry.add(extension.entitySettings), - registries.statusBarRegistry.add(extension.statusBarItems), - registries.commandRegistry.add(extension.commands), - registries.welcomeMenuRegistry.add(extension.welcomeMenus), + registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension), + registries.AppPreferenceRegistry.getInstance().add(extension.appPreferences), + registries.EntitySettingRegistry.getInstance().add(extension.entitySettings), + registries.StatusBarRegistry.getInstance().add(extension.statusBarItems), + registries.CommandRegistry.getInstance().add(extension.commands), + registries.WelcomeMenuRegistry.getInstance().add(extension.welcomeMenus), ]; this.events.on("remove", (removedExtension: LensRendererExtension) => { @@ -260,12 +262,12 @@ export class ExtensionLoader extends Singleton { } const removeItems = [ - registries.clusterPageRegistry.add(extension.clusterPages, extension), - registries.clusterPageMenuRegistry.add(extension.clusterPageMenus, extension), - registries.kubeObjectMenuRegistry.add(extension.kubeObjectMenuItems), - registries.kubeObjectDetailRegistry.add(extension.kubeObjectDetailItems), - registries.kubeObjectStatusRegistry.add(extension.kubeObjectStatusTexts), - registries.commandRegistry.add(extension.commands), + registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension), + registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension), + registries.KubeObjectMenuRegistry.getInstance().add(extension.kubeObjectMenuItems), + registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems), + registries.KubeObjectStatusRegistry.getInstance().add(extension.kubeObjectStatusTexts), + registries.CommandRegistry.getInstance().add(extension.commands), ]; this.events.on("remove", (removedExtension: LensRendererExtension) => { diff --git a/src/extensions/interfaces/registrations.ts b/src/extensions/interfaces/registrations.ts index e2e8d1ed11..dadde70ceb 100644 --- a/src/extensions/interfaces/registrations.ts +++ b/src/extensions/interfaces/registrations.ts @@ -26,4 +26,4 @@ export type { KubeObjectStatusRegistration } from "../registries/kube-object-sta export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../registries/page-registry"; export type { PageMenuRegistration, ClusterPageMenuRegistration, PageMenuComponents } from "../registries/page-menu-registry"; export type { StatusBarRegistration } from "../registries/status-bar-registry"; -export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler-registry"; +export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler"; diff --git a/src/extensions/lens-extension.ts b/src/extensions/lens-extension.ts index e5f110ec88..6f27394947 100644 --- a/src/extensions/lens-extension.ts +++ b/src/extensions/lens-extension.ts @@ -23,7 +23,7 @@ import type { InstalledExtension } from "./extension-discovery"; import { action, observable, reaction } from "mobx"; import { FilesystemProvisionerStore } from "../main/extension-filesystem"; import logger from "../main/logger"; -import type { ProtocolHandlerRegistration } from "./registries/protocol-handler-registry"; +import type { ProtocolHandlerRegistration } from "./registries/protocol-handler"; export type LensExtensionId = string; // path to manifest (package.json) export type LensExtensionConstructor = new (...args: ConstructorParameters) => LensExtension; diff --git a/src/extensions/registries/__tests__/page-registry.test.ts b/src/extensions/registries/__tests__/page-registry.test.ts index fc40b1baca..177f5227e9 100644 --- a/src/extensions/registries/__tests__/page-registry.test.ts +++ b/src/extensions/registries/__tests__/page-registry.test.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { getExtensionPageUrl, globalPageRegistry, PageParams } from "../page-registry"; +import { getExtensionPageUrl, GlobalPageRegistry, PageParams } from "../page-registry"; import { LensExtension } from "../../lens-extension"; import React from "react"; import { Console } from "console"; @@ -42,7 +42,7 @@ describe("getPageUrl", () => { isBundled: false, isEnabled: true }); - globalPageRegistry.add({ + GlobalPageRegistry.createInstance().add({ id: "page-with-params", components: { Page: () => React.createElement("Page with params") @@ -54,6 +54,10 @@ describe("getPageUrl", () => { }, ext); }); + afterEach(() => { + GlobalPageRegistry.resetInstance(); + }); + it("returns a page url for extension", () => { expect(getExtensionPageUrl({ extensionId: ext.name })).toBe("/extension/foo-bar"); }); @@ -102,7 +106,7 @@ describe("globalPageRegistry", () => { isBundled: false, isEnabled: true }); - globalPageRegistry.add([ + GlobalPageRegistry.createInstance().add([ { id: "test-page", components: { @@ -123,9 +127,13 @@ describe("globalPageRegistry", () => { ], ext); }); + afterEach(() => { + GlobalPageRegistry.resetInstance(); + }); + describe("getByPageTarget", () => { it("matching to first registered page without id", () => { - const page = globalPageRegistry.getByPageTarget({ extensionId: ext.name }); + const page = GlobalPageRegistry.getInstance().getByPageTarget({ extensionId: ext.name }); expect(page.id).toEqual(undefined); expect(page.extensionId).toEqual(ext.name); @@ -133,7 +141,7 @@ describe("globalPageRegistry", () => { }); it("returns matching page", () => { - const page = globalPageRegistry.getByPageTarget({ + const page = GlobalPageRegistry.getInstance().getByPageTarget({ pageId: "test-page", extensionId: ext.name }); @@ -142,7 +150,7 @@ describe("globalPageRegistry", () => { }); it("returns null if target not found", () => { - const page = globalPageRegistry.getByPageTarget({ + const page = GlobalPageRegistry.getInstance().getByPageTarget({ pageId: "wrong-page", extensionId: ext.name }); diff --git a/src/extensions/registries/app-preference-registry.ts b/src/extensions/registries/app-preference-registry.ts index 4df13edc63..fb20034d52 100644 --- a/src/extensions/registries/app-preference-registry.ts +++ b/src/extensions/registries/app-preference-registry.ts @@ -46,5 +46,3 @@ export class AppPreferenceRegistry extends BaseRegistry { +export class BaseRegistry extends Singleton { private items = observable.map(); getItems(): I[] { diff --git a/src/extensions/registries/command-registry.ts b/src/extensions/registries/command-registry.ts index ba88f623dd..967fbd1271 100644 --- a/src/extensions/registries/command-registry.ts +++ b/src/extensions/registries/command-registry.ts @@ -54,5 +54,3 @@ export class CommandRegistry extends BaseRegistry { return super.add(filteredItems, extension); } } - -export const commandRegistry = new CommandRegistry(); diff --git a/src/extensions/registries/entity-setting-registry.ts b/src/extensions/registries/entity-setting-registry.ts index 3aaab8bbad..a9e87a7114 100644 --- a/src/extensions/registries/entity-setting-registry.ts +++ b/src/extensions/registries/entity-setting-registry.ts @@ -67,5 +67,3 @@ export class EntitySettingRegistry extends BaseRegistry (b.priority ?? 50) - (a.priority ?? 50)); } } - -export const entitySettingRegistry = new EntitySettingRegistry(); diff --git a/src/extensions/registries/kube-object-detail-registry.ts b/src/extensions/registries/kube-object-detail-registry.ts index 7cc17bbc7e..844f5fc0ee 100644 --- a/src/extensions/registries/kube-object-detail-registry.ts +++ b/src/extensions/registries/kube-object-detail-registry.ts @@ -20,10 +20,12 @@ */ import type React from "react"; +import type { KubeObjectDetailsProps } from "../renderer-api/components"; +import type { KubeObject } from "../renderer-api/k8s-api"; import { BaseRegistry } from "./base-registry"; export interface KubeObjectDetailComponents { - Details: React.ComponentType; + Details: React.ComponentType>; } export interface KubeObjectDetailRegistration { @@ -42,5 +44,3 @@ export class KubeObjectDetailRegistry extends BaseRegistry (b.priority ?? 50) - (a.priority ?? 50)); } } - -export const kubeObjectDetailRegistry = new KubeObjectDetailRegistry(); diff --git a/src/extensions/registries/kube-object-menu-registry.ts b/src/extensions/registries/kube-object-menu-registry.ts index 414d55db59..fbbc872d2b 100644 --- a/src/extensions/registries/kube-object-menu-registry.ts +++ b/src/extensions/registries/kube-object-menu-registry.ts @@ -39,5 +39,3 @@ export class KubeObjectMenuRegistry extends BaseRegistry { } - -export const menuRegistry = new MenuRegistry(); diff --git a/src/extensions/registries/page-menu-registry.ts b/src/extensions/registries/page-menu-registry.ts index 08df7b1c79..53dc743171 100644 --- a/src/extensions/registries/page-menu-registry.ts +++ b/src/extensions/registries/page-menu-registry.ts @@ -77,5 +77,3 @@ export class ClusterPageMenuRegistry extends PageMenuRegistry { @@ -96,7 +96,7 @@ export function getExtensionPageUrl(target: PageTarget): string { return pageUrl.href.replace(pageUrl.origin, ""); } -export class PageRegistry extends BaseRegistry { +class PageRegistry extends BaseRegistry { protected getRegisteredItem(page: PageRegistration, ext: LensExtension): RegisteredPage { const { id: pageId } = page; const extensionId = ext.name; @@ -139,5 +139,5 @@ export class PageRegistry extends BaseRegistry } } -export const globalPageRegistry = new PageRegistry(); -export const clusterPageRegistry = new PageRegistry(); +export class ClusterPageRegistry extends PageRegistry {} +export class GlobalPageRegistry extends PageRegistry {} diff --git a/src/extensions/registries/protocol-handler-registry.ts b/src/extensions/registries/protocol-handler.ts similarity index 100% rename from src/extensions/registries/protocol-handler-registry.ts rename to src/extensions/registries/protocol-handler.ts diff --git a/src/extensions/registries/status-bar-registry.ts b/src/extensions/registries/status-bar-registry.ts index 0814f9cc7a..2afdee76a6 100644 --- a/src/extensions/registries/status-bar-registry.ts +++ b/src/extensions/registries/status-bar-registry.ts @@ -41,5 +41,3 @@ export interface StatusBarRegistration extends StatusBarRegistrationV2 { export class StatusBarRegistry extends BaseRegistry { } - -export const statusBarRegistry = new StatusBarRegistry(); diff --git a/src/extensions/registries/welcome-menu-registry.ts b/src/extensions/registries/welcome-menu-registry.ts index 077f1d3aea..7092028459 100644 --- a/src/extensions/registries/welcome-menu-registry.ts +++ b/src/extensions/registries/welcome-menu-registry.ts @@ -28,5 +28,3 @@ export interface WelcomeMenuRegistration { } export class WelcomeMenuRegistry extends BaseRegistry {} - -export const welcomeMenuRegistry = new WelcomeMenuRegistry(); diff --git a/src/main/index.ts b/src/main/index.ts index 73b2ca5fd1..25a87bf30d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -55,6 +55,7 @@ import { HotbarStore } from "../common/hotbar-store"; import { HelmRepoManager } from "./helm/helm-repo-manager"; import { KubeconfigSyncManager } from "./catalog-sources"; import { handleWsUpgrade } from "./proxy/ws-upgrade"; +import { initRegistries } from "./initializers"; const workingDir = path.join(app.getPath("appData"), appName); @@ -168,6 +169,7 @@ app.on("ready", async () => { app.exit(); } + initRegistries(); const extensionDiscovery = ExtensionDiscovery.createInstance(); ExtensionLoader.createInstance().init(); diff --git a/src/renderer/components/+apps/apps.command.ts b/src/main/initializers/index.ts similarity index 68% rename from src/renderer/components/+apps/apps.command.ts rename to src/main/initializers/index.ts index eca0529bc4..9cf15b3771 100644 --- a/src/renderer/components/+apps/apps.command.ts +++ b/src/main/initializers/index.ts @@ -19,20 +19,4 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import { helmChartsURL, releaseURL } from "../../../common/routes"; - -commandRegistry.add({ - id: "cluster.viewHelmCharts", - title: "Cluster: View Helm Charts", - scope: "entity", - action: () => navigate(helmChartsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewHelmReleases", - title: "Cluster: View Helm Releases", - scope: "entity", - action: () => navigate(releaseURL()) -}); +export * from "./registries"; diff --git a/src/renderer/components/+nodes/node.command.ts b/src/main/initializers/registries.ts similarity index 77% rename from src/renderer/components/+nodes/node.command.ts rename to src/main/initializers/registries.ts index 314381b5a4..28fcdff1a1 100644 --- a/src/renderer/components/+nodes/node.command.ts +++ b/src/main/initializers/registries.ts @@ -19,13 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import { nodesURL } from "../../../common/routes"; +import * as registries from "../../extensions/registries"; -commandRegistry.add({ - id: "cluster.viewNodes", - title: "Cluster: View Nodes", - scope: "entity", - action: () => navigate(nodesURL()) -}); +export function initRegistries() { + registries.MenuRegistry.createInstance(); +} diff --git a/src/main/menu.ts b/src/main/menu.ts index 7d80ce162e..5b60541baa 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -23,7 +23,7 @@ import { app, BrowserWindow, dialog, ipcMain, IpcMainEvent, Menu, MenuItem, Menu import { autorun } from "mobx"; import type { WindowManager } from "./window-manager"; import { appName, isMac, isWindows, isTestEnv, docsUrl, supportUrl, productName } from "../common/vars"; -import { menuRegistry } from "../extensions/registries/menu-registry"; +import { MenuRegistry } from "../extensions/registries/menu-registry"; import logger from "./logger"; import { exitApp } from "./exit-app"; import { broadcastMessage } from "../common/ipc"; @@ -255,7 +255,7 @@ export function buildMenu(windowManager: WindowManager) { }; // Modify menu from extensions-api - menuRegistry.getItems().forEach(({ parentId, ...menuItem }) => { + MenuRegistry.getInstance().getItems().forEach(({ parentId, ...menuItem }) => { try { const topMenu = appMenu[parentId as MenuTopId].submenu as MenuItemConstructorOptions[]; diff --git a/src/renderer/api/catalog-entity.ts b/src/renderer/api/catalog-entity.ts index 08a4f138e0..c2b1042483 100644 --- a/src/renderer/api/catalog-entity.ts +++ b/src/renderer/api/catalog-entity.ts @@ -20,7 +20,7 @@ */ import { navigate } from "../navigation"; -import { commandRegistry } from "../../extensions/registries"; +import { CommandRegistry } from "../../extensions/registries"; import type { CatalogEntity } from "../../common/catalog"; export { CatalogCategory, CatalogEntity } from "../../common/catalog"; @@ -36,6 +36,6 @@ export type { export const catalogEntityRunContext = { navigate: (url: string) => navigate(url), setCommandPaletteContext: (entity?: CatalogEntity) => { - commandRegistry.activeEntity = entity; + CommandRegistry.getInstance().activeEntity = entity; } }; diff --git a/src/renderer/api/kube-object-detail-registry.ts b/src/renderer/api/kube-object-detail-registry.ts index 0afc7907da..1693fd56f1 100644 --- a/src/renderer/api/kube-object-detail-registry.ts +++ b/src/renderer/api/kube-object-detail-registry.ts @@ -19,4 +19,4 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -export { kubeObjectDetailRegistry } from "../../extensions/registries/kube-object-detail-registry"; +export { KubeObjectDetailRegistry } from "../../extensions/registries/kube-object-detail-registry"; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 62430ac788..0a59d06928 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -43,6 +43,7 @@ import { ThemeStore } from "./theme.store"; import { HelmRepoManager } from "../main/helm/helm-repo-manager"; import { ExtensionInstallationStateStore } from "./components/+extensions/extension-install.store"; import { DefaultProps } from "./mui-base-theme"; +import { initCommandRegistry, initEntitySettingsRegistry, initKubeObjectMenuRegistry, initRegistries, initWelcomeMenuRegistry, intiKubeObjectDetailRegistry } from "./initializers"; /** * If this is a development buid, wait a second to attach @@ -74,6 +75,13 @@ export async function bootstrap(App: AppComponent) { await attachChromeDebugger(); rootElem.classList.toggle("is-mac", isMac); + initRegistries(); + initCommandRegistry(); + initEntitySettingsRegistry(); + initKubeObjectMenuRegistry(); + intiKubeObjectDetailRegistry(); + initWelcomeMenuRegistry(); + ExtensionLoader.createInstance().init(); ExtensionDiscovery.createInstance().init(); diff --git a/src/renderer/components/+apps/index.ts b/src/renderer/components/+apps/index.ts index f0fa78df03..4c8d6dfea0 100644 --- a/src/renderer/components/+apps/index.ts +++ b/src/renderer/components/+apps/index.ts @@ -20,4 +20,3 @@ */ export * from "./apps"; -export * from "./apps.command"; diff --git a/src/renderer/components/+config-autoscalers/hpa-details.tsx b/src/renderer/components/+config-autoscalers/hpa-details.tsx index 5b9cf76f97..1a6db54e78 100644 --- a/src/renderer/components/+config-autoscalers/hpa-details.tsx +++ b/src/renderer/components/+config-autoscalers/hpa-details.tsx @@ -29,11 +29,9 @@ import { Badge } from "../badge"; import { KubeObjectDetailsProps, getDetailsUrl } from "../kube-object"; import { cssNames } from "../../utils"; import { HorizontalPodAutoscaler, HpaMetricType, IHpaMetric } from "../../api/endpoints/hpa.api"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { lookupApiLink } from "../../api/kube-api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -150,20 +148,3 @@ export class HpaDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "HorizontalPodAutoscaler", - apiVersions: ["autoscaling/v2beta1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "HorizontalPodAutoscaler", - apiVersions: ["autoscaling/v2beta1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config-limit-ranges/limit-range-details.tsx b/src/renderer/components/+config-limit-ranges/limit-range-details.tsx index d4c9d18f28..8531029313 100644 --- a/src/renderer/components/+config-limit-ranges/limit-range-details.tsx +++ b/src/renderer/components/+config-limit-ranges/limit-range-details.tsx @@ -25,7 +25,6 @@ import React from "react"; import { observer } from "mobx-react"; import type { KubeObjectDetailsProps } from "../kube-object"; import { LimitPart, LimitRange, LimitRangeItem, Resource } from "../../api/endpoints/limit-range.api"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { DrawerItem } from "../drawer/drawer-item"; import { Badge } from "../badge"; @@ -108,11 +107,3 @@ export class LimitRangeDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "LimitRange", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config-maps/config-map-details.tsx b/src/renderer/components/+config-maps/config-map-details.tsx index b9dd05cfaa..f1af70047d 100644 --- a/src/renderer/components/+config-maps/config-map-details.tsx +++ b/src/renderer/components/+config-maps/config-map-details.tsx @@ -28,12 +28,10 @@ import { DrawerTitle } from "../drawer"; import { Notifications } from "../notifications"; import { Input } from "../input"; import { Button } from "../button"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { configMapsStore } from "./config-maps.store"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { ConfigMap } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -115,20 +113,3 @@ export class ConfigMapDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "ConfigMap", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "ConfigMap", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx index ddb95aa628..ad4bc41dc1 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets-details.tsx @@ -28,7 +28,6 @@ import { Badge } from "../badge"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { PodDisruptionBudget } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -74,11 +73,3 @@ export class PodDisruptionBudgetDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "PodDisruptionBudget", - apiVersions: ["policy/v1beta1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx b/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx index 662a8e26ec..cf7c505dcf 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx +++ b/src/renderer/components/+config-resource-quotas/resource-quota-details.tsx @@ -30,7 +30,6 @@ import type { ResourceQuota } from "../../api/endpoints/resource-quota.api"; import { LineProgress } from "../line-progress"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -117,11 +116,3 @@ export class ResourceQuotaDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "ResourceQuota", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config-secrets/secret-details.tsx b/src/renderer/components/+config-secrets/secret-details.tsx index 5a4aaca64e..18ea67d5f7 100644 --- a/src/renderer/components/+config-secrets/secret-details.tsx +++ b/src/renderer/components/+config-secrets/secret-details.tsx @@ -35,7 +35,6 @@ import { secretsStore } from "./secrets.store"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { Secret } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -138,11 +137,3 @@ export class SecretDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Secret", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+config/config.command.ts b/src/renderer/components/+config/config.command.ts deleted file mode 100644 index 4e660fadea..0000000000 --- a/src/renderer/components/+config/config.command.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2021 OpenLens Authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import * as routes from "../../../common/routes"; - -commandRegistry.add({ - id: "cluster.viewConfigMaps", - title: "Cluster: View ConfigMaps", - scope: "entity", - action: () => navigate(routes.configMapsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewSecrets", - title: "Cluster: View Secrets", - scope: "entity", - action: () => navigate(routes.secretsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewResourceQuotas", - title: "Cluster: View ResourceQuotas", - scope: "entity", - action: () => navigate(routes.resourceQuotaURL()) -}); - -commandRegistry.add({ - id: "cluster.viewLimitRanges", - title: "Cluster: View LimitRanges", - scope: "entity", - action: () => navigate(routes.limitRangeURL()) -}); - -commandRegistry.add({ - id: "cluster.viewHorizontalPodAutoscalers", - title: "Cluster: View HorizontalPodAutoscalers (HPA)", - scope: "entity", - action: () => navigate(routes.hpaURL()) -}); - -commandRegistry.add({ - id: "cluster.viewPodDisruptionBudget", - title: "Cluster: View PodDisruptionBudgets", - scope: "entity", - action: () => navigate(routes.pdbURL()) -}); diff --git a/src/renderer/components/+config/index.ts b/src/renderer/components/+config/index.ts index 0d30c3f64a..521bf1d3a1 100644 --- a/src/renderer/components/+config/index.ts +++ b/src/renderer/components/+config/index.ts @@ -20,4 +20,3 @@ */ export * from "./config"; -export * from "./config.command"; diff --git a/src/renderer/components/+custom-resources/crd-details.tsx b/src/renderer/components/+custom-resources/crd-details.tsx index 757f389702..74fa17b4f5 100644 --- a/src/renderer/components/+custom-resources/crd-details.tsx +++ b/src/renderer/components/+custom-resources/crd-details.tsx @@ -33,7 +33,6 @@ import type { KubeObjectDetailsProps } from "../kube-object"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { Input } from "../input"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -156,11 +155,3 @@ export class CRDDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "CustomResourceDefinition", - apiVersions: ["apiextensions.k8s.io/v1", "apiextensions.k8s.io/v1beta1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+entity-settings/entity-settings.tsx b/src/renderer/components/+entity-settings/entity-settings.tsx index 0a6e98ab5e..7d3ba6652e 100644 --- a/src/renderer/components/+entity-settings/entity-settings.tsx +++ b/src/renderer/components/+entity-settings/entity-settings.tsx @@ -30,7 +30,7 @@ import { navigation } from "../../navigation"; import { Tabs, Tab } from "../tabs"; import type { CatalogEntity } from "../../api/catalog-entity"; import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; -import { entitySettingRegistry } from "../../../extensions/registries"; +import { EntitySettingRegistry } from "../../../extensions/registries"; import type { EntitySettingsRouteParams } from "../../../common/routes"; interface Props extends RouteComponentProps { @@ -51,7 +51,7 @@ export class EntitySettings extends React.Component { get menuItems() { if (!this.entity) return []; - return entitySettingRegistry.getItemsForKind(this.entity.kind, this.entity.apiVersion, this.entity.metadata.source); + return EntitySettingRegistry.getInstance().getItemsForKind(this.entity.kind, this.entity.apiVersion, this.entity.metadata.source); } async componentDidMount() { diff --git a/src/renderer/components/+events/event-details.tsx b/src/renderer/components/+events/event-details.tsx index ec50373964..639c4b9dcf 100644 --- a/src/renderer/components/+events/event-details.tsx +++ b/src/renderer/components/+events/event-details.tsx @@ -31,7 +31,6 @@ import type { KubeEvent } from "../../api/endpoints/events.api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { lookupApiLink } from "../../api/kube-api"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { LocaleDate } from "../locale-date"; interface Props extends KubeObjectDetailsProps { @@ -95,11 +94,3 @@ export class EventDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Event", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+namespaces/namespace-details.tsx b/src/renderer/components/+namespaces/namespace-details.tsx index d8e5e90f7b..28248a3ce7 100644 --- a/src/renderer/components/+namespaces/namespace-details.tsx +++ b/src/renderer/components/+namespaces/namespace-details.tsx @@ -32,7 +32,6 @@ import { Link } from "react-router-dom"; import { Spinner } from "../spinner"; import { resourceQuotaStore } from "../+config-resource-quotas/resource-quotas.store"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { limitRangeStore } from "../+config-limit-ranges/limit-ranges.store"; interface Props extends KubeObjectDetailsProps { @@ -95,11 +94,3 @@ export class NamespaceDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Namespace", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+network-endpoints/endpoint-details.tsx b/src/renderer/components/+network-endpoints/endpoint-details.tsx index d8cc20f529..8554a4b2f7 100644 --- a/src/renderer/components/+network-endpoints/endpoint-details.tsx +++ b/src/renderer/components/+network-endpoints/endpoint-details.tsx @@ -24,12 +24,10 @@ import "./endpoint-details.scss"; import React from "react"; import { observer } from "mobx-react"; import { DrawerTitle } from "../drawer"; -import { KubeEventDetails } from "../+events/kube-event-details"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { Endpoint } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { EndpointSubsetList } from "./endpoint-subset-list"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -54,19 +52,3 @@ export class EndpointDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Endpoints", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "Endpoints", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+network-ingresses/ingress-details.tsx b/src/renderer/components/+network-ingresses/ingress-details.tsx index 8e9ddf7bb4..ae1e553fc2 100644 --- a/src/renderer/components/+network-ingresses/ingress-details.tsx +++ b/src/renderer/components/+network-ingresses/ingress-details.tsx @@ -27,13 +27,11 @@ import { reaction } from "mobx"; import { DrawerItem, DrawerTitle } from "../drawer"; import type { ILoadBalancerIngress, Ingress } from "../../api/endpoints"; import { Table, TableCell, TableHead, TableRow } from "../table"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { ingressStore } from "./ingress.store"; import { ResourceMetrics } from "../resource-metrics"; import type { KubeObjectDetailsProps } from "../kube-object"; import { IngressCharts } from "./ingress-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { getBackendServiceNamePort } from "../../api/endpoints/ingress.api"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -166,19 +164,3 @@ export class IngressDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Ingress", - apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "Ingress", - apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+network-policies/network-policy-details.tsx b/src/renderer/components/+network-policies/network-policy-details.tsx index 289d139fb5..7ac8f2f7bf 100644 --- a/src/renderer/components/+network-policies/network-policy-details.tsx +++ b/src/renderer/components/+network-policies/network-policy-details.tsx @@ -27,11 +27,9 @@ import { DrawerItem, DrawerTitle } from "../drawer"; import type { IPolicyEgress, IPolicyIngress, IPolicyIpBlock, IPolicySelector, NetworkPolicy } from "../../api/endpoints/network-policy.api"; import { Badge } from "../badge"; import { SubTitle } from "../layout/sub-title"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; import type { KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -172,20 +170,3 @@ export class NetworkPolicyDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "NetworkPolicy", - apiVersions: ["networking.k8s.io/v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "NetworkPolicy", - apiVersions: ["networking.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+network-services/service-details.tsx b/src/renderer/components/+network-services/service-details.tsx index f04b5687af..9a90c129fc 100644 --- a/src/renderer/components/+network-services/service-details.tsx +++ b/src/renderer/components/+network-services/service-details.tsx @@ -25,14 +25,12 @@ import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; -import { KubeEventDetails } from "../+events/kube-event-details"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { Service } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { ServicePortComponent } from "./service-port-component"; import { endpointStore } from "../+network-endpoints/endpoints.store"; import { ServiceDetailsEndpoint } from "./service-details-endpoint"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { kubeWatchApi } from "../../api/kube-watch-api"; interface Props extends KubeObjectDetailsProps { @@ -105,20 +103,3 @@ export class ServiceDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Service", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "Service", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+network/index.ts b/src/renderer/components/+network/index.ts index bfb7c13b58..3d501faf9b 100644 --- a/src/renderer/components/+network/index.ts +++ b/src/renderer/components/+network/index.ts @@ -20,4 +20,3 @@ */ export * from "./network"; -export * from "./network.command"; diff --git a/src/renderer/components/+nodes/index.ts b/src/renderer/components/+nodes/index.ts index eb9f3cd2c1..dbcdba9422 100644 --- a/src/renderer/components/+nodes/index.ts +++ b/src/renderer/components/+nodes/index.ts @@ -21,4 +21,3 @@ export * from "./nodes"; export * from "./node-details"; -export * from "./node.command"; diff --git a/src/renderer/components/+nodes/node-details.tsx b/src/renderer/components/+nodes/node-details.tsx index df98312d17..681a4f5b87 100644 --- a/src/renderer/components/+nodes/node-details.tsx +++ b/src/renderer/components/+nodes/node-details.tsx @@ -36,8 +36,6 @@ import { NodeCharts } from "./node-charts"; import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { KubeEventDetails } from "../+events/kube-event-details"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -177,20 +175,3 @@ export class NodeDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Node", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "Node", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx b/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx index eacc4f7696..abdefe9228 100644 --- a/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx +++ b/src/renderer/components/+pod-security-policies/pod-security-policy-details.tsx @@ -29,7 +29,6 @@ import type { PodSecurityPolicy } from "../../api/endpoints"; import { Badge } from "../badge"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -231,11 +230,3 @@ export class PodSecurityPolicyDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "PodSecurityPolicy", - apiVersions: ["policy/v1beta1"], - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+preferences/preferences.tsx b/src/renderer/components/+preferences/preferences.tsx index f6eda62b82..7aebeef6b2 100644 --- a/src/renderer/components/+preferences/preferences.tsx +++ b/src/renderer/components/+preferences/preferences.tsx @@ -27,7 +27,7 @@ import { computed, observable, reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { isWindows } from "../../../common/vars"; -import { appPreferenceRegistry, RegisteredAppPreference } from "../../../extensions/registries/app-preference-registry"; +import { AppPreferenceRegistry, RegisteredAppPreference } from "../../../extensions/registries/app-preference-registry"; import { UserStore } from "../../../common/user-store"; import { ThemeStore } from "../../theme.store"; import { Input } from "../input"; @@ -88,7 +88,7 @@ export class Preferences extends React.Component { }; renderNavigation() { - const extensions = appPreferenceRegistry.getItems().filter(e => !e.showInPreferencesTab); + const extensions = AppPreferenceRegistry.getInstance().getItems().filter(e => !e.showInPreferencesTab); return ( @@ -120,7 +120,7 @@ export class Preferences extends React.Component { } render() { - const extensions = appPreferenceRegistry.getItems(); + const extensions = AppPreferenceRegistry.getInstance().getItems(); const telemetryExtensions = extensions.filter(e => e.showInPreferencesTab == Pages.Telemetry); const defaultShell = process.env.SHELL || process.env.PTYSHELL diff --git a/src/renderer/components/+storage-classes/storage-class-details.tsx b/src/renderer/components/+storage-classes/storage-class-details.tsx index e99501b963..0d2b9e0600 100644 --- a/src/renderer/components/+storage-classes/storage-class-details.tsx +++ b/src/renderer/components/+storage-classes/storage-class-details.tsx @@ -25,12 +25,10 @@ import React from "react"; import startCase from "lodash/startCase"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { StorageClass } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { storageClassStore } from "./storage-class.store"; import { VolumeDetailsList } from "../+storage-volumes/volume-details-list"; import { volumesStore } from "../+storage-volumes/volumes.store"; @@ -89,20 +87,3 @@ export class StorageClassDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "StorageClass", - apiVersions: ["storage.k8s.io/v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "StorageClass", - apiVersions: ["storage.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx index c2ae2f672f..271fae5ead 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx @@ -28,13 +28,11 @@ import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; import { podsStore } from "../+workloads-pods/pods.store"; import { Link } from "react-router-dom"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { volumeClaimStore } from "./volume-claim.store"; import { ResourceMetrics } from "../resource-metrics"; import { VolumeClaimDiskChart } from "./volume-claim-disk-chart"; import { getDetailsUrl, KubeObjectDetailsProps, KubeObjectMeta } from "../kube-object"; import type { PersistentVolumeClaim } from "../../api/endpoints"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -116,20 +114,3 @@ export class PersistentVolumeClaimDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "PersistentVolumeClaim", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "PersistentVolumeClaim", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+storage-volumes/volume-details.tsx b/src/renderer/components/+storage-volumes/volume-details.tsx index ff718b4352..66354db988 100644 --- a/src/renderer/components/+storage-volumes/volume-details.tsx +++ b/src/renderer/components/+storage-volumes/volume-details.tsx @@ -27,11 +27,9 @@ import { Link } from "react-router-dom"; import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { PersistentVolume, pvcApi } from "../../api/endpoints"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -121,20 +119,3 @@ export class PersistentVolumeDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "PersistentVolume", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "PersistentVolume", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx index c42cdbebed..5b08893f25 100644 --- a/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx +++ b/src/renderer/components/+user-management-roles-bindings/role-binding-details.tsx @@ -28,14 +28,12 @@ import { autobind, prevDefault } from "../../utils"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { ConfirmDialog } from "../confirm-dialog"; import { DrawerTitle } from "../drawer"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { disposeOnUnmount, observer } from "mobx-react"; import { observable, reaction } from "mobx"; import { roleBindingsStore } from "./role-bindings.store"; import { AddRoleBindingDialog } from "./add-role-binding-dialog"; import type { KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -145,36 +143,3 @@ export class RoleBindingDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "RoleBinding", - apiVersions: ["rbac.authorization.k8s.io/v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "RoleBinding", - apiVersions: ["rbac.authorization.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); - - -kubeObjectDetailRegistry.add({ - kind: "ClusterRoleBinding", - apiVersions: ["rbac.authorization.k8s.io/v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "ClusterRoleBinding", - apiVersions: ["rbac.authorization.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+user-management-roles/role-details.tsx b/src/renderer/components/+user-management-roles/role-details.tsx index 34fb92f816..0807944915 100644 --- a/src/renderer/components/+user-management-roles/role-details.tsx +++ b/src/renderer/components/+user-management-roles/role-details.tsx @@ -23,12 +23,10 @@ import "./role-details.scss"; import React from "react"; import { DrawerTitle } from "../drawer"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { observer } from "mobx-react"; import type { KubeObjectDetailsProps } from "../kube-object"; import type { Role } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -85,35 +83,3 @@ export class RoleDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Role", - apiVersions: ["rbac.authorization.k8s.io/v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "Role", - apiVersions: ["rbac.authorization.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "ClusterRole", - apiVersions: ["rbac.authorization.k8s.io/v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "ClusterRole", - apiVersions: ["rbac.authorization.k8s.io/v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx index d168398d76..59628be7fa 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts-details.tsx @@ -30,11 +30,9 @@ import { disposeOnUnmount, observer } from "mobx-react"; import { secretsStore } from "../+config-secrets/secrets.store"; import { Link } from "react-router-dom"; import { Secret, ServiceAccount } from "../../api/endpoints"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { Icon } from "../icon"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -158,19 +156,3 @@ export class ServiceAccountsDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "ServiceAccount", - apiVersions: ["v1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "ServiceAccount", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx index 0299e0f7f9..624360c2ff 100644 --- a/src/renderer/components/+user-management-service-accounts/service-accounts.tsx +++ b/src/renderer/components/+user-management-service-accounts/service-accounts.tsx @@ -25,16 +25,14 @@ import React from "react"; import { observer } from "mobx-react"; import type { ServiceAccount } from "../../api/endpoints/service-accounts.api"; import type { RouteComponentProps } from "react-router"; -import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; -import { MenuItem } from "../menu"; -import { openServiceAccountKubeConfig } from "../kubeconfig-dialog"; -import { Icon } from "../icon"; -import { KubeObjectListLayout } from "../kube-object"; +import { KubeObjectListLayout, KubeObjectMenuProps } from "../kube-object"; import { serviceAccountsStore } from "./service-accounts.store"; import { CreateServiceAccountDialog } from "./create-service-account-dialog"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import type { ServiceAccountsRouteParams } from "../../../common/routes"; +import { MenuItem } from "../menu"; +import { Icon } from "../icon"; +import { openServiceAccountKubeConfig } from "../kubeconfig-dialog"; enum columnId { name = "name", @@ -89,21 +87,13 @@ export class ServiceAccounts extends React.Component { } } -function ServiceAccountMenu(props: KubeObjectMenuProps) { +export function ServiceAccountMenu(props: KubeObjectMenuProps) { const { object, toolbar } = props; return ( openServiceAccountKubeConfig(object)}> - + Kubeconfig ); } - -kubeObjectMenuRegistry.add({ - kind: "ServiceAccount", - apiVersions: ["v1"], - components: { - MenuItem: ServiceAccountMenu - } -}); diff --git a/src/renderer/components/+welcome/welcome.tsx b/src/renderer/components/+welcome/welcome.tsx index 6157798942..ed3d9b5dc4 100644 --- a/src/renderer/components/+welcome/welcome.tsx +++ b/src/renderer/components/+welcome/welcome.tsx @@ -24,33 +24,10 @@ import React from "react"; import { observer } from "mobx-react"; import { Icon } from "../icon"; import { productName, slackUrl } from "../../../common/vars"; -import { welcomeMenuRegistry } from "../../../extensions/registries"; -import { navigate } from "../../navigation"; -import { catalogURL, preferencesURL } from "../../../common/routes"; +import { WelcomeMenuRegistry } from "../../../extensions/registries"; @observer export class Welcome extends React.Component { - - componentDidMount() { - if (welcomeMenuRegistry.getItems().find((item) => item.title === "Browse Your Catalog")) { - return; - } - - welcomeMenuRegistry.add({ - title: "Browse Your Catalog", - icon: "view_list", - click: () => navigate(catalogURL()) - }); - - if (welcomeMenuRegistry.getItems().length === 1) { - welcomeMenuRegistry.add({ - title: "Configure Preferences", - icon: "settings", - click: () => navigate(preferencesURL()) - }); - } - } - render() { return (
@@ -65,7 +42,7 @@ export class Welcome extends React.Component {

    - { welcomeMenuRegistry.getItems().map((item, index) => ( + {WelcomeMenuRegistry.getInstance().getItems().map((item, index) => (
  • item.click()}> {typeof item.title === "string" ? item.title : item.title()}
  • diff --git a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx index e86f4f5c8e..12f919b4e6 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx @@ -28,12 +28,10 @@ import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge/badge"; import { jobStore } from "../+workloads-jobs/job.store"; import { Link } from "react-router-dom"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { cronJobStore } from "./cronjob.store"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import type { CronJob, Job } from "../../api/endpoints"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -105,19 +103,3 @@ export class CronJobDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "CronJob", - apiVersions: ["batch/v1beta1"], - components: { - Details: (props) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "CronJob", - apiVersions: ["batch/v1beta1"], - priority: 5, - components: { - Details: (props) => - } -}); diff --git a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx index 64690422d0..df976a187b 100644 --- a/src/renderer/components/+workloads-cronjobs/cronjobs.tsx +++ b/src/renderer/components/+workloads-cronjobs/cronjobs.tsx @@ -33,7 +33,6 @@ import { eventStore } from "../+events/event.store"; import type { KubeObjectMenuProps } from "../kube-object/kube-object-menu"; import { KubeObjectListLayout } from "../kube-object"; import { CronJobTriggerDialog } from "./cronjob-trigger-dialog"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { ConfirmDialog } from "../confirm-dialog/confirm-dialog"; import { Notifications } from "../notifications/notifications"; @@ -152,11 +151,3 @@ export function CronJobMenu(props: KubeObjectMenuProps) { ); } - -kubeObjectMenuRegistry.add({ - kind: "CronJob", - apiVersions: ["batch/v1beta1"], - components: { - MenuItem: CronJobMenu - } -}); diff --git a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx index 96bf692e72..0d72ee07fc 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx +++ b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx @@ -28,7 +28,6 @@ import { Badge } from "../badge"; import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { daemonSetStore } from "./daemonsets.store"; import { podsStore } from "../+workloads-pods/pods.store"; import type { KubeObjectDetailsProps } from "../kube-object"; @@ -38,7 +37,6 @@ import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -118,19 +116,3 @@ export class DaemonSetDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "DaemonSet", - apiVersions: ["apps/v1"], - components: { - Details: (props: any) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "DaemonSet", - apiVersions: ["apps/v1"], - priority: 5, - components: { - Details: (props: any) => - } -}); diff --git a/src/renderer/components/+workloads-deployments/deployment-details.tsx b/src/renderer/components/+workloads-deployments/deployment-details.tsx index 6b0387583d..e4c7d13da4 100644 --- a/src/renderer/components/+workloads-deployments/deployment-details.tsx +++ b/src/renderer/components/+workloads-deployments/deployment-details.tsx @@ -30,7 +30,6 @@ import type { Deployment } from "../../api/endpoints"; import { cssNames } from "../../utils"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; import type { KubeObjectDetailsProps } from "../kube-object"; import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; @@ -39,7 +38,6 @@ import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -136,19 +134,3 @@ export class DeploymentDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Deployment", - apiVersions: ["apps/v1"], - components: { - Details: (props: any) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "Deployment", - apiVersions: ["apps/v1"], - priority: 5, - components: { - Details: (props: any) => - } -}); diff --git a/src/renderer/components/+workloads-deployments/deployments.tsx b/src/renderer/components/+workloads-deployments/deployments.tsx index 6bca45c864..d57d5135b2 100644 --- a/src/renderer/components/+workloads-deployments/deployments.tsx +++ b/src/renderer/components/+workloads-deployments/deployments.tsx @@ -39,7 +39,6 @@ import { KubeObjectListLayout } from "../kube-object"; import { cssNames } from "../../utils"; import kebabCase from "lodash/kebabCase"; import orderBy from "lodash/orderBy"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { Notifications } from "../notifications"; import type { DeploymentsRouteParams } from "../../../common/routes"; @@ -153,11 +152,3 @@ export function DeploymentMenu(props: KubeObjectMenuProps) { ); } - -kubeObjectMenuRegistry.add({ - kind: "Deployment", - apiVersions: ["apps/v1"], - components: { - MenuItem: DeploymentMenu - } -}); diff --git a/src/renderer/components/+workloads-jobs/job-details.tsx b/src/renderer/components/+workloads-jobs/job-details.tsx index 6fcbff96e7..02cd5b41d4 100644 --- a/src/renderer/components/+workloads-jobs/job-details.tsx +++ b/src/renderer/components/+workloads-jobs/job-details.tsx @@ -30,7 +30,6 @@ import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { Link } from "react-router-dom"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; import { jobStore } from "./job.store"; import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; @@ -38,7 +37,6 @@ import type { Job } from "../../api/endpoints"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { lookupApiLink } from "../../api/kube-api"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; interface Props extends KubeObjectDetailsProps { } @@ -125,19 +123,3 @@ export class JobDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Job", - apiVersions: ["batch/v1"], - components: { - Details: (props: any) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "Job", - apiVersions: ["batch/v1"], - priority: 5, - components: { - Details: (props: any) => - } -}); diff --git a/src/renderer/components/+workloads-pods/pod-details.tsx b/src/renderer/components/+workloads-pods/pod-details.tsx index 4a67fe76d7..883db9c73c 100644 --- a/src/renderer/components/+workloads-pods/pod-details.tsx +++ b/src/renderer/components/+workloads-pods/pod-details.tsx @@ -34,7 +34,6 @@ import { PodDetailsContainer } from "./pod-details-container"; import { PodDetailsAffinities } from "./pod-details-affinities"; import { PodDetailsTolerations } from "./pod-details-tolerations"; import { Icon } from "../icon"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { PodDetailsSecrets } from "./pod-details-secrets"; import { ResourceMetrics } from "../resource-metrics"; import { podsStore } from "./pods.store"; @@ -42,7 +41,6 @@ import { getDetailsUrl, KubeObjectDetailsProps } from "../kube-object"; import { getItemMetrics } from "../../api/endpoints/metrics.api"; import { PodCharts, podMetricTabs } from "./pod-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -248,20 +246,3 @@ export class PodDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "Pod", - apiVersions: ["v1"], - components: { - Details: (props: KubeObjectDetailsProps) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "Pod", - apiVersions: ["v1"], - priority: 5, - components: { - Details: (props: KubeObjectDetailsProps) => - } -}); diff --git a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx index e02d23a3d5..432b34f6ee 100644 --- a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx +++ b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx @@ -28,7 +28,6 @@ import { replicaSetStore } from "./replicasets.store"; import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { disposeOnUnmount, observer } from "mobx-react"; import { podsStore } from "../+workloads-pods/pods.store"; import type { KubeObjectDetailsProps } from "../kube-object"; @@ -37,7 +36,6 @@ import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -118,19 +116,3 @@ export class ReplicaSetDetails extends React.Component { ); } } - -kubeObjectDetailRegistry.add({ - kind: "ReplicaSet", - apiVersions: ["apps/v1"], - components: { - Details: (props: any) => - } -}); -kubeObjectDetailRegistry.add({ - kind: "ReplicaSet", - apiVersions: ["apps/v1"], - priority: 5, - components: { - Details: (props: any) => - } -}); diff --git a/src/renderer/components/+workloads-replicasets/replicasets.tsx b/src/renderer/components/+workloads-replicasets/replicasets.tsx index 30aebb6efa..b14915e85f 100644 --- a/src/renderer/components/+workloads-replicasets/replicasets.tsx +++ b/src/renderer/components/+workloads-replicasets/replicasets.tsx @@ -31,7 +31,6 @@ import type { RouteComponentProps } from "react-router"; import { KubeObjectListLayout } from "../kube-object/kube-object-list-layout"; import { MenuItem } from "../menu/menu"; import { Icon } from "../icon/icon"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import { ReplicaSetScaleDialog } from "./replicaset-scale-dialog"; import type { ReplicaSetsRouteParams } from "../../../common/routes"; @@ -105,11 +104,3 @@ export function ReplicaSetMenu(props: KubeObjectMenuProps) { ); } - -kubeObjectMenuRegistry.add({ - kind: "ReplicaSet", - apiVersions: ["apps/v1"], - components: { - MenuItem: ReplicaSetMenu - } -}); diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx index 0342d424e9..6888962476 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx @@ -29,7 +29,6 @@ import { DrawerItem } from "../drawer"; import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { KubeEventDetails } from "../+events/kube-event-details"; import { podsStore } from "../+workloads-pods/pods.store"; import { statefulSetStore } from "./statefulset.store"; import type { KubeObjectDetailsProps } from "../kube-object"; @@ -38,7 +37,6 @@ import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { ClusterStore } from "../../../common/cluster-store"; @@ -116,21 +114,3 @@ export class StatefulSetDetails extends React.Component { ); } } - - -kubeObjectDetailRegistry.add({ - kind: "StatefulSet", - apiVersions: ["apps/v1"], - components: { - Details: (props: any) => - } -}); - -kubeObjectDetailRegistry.add({ - kind: "StatefulSet", - apiVersions: ["apps/v1"], - priority: 5, - components: { - Details: (props: any) => - } -}); diff --git a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx index 3340c30381..0431191d7d 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx @@ -35,7 +35,6 @@ import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { StatefulSetScaleDialog } from "./statefulset-scale-dialog"; import { MenuItem } from "../menu/menu"; import { Icon } from "../icon/icon"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; import type { StatefulSetsRouteParams } from "../../../common/routes"; enum columnId { @@ -110,11 +109,3 @@ export function StatefulSetMenu(props: KubeObjectMenuProps) { ); } - -kubeObjectMenuRegistry.add({ - kind: "StatefulSet", - apiVersions: ["apps/v1"], - components: { - MenuItem: StatefulSetMenu - } -}); diff --git a/src/renderer/components/+workloads/index.ts b/src/renderer/components/+workloads/index.ts index 4e0e932a51..ab4e8fa18c 100644 --- a/src/renderer/components/+workloads/index.ts +++ b/src/renderer/components/+workloads/index.ts @@ -21,4 +21,3 @@ export * from "./workloads"; export * from "./workloads.stores"; -export * from "./workloads.command"; diff --git a/src/renderer/components/+workloads/workloads.command.ts b/src/renderer/components/+workloads/workloads.command.ts deleted file mode 100644 index 2cc8895714..0000000000 --- a/src/renderer/components/+workloads/workloads.command.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2021 OpenLens Authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import * as routes from "../../../common/routes"; - -commandRegistry.add({ - id: "cluster.viewPods", - title: "Cluster: View Pods", - scope: "entity", - action: () => navigate(routes.podsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewDeployments", - title: "Cluster: View Deployments", - scope: "entity", - action: () => navigate(routes.deploymentsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewDaemonSets", - title: "Cluster: View DaemonSets", - scope: "entity", - action: () => navigate(routes.daemonSetsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewStatefulSets", - title: "Cluster: View StatefulSets", - scope: "entity", - action: () => navigate(routes.statefulSetsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewJobs", - title: "Cluster: View Jobs", - scope: "entity", - action: () => navigate(routes.jobsURL()) -}); - -commandRegistry.add({ - id: "cluster.viewCronJobs", - title: "Cluster: View CronJobs", - scope: "entity", - action: () => navigate(routes.cronJobsURL()) -}); diff --git a/src/renderer/components/app.tsx b/src/renderer/components/app.tsx index 27c5f3e7f4..e0dc16a47c 100755 --- a/src/renderer/components/app.tsx +++ b/src/renderer/components/app.tsx @@ -50,13 +50,13 @@ import { Terminal } from "./dock/terminal"; import { getHostedCluster, getHostedClusterId } from "../../common/cluster-store"; import logger from "../../main/logger"; import { webFrame } from "electron"; -import { clusterPageRegistry, getExtensionPageUrl } from "../../extensions/registries/page-registry"; +import { ClusterPageRegistry, getExtensionPageUrl } from "../../extensions/registries/page-registry"; import { ExtensionLoader } from "../../extensions/extension-loader"; import { appEventBus } from "../../common/event-bus"; import { requestMain } from "../../common/ipc"; import whatInput from "what-input"; import { clusterSetFrameIdHandler } from "../../common/cluster-ipc"; -import { ClusterPageMenuRegistration, clusterPageMenuRegistry } from "../../extensions/registries"; +import { ClusterPageMenuRegistration, ClusterPageMenuRegistry } from "../../extensions/registries"; import { TabLayout, TabLayoutRoute } from "./layout/tab-layout"; import { StatefulSetScaleDialog } from "./+workloads-statefulsets/statefulset-scale-dialog"; import { eventStore } from "./+events/event.store"; @@ -117,8 +117,8 @@ export class App extends React.Component { if (!menuItem.id) { return routes; } - clusterPageMenuRegistry.getSubItems(menuItem).forEach((subMenu) => { - const page = clusterPageRegistry.getByPageTarget(subMenu.target); + ClusterPageMenuRegistry.getInstance().getSubItems(menuItem).forEach((subMenu) => { + const page = ClusterPageRegistry.getInstance().getByPageTarget(subMenu.target); if (page) { routes.push({ @@ -134,7 +134,7 @@ export class App extends React.Component { } renderExtensionTabLayoutRoutes() { - return clusterPageMenuRegistry.getRootItems().map((menu, index) => { + return ClusterPageMenuRegistry.getInstance().getRootItems().map((menu, index) => { const tabRoutes = this.getTabLayoutRoutes(menu); if (tabRoutes.length > 0) { @@ -142,7 +142,7 @@ export class App extends React.Component { return tab.routePath)}/>; } else { - const page = clusterPageRegistry.getByPageTarget(menu.target); + const page = ClusterPageRegistry.getInstance().getByPageTarget(menu.target); if (page) { return ; @@ -154,8 +154,8 @@ export class App extends React.Component { } renderExtensionRoutes() { - return clusterPageRegistry.getItems().map((page, index) => { - const menu = clusterPageMenuRegistry.getByPage(page); + return ClusterPageRegistry.getInstance().getItems().map((page, index) => { + const menu = ClusterPageMenuRegistry.getInstance().getByPage(page); if (!menu) { return ; diff --git a/src/renderer/components/cluster-manager/bottom-bar.test.tsx b/src/renderer/components/cluster-manager/bottom-bar.test.tsx index eceb02697a..73974de604 100644 --- a/src/renderer/components/cluster-manager/bottom-bar.test.tsx +++ b/src/renderer/components/cluster-manager/bottom-bar.test.tsx @@ -31,9 +31,17 @@ jest.mock("electron", () => ({ import { BottomBar } from "./bottom-bar"; jest.mock("../../../extensions/registries"); -import { statusBarRegistry } from "../../../extensions/registries"; +import { StatusBarRegistry } from "../../../extensions/registries"; describe("", () => { + beforeEach(() => { + StatusBarRegistry.createInstance(); + }); + + afterEach(() => { + StatusBarRegistry.resetInstance(); + }); + it("renders w/o errors", () => { const { container } = render(); @@ -41,19 +49,19 @@ describe("", () => { }); it("renders w/o errors when .getItems() returns unexpected (not type complient) data", async () => { - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => undefined); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => undefined); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => "hello"); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => "hello"); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => 6); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => 6); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => null); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => null); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => []); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => []); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => [{}]); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => [{}]); expect(() => render()).not.toThrow(); - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => { return {};}); + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => { return {};}); expect(() => render()).not.toThrow(); }); @@ -61,7 +69,7 @@ describe("", () => { const testId = "testId"; const text = "heee"; - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => [ + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => [ { item: {text} } ]); const { getByTestId } = render(); @@ -73,7 +81,7 @@ describe("", () => { const testId = "testId"; const text = "heee"; - statusBarRegistry.getItems = jest.fn().mockImplementationOnce(() => [ + StatusBarRegistry.getInstance().getItems = jest.fn().mockImplementationOnce(() => [ { item: () => {text} } ]); const { getByTestId } = render(); diff --git a/src/renderer/components/cluster-manager/bottom-bar.tsx b/src/renderer/components/cluster-manager/bottom-bar.tsx index 19c2379824..8e37128198 100644 --- a/src/renderer/components/cluster-manager/bottom-bar.tsx +++ b/src/renderer/components/cluster-manager/bottom-bar.tsx @@ -23,7 +23,7 @@ import "./bottom-bar.scss"; import React from "react"; import { observer } from "mobx-react"; -import { StatusBarRegistration, statusBarRegistry } from "../../../extensions/registries"; +import { StatusBarRegistration, StatusBarRegistry } from "../../../extensions/registries"; import { navigate } from "../../navigation"; import { Icon } from "../icon"; import { catalogURL } from "../../../common/routes"; @@ -41,7 +41,7 @@ export class BottomBar extends React.Component { } renderRegisteredItems() { - const items = statusBarRegistry.getItems(); + const items = StatusBarRegistry.getInstance().getItems(); if (!Array.isArray(items)) { return null; diff --git a/src/renderer/components/cluster-manager/cluster-manager.tsx b/src/renderer/components/cluster-manager/cluster-manager.tsx index 2fc4d1d2a9..4bd14e7805 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.tsx +++ b/src/renderer/components/cluster-manager/cluster-manager.tsx @@ -29,7 +29,7 @@ import { Catalog } from "../+catalog"; import { Preferences } from "../+preferences"; import { AddCluster } from "../+add-cluster"; import { ClusterView } from "./cluster-view"; -import { globalPageRegistry } from "../../../extensions/registries/page-registry"; +import { GlobalPageRegistry } from "../../../extensions/registries/page-registry"; import { Extensions } from "../+extensions"; import { HotbarMenu } from "../hotbar/hotbar-menu"; import { EntitySettings } from "../+entity-settings"; @@ -52,7 +52,7 @@ export class ClusterManager extends React.Component { { - globalPageRegistry.getItems() + GlobalPageRegistry.getInstance().getItems() .map(({ url, components: { Page } }) => ( )) diff --git a/src/renderer/components/cluster-settings/cluster-settings.tsx b/src/renderer/components/cluster-settings/cluster-settings.tsx index 505e13f60c..32190df9bc 100644 --- a/src/renderer/components/cluster-settings/cluster-settings.tsx +++ b/src/renderer/components/cluster-settings/cluster-settings.tsx @@ -21,135 +21,93 @@ import React from "react"; import { ClusterStore } from "../../../common/cluster-store"; -import { ClusterProxySetting } from "./components/cluster-proxy-setting"; -import { ClusterNameSetting } from "./components/cluster-name-setting"; -import { ClusterHomeDirSetting } from "./components/cluster-home-dir-setting"; -import { ClusterAccessibleNamespaces } from "./components/cluster-accessible-namespaces"; -import { ClusterMetricsSetting } from "./components/cluster-metrics-setting"; -import { ShowMetricsSetting } from "./components/show-metrics"; -import { ClusterPrometheusSetting } from "./components/cluster-prometheus-setting"; -import { ClusterKubeconfig } from "./components/cluster-kubeconfig"; -import { entitySettingRegistry } from "../../../extensions/registries"; +import type { EntitySettingViewProps } from "../../../extensions/registries"; import type { CatalogEntity } from "../../api/catalog-entity"; - +import * as components from "./components"; function getClusterForEntity(entity: CatalogEntity) { return ClusterStore.getInstance().getById(entity.metadata.uid); } -entitySettingRegistry.add([ - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - source: "local", - title: "General", - components: { - View: (props: { entity: CatalogEntity }) => { - const cluster = getClusterForEntity(props.entity); +export function GeneralSettings({ entity }: EntitySettingViewProps) { + const cluster = getClusterForEntity(entity); - if (!cluster) { - return null; - } - - return ( -
    -
    - -
    -
    - -
    -
    - ); - } - } - }, - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - title: "Proxy", - components: { - View: (props: { entity: CatalogEntity }) => { - const cluster = getClusterForEntity(props.entity); - - if (!cluster) { - return null; - } - - return ( -
    - -
    - ); - } - } - }, - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - title: "Terminal", - components: { - View: (props: { entity: CatalogEntity }) => { - const cluster = getClusterForEntity(props.entity); - - if (!cluster) { - return null; - } - - return ( -
    - -
    - ); - } - } - }, - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - title: "Namespaces", - components: { - View: (props: { entity: CatalogEntity }) => { - const cluster = getClusterForEntity(props.entity); - - if (!cluster) { - return null; - } - - return ( -
    - -
    - ); - } - } - }, - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - title: "Metrics", - components: { - View: (props: { entity: CatalogEntity }) => { - const cluster = getClusterForEntity(props.entity); - - if (!cluster) { - return null; - } - - return ( -
    -
    - -
    -
    - -
    -
    - -
    -
    - ); - } - } + if (!cluster) { + return null; } -]); + + return ( +
    +
    + +
    +
    + +
    +
    + ); +} + +export function ProxySettings({ entity }: EntitySettingViewProps) { + const cluster = getClusterForEntity(entity); + + if (!cluster) { + return null; + } + + return ( +
    + +
    + ); +} + +export function TerminalSettings({ entity }: EntitySettingViewProps) { + const cluster = getClusterForEntity(entity); + + if (!cluster) { + return null; + } + + return ( +
    + +
    + ); +} + +export function NamespacesSettings({ entity }: EntitySettingViewProps) { + const cluster = getClusterForEntity(entity); + + if (!cluster) { + return null; + } + + return ( +
    + +
    + ); +} + +export function MetricsSettings({ entity }: EntitySettingViewProps) { + const cluster = getClusterForEntity(entity); + + if (!cluster) { + return null; + } + + return ( +
    +
    + +
    +
    + +
    +
    + +
    +
    + ); +} diff --git a/src/renderer/components/cluster-settings/components/show-metrics.tsx b/src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx similarity index 100% rename from src/renderer/components/cluster-settings/components/show-metrics.tsx rename to src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx diff --git a/src/renderer/components/cluster-settings/components/index.ts b/src/renderer/components/cluster-settings/components/index.ts new file mode 100644 index 0000000000..66a64def62 --- /dev/null +++ b/src/renderer/components/cluster-settings/components/index.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +export * from "./cluster-accessible-namespaces"; +export * from "./cluster-home-dir-setting"; +export * from "./cluster-kubeconfig"; +export * from "./cluster-metrics-setting"; +export * from "./cluster-name-setting"; +export * from "./cluster-prometheus-setting"; +export * from "./cluster-proxy-setting"; +export * from "./cluster-show-metrics"; diff --git a/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx b/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx deleted file mode 100644 index b1213fb2d7..0000000000 --- a/src/renderer/components/cluster-settings/components/remove-cluster-button.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2021 OpenLens Authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -import React from "react"; -import { observer } from "mobx-react"; -import { ClusterStore } from "../../../../common/cluster-store"; -import type { Cluster } from "../../../../main/cluster"; -import { autobind } from "../../../utils"; -import { Button } from "../../button"; -import { ConfirmDialog } from "../../confirm-dialog"; - -interface Props { - cluster: Cluster; -} - -@observer -export class RemoveClusterButton extends React.Component { - @autobind() - confirmRemoveCluster() { - const { cluster } = this.props; - - ConfirmDialog.open({ - message:

    Are you sure you want to remove {cluster.preferences.clusterName} from Lens?

    , - labelOk: "Yes", - labelCancel: "No", - ok: async () => { - await ClusterStore.getInstance().removeById(cluster.id); - } - }); - } - - render() { - return ( - - ); - } -} diff --git a/src/renderer/components/cluster-settings/index.ts b/src/renderer/components/cluster-settings/index.ts index 752856c9ed..f69a8e86f5 100644 --- a/src/renderer/components/cluster-settings/index.ts +++ b/src/renderer/components/cluster-settings/index.ts @@ -20,4 +20,3 @@ */ export * from "./cluster-settings"; -export * from "./cluster-settings.command"; diff --git a/src/renderer/components/command-palette/command-container.tsx b/src/renderer/components/command-palette/command-container.tsx index c2e98d3218..419e4ef370 100644 --- a/src/renderer/components/command-palette/command-container.tsx +++ b/src/renderer/components/command-palette/command-container.tsx @@ -28,7 +28,7 @@ import { Dialog } from "../dialog"; import { EventEmitter } from "../../../common/event-emitter"; import { subscribeToBroadcast } from "../../../common/ipc"; import { CommandDialog } from "./command-dialog"; -import { CommandRegistration, commandRegistry } from "../../../extensions/registries/command-registry"; +import { CommandRegistration, CommandRegistry } from "../../../extensions/registries/command-registry"; export type CommandDialogEvent = { component: React.ReactElement @@ -63,12 +63,12 @@ export class CommandContainer extends React.Component<{ clusterId?: string }> { } private findCommandById(commandId: string) { - return commandRegistry.getItems().find((command) => command.id === commandId); + return CommandRegistry.getInstance().getItems().find((command) => command.id === commandId); } private runCommand(command: CommandRegistration) { command.action({ - entity: commandRegistry.activeEntity + entity: CommandRegistry.getInstance().activeEntity }); } diff --git a/src/renderer/components/command-palette/command-dialog.tsx b/src/renderer/components/command-palette/command-dialog.tsx index bfd401ea0c..0ed4b24716 100644 --- a/src/renderer/components/command-palette/command-dialog.tsx +++ b/src/renderer/components/command-palette/command-dialog.tsx @@ -24,7 +24,7 @@ import { Select } from "../select"; import { computed, observable, toJS } from "mobx"; import { observer } from "mobx-react"; import React from "react"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; +import { CommandRegistry } from "../../../extensions/registries/command-registry"; import { ClusterStore } from "../../../common/cluster-store"; import { CommandOverlay } from "./command-container"; import { broadcastMessage } from "../../../common/ipc"; @@ -36,33 +36,40 @@ export class CommandDialog extends React.Component { @observable menuIsOpen = true; @computed get options() { + const registry = CommandRegistry.getInstance(); + const context = { - entity: commandRegistry.activeEntity + entity: registry.activeEntity }; - return commandRegistry.getItems().filter((command) => { - if (command.scope === "entity" && !ClusterStore.getInstance().active) { - return false; - } + return registry.getItems() + .filter((command) => { + if (command.scope === "entity" && !ClusterStore.getInstance().active) { + return false; + } - if (!command.isActive) { - return true; - } + if (!command.isActive) { + return true; + } - try { - return command.isActive(context); - } catch(e) { - console.error(e); + try { + return command.isActive(context); + } catch(e) { + console.error(e); - return false; - } - }).map((command) => { - return { value: command.id, label: command.title }; - }).sort((a, b) => a.label > b.label ? 1 : -1); + return false; + } + }) + .map((command) => ({ + value: command.id, + label: command.title, + })) + .sort((a, b) => a.label > b.label ? 1 : -1); } private onChange(value: string) { - const command = commandRegistry.getItems().find((cmd) => cmd.id === value); + const registry = CommandRegistry.getInstance(); + const command = registry.getItems().find((cmd) => cmd.id === value); if (!command) { return; @@ -75,15 +82,15 @@ export class CommandDialog extends React.Component { if (command.scope === "global") { action({ - entity: commandRegistry.activeEntity + entity: registry.activeEntity }); - } else if(commandRegistry.activeEntity) { + } else if(registry.activeEntity) { navigate(clusterViewURL({ params: { - clusterId: commandRegistry.activeEntity.metadata.uid + clusterId: registry.activeEntity.metadata.uid } })); - broadcastMessage(`command-palette:run-action:${commandRegistry.activeEntity.metadata.uid}`, command.id); + broadcastMessage(`command-palette:run-action:${registry.activeEntity.metadata.uid}`, command.id); } } catch(error) { console.error("[COMMAND-DIALOG] failed to execute command", command.id, error); diff --git a/src/renderer/components/dock/dock.tsx b/src/renderer/components/dock/dock.tsx index 21e167ac8c..c3c4ca520b 100644 --- a/src/renderer/components/dock/dock.tsx +++ b/src/renderer/components/dock/dock.tsx @@ -39,7 +39,6 @@ import { Logs } from "./logs"; import { TerminalWindow } from "./terminal-window"; import { createTerminalTab } from "./terminal.store"; import { UpgradeChart } from "./upgrade-chart"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; interface Props { className?: string; @@ -161,11 +160,3 @@ export class Dock extends React.Component { ); } } - -commandRegistry.add({ - id: "cluster.openTerminal", - title: "Cluster: Open terminal", - scope: "entity", - action: () => createTerminalTab(), - isActive: (context) => !!context.entity -}); diff --git a/src/renderer/components/hotbar/hotbar-cell.tsx b/src/renderer/components/hotbar/hotbar-cell.tsx index e3328dcbed..8fd703f7a9 100644 --- a/src/renderer/components/hotbar/hotbar-cell.tsx +++ b/src/renderer/components/hotbar/hotbar-cell.tsx @@ -19,7 +19,6 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import "./hotbar-menu.scss"; -import "./hotbar.commands"; import React, { HTMLAttributes, ReactNode, useState } from "react"; diff --git a/src/renderer/components/hotbar/hotbar-menu.tsx b/src/renderer/components/hotbar/hotbar-menu.tsx index 319b05f946..7df6eb8fe4 100644 --- a/src/renderer/components/hotbar/hotbar-menu.tsx +++ b/src/renderer/components/hotbar/hotbar-menu.tsx @@ -20,7 +20,6 @@ */ import "./hotbar-menu.scss"; -import "./hotbar.commands"; import React from "react"; import { observer } from "mobx-react"; diff --git a/src/renderer/components/hotbar/hotbar.commands.tsx b/src/renderer/components/hotbar/hotbar.commands.tsx deleted file mode 100644 index 399970cd68..0000000000 --- a/src/renderer/components/hotbar/hotbar.commands.tsx +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2021 OpenLens Authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -import React from "react"; -import { commandRegistry } from "../../../extensions/registries"; -import { CommandOverlay } from "../command-palette"; -import { HotbarAddCommand } from "./hotbar-add-command"; -import { HotbarRemoveCommand } from "./hotbar-remove-command"; -import { HotbarSwitchCommand } from "./hotbar-switch-command"; - -commandRegistry.add({ - id: "hotbar.switchHotbar", - title: "Hotbar: Switch ...", - scope: "global", - action: () => CommandOverlay.open() -}); - -commandRegistry.add({ - id: "hotbar.addHotbar", - title: "Hotbar: Add Hotbar ...", - scope: "global", - action: () => CommandOverlay.open() -}); - -commandRegistry.add({ - id: "hotbar.removeHotbar", - title: "Hotbar: Remove Hotbar ...", - scope: "global", - action: () => CommandOverlay.open() -}); diff --git a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx index bf700b871c..ebde73f894 100644 --- a/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx +++ b/src/renderer/components/kube-object-status-icon/kube-object-status-icon.tsx @@ -25,7 +25,7 @@ import React from "react"; import { Icon } from "../icon"; import { cssNames, formatDuration } from "../../utils"; import { KubeObject, KubeObjectStatus, KubeObjectStatusLevel } from "../../..//extensions/renderer-api/k8s-api"; -import { kubeObjectStatusRegistry } from "../../../extensions/registries"; +import { KubeObjectStatusRegistry } from "../../../extensions/registries"; function statusClassName(level: KubeObjectStatusLevel): string { switch (level) { @@ -105,7 +105,7 @@ export class KubeObjectStatusIcon extends React.Component { } render() { - const statuses = kubeObjectStatusRegistry.getItemsForObject(this.props.object); + const statuses = KubeObjectStatusRegistry.getInstance().getItemsForObject(this.props.object); if (statuses.length === 0) { return null; diff --git a/src/renderer/components/kube-object/kube-object-details.tsx b/src/renderer/components/kube-object/kube-object-details.tsx index b4cc81824c..92a17e08e9 100644 --- a/src/renderer/components/kube-object/kube-object-details.tsx +++ b/src/renderer/components/kube-object/kube-object-details.tsx @@ -32,7 +32,7 @@ import { apiManager } from "../../api/api-manager"; import { crdStore } from "../+custom-resources/crd.store"; import { CrdResourceDetails } from "../+custom-resources"; import { KubeObjectMenu } from "./kube-object-menu"; -import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; +import { KubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; /** * Used to store `object.selfLink` to show more info about resource in the details panel. @@ -143,7 +143,7 @@ export class KubeObjectDetails extends React.Component { const { kind, getName } = object; title = `${kind}: ${getName()}`; - details = kubeObjectDetailRegistry.getItemsForKind(object.kind, object.apiVersion).map((item, index) => { + details = KubeObjectDetailRegistry.getInstance().getItemsForKind(object.kind, object.apiVersion).map((item, index) => { return ; }); diff --git a/src/renderer/components/kube-object/kube-object-menu.tsx b/src/renderer/components/kube-object/kube-object-menu.tsx index b2c26ef9ff..013c1a4ca1 100644 --- a/src/renderer/components/kube-object/kube-object-menu.tsx +++ b/src/renderer/components/kube-object/kube-object-menu.tsx @@ -26,7 +26,7 @@ import { editResourceTab } from "../dock/edit-resource.store"; import { MenuActions, MenuActionsProps } from "../menu/menu-actions"; import { hideDetails } from "./kube-object-details"; import { apiManager } from "../../api/api-manager"; -import { kubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; +import { KubeObjectMenuRegistry } from "../../../extensions/registries/kube-object-menu-registry"; export interface KubeObjectMenuProps extends MenuActionsProps { object: T | null | undefined; @@ -88,7 +88,8 @@ export class KubeObjectMenu extends React.Component ( { return routes; } - clusterPageMenuRegistry.getSubItems(menu).forEach((subMenu) => { - const subPage = clusterPageRegistry.getByPageTarget(subMenu.target); + ClusterPageMenuRegistry.getInstance().getSubItems(menu).forEach((subMenu) => { + const subPage = ClusterPageRegistry.getInstance().getByPageTarget(subMenu.target); if (subPage) { const { extensionId, id: pageId } = subPage; @@ -131,8 +131,8 @@ export class Sidebar extends React.Component { } renderRegisteredMenus() { - return clusterPageMenuRegistry.getRootItems().map((menuItem, index) => { - const registeredPage = clusterPageRegistry.getByPageTarget(menuItem.target); + return ClusterPageMenuRegistry.getInstance().getRootItems().map((menuItem, index) => { + const registeredPage = ClusterPageRegistry.getInstance().getByPageTarget(menuItem.target); const tabRoutes = this.getTabLayoutRoutes(menuItem); const id = `registered-item-${index}`; let pageUrl: string; diff --git a/src/renderer/initializers/command-registry.tsx b/src/renderer/initializers/command-registry.tsx new file mode 100644 index 0000000000..94b9acfea2 --- /dev/null +++ b/src/renderer/initializers/command-registry.tsx @@ -0,0 +1,187 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import React from "react"; +import { ClusterStore } from "../../common/cluster-store"; +import * as routes from "../../common/routes"; +import { CommandRegistry } from "../../extensions/registries"; +import { CommandOverlay } from "../components/command-palette"; +import { createTerminalTab } from "../components/dock/terminal.store"; +import { HotbarAddCommand } from "../components/hotbar/hotbar-add-command"; +import { HotbarRemoveCommand } from "../components/hotbar/hotbar-remove-command"; +import { HotbarSwitchCommand } from "../components/hotbar/hotbar-switch-command"; +import { navigate } from "../navigation"; + +export function initCommandRegistry() { + CommandRegistry.getInstance() + .add([ + { + id: "cluster.viewHelmCharts", + title: "Cluster: View Helm Charts", + scope: "entity", + action: () => navigate(routes.helmChartsURL()) + }, + { + id: "cluster.viewHelmReleases", + title: "Cluster: View Helm Releases", + scope: "entity", + action: () => navigate(routes.releaseURL()) + }, + { + id: "cluster.viewConfigMaps", + title: "Cluster: View ConfigMaps", + scope: "entity", + action: () => navigate(routes.configMapsURL()) + }, + { + id: "cluster.viewSecrets", + title: "Cluster: View Secrets", + scope: "entity", + action: () => navigate(routes.secretsURL()) + }, + { + id: "cluster.viewResourceQuotas", + title: "Cluster: View ResourceQuotas", + scope: "entity", + action: () => navigate(routes.resourceQuotaURL()) + }, + { + id: "cluster.viewLimitRanges", + title: "Cluster: View LimitRanges", + scope: "entity", + action: () => navigate(routes.limitRangeURL()) + }, + { + id: "cluster.viewHorizontalPodAutoscalers", + title: "Cluster: View HorizontalPodAutoscalers (HPA)", + scope: "entity", + action: () => navigate(routes.hpaURL()) + }, + { + id: "cluster.viewPodDisruptionBudget", + title: "Cluster: View PodDisruptionBudgets", + scope: "entity", + action: () => navigate(routes.pdbURL()) + }, + { + id: "cluster.viewServices", + title: "Cluster: View Services", + scope: "entity", + action: () => navigate(routes.servicesURL()) + }, + { + id: "cluster.viewEndpoints", + title: "Cluster: View Endpoints", + scope: "entity", + action: () => navigate(routes.endpointURL()) + }, + { + id: "cluster.viewIngresses", + title: "Cluster: View Ingresses", + scope: "entity", + action: () => navigate(routes.ingressURL()) + }, + { + id: "cluster.viewNetworkPolicies", + title: "Cluster: View NetworkPolicies", + scope: "entity", + action: () => navigate(routes.networkPoliciesURL()) + }, + { + id: "cluster.viewNodes", + title: "Cluster: View Nodes", + scope: "entity", + action: () => navigate(routes.nodesURL()) + }, + { + id: "cluster.viewPods", + title: "Cluster: View Pods", + scope: "entity", + action: () => navigate(routes.podsURL()) + }, + { + id: "cluster.viewDeployments", + title: "Cluster: View Deployments", + scope: "entity", + action: () => navigate(routes.deploymentsURL()) + }, + { + id: "cluster.viewDaemonSets", + title: "Cluster: View DaemonSets", + scope: "entity", + action: () => navigate(routes.daemonSetsURL()) + }, + { + id: "cluster.viewStatefulSets", + title: "Cluster: View StatefulSets", + scope: "entity", + action: () => navigate(routes.statefulSetsURL()) + }, + { + id: "cluster.viewJobs", + title: "Cluster: View Jobs", + scope: "entity", + action: () => navigate(routes.jobsURL()) + }, + { + id: "cluster.viewCronJobs", + title: "Cluster: View CronJobs", + scope: "entity", + action: () => navigate(routes.cronJobsURL()) + }, + { + id: "cluster.viewCurrentClusterSettings", + title: "Cluster: View Settings", + scope: "global", + action: () => navigate(routes.entitySettingsURL({ + params: { + entityId: ClusterStore.getInstance().active.id + } + })), + isActive: (context) => !!context.entity + }, + { + id: "cluster.openTerminal", + title: "Cluster: Open terminal", + scope: "entity", + action: () => createTerminalTab(), + isActive: (context) => !!context.entity + }, + { + id: "hotbar.switchHotbar", + title: "Hotbar: Switch ...", + scope: "global", + action: () => CommandOverlay.open() + }, + { + id: "hotbar.addHotbar", + title: "Hotbar: Add Hotbar ...", + scope: "global", + action: () => CommandOverlay.open() + }, + { + id: "hotbar.removeHotbar", + title: "Hotbar: Remove Hotbar ...", + scope: "global", + action: () => CommandOverlay.open() + }, + ]); +} diff --git a/src/renderer/initializers/entity-settings-registry.ts b/src/renderer/initializers/entity-settings-registry.ts new file mode 100644 index 0000000000..e7203ca97b --- /dev/null +++ b/src/renderer/initializers/entity-settings-registry.ts @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { EntitySettingRegistry } from "../../extensions/registries"; +import * as clusterSettings from "../components/cluster-settings"; + +export function initEntitySettingsRegistry() { + EntitySettingRegistry.getInstance() + .add([ + { + apiVersions: ["entity.k8slens.dev/v1alpha1"], + kind: "KubernetesCluster", + source: "local", + title: "General", + components: { + View: clusterSettings.GeneralSettings, + } + }, + { + apiVersions: ["entity.k8slens.dev/v1alpha1"], + kind: "KubernetesCluster", + title: "Proxy", + components: { + View: clusterSettings.ProxySettings, + } + }, + { + apiVersions: ["entity.k8slens.dev/v1alpha1"], + kind: "KubernetesCluster", + title: "Terminal", + components: { + View: clusterSettings.TerminalSettings, + } + }, + { + apiVersions: ["entity.k8slens.dev/v1alpha1"], + kind: "KubernetesCluster", + title: "Namespaces", + components: { + View: clusterSettings.NamespacesSettings, + } + }, + { + apiVersions: ["entity.k8slens.dev/v1alpha1"], + kind: "KubernetesCluster", + title: "Metrics", + components: { + View: clusterSettings.MetricsSettings, + } + } + ]); +} diff --git a/src/renderer/initializers/index.ts b/src/renderer/initializers/index.ts new file mode 100644 index 0000000000..5eeef311dc --- /dev/null +++ b/src/renderer/initializers/index.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +export * from "./command-registry"; +export * from "./entity-settings-registry"; +export * from "./kube-object-detail-registry"; +export * from "./kube-object-menu-registry"; +export * from "./registries"; +export * from "./welcome-menu-registry"; diff --git a/src/renderer/initializers/kube-object-detail-registry.ts b/src/renderer/initializers/kube-object-detail-registry.ts new file mode 100644 index 0000000000..7752213858 --- /dev/null +++ b/src/renderer/initializers/kube-object-detail-registry.ts @@ -0,0 +1,443 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { KubeObjectDetailRegistry } from "../api/kube-object-detail-registry"; +import { HpaDetails } from "../components/+config-autoscalers"; +import { LimitRangeDetails } from "../components/+config-limit-ranges"; +import { ConfigMapDetails } from "../components/+config-maps"; +import { PodDisruptionBudgetDetails } from "../components/+config-pod-disruption-budgets"; +import { ResourceQuotaDetails } from "../components/+config-resource-quotas"; +import { SecretDetails } from "../components/+config-secrets"; +import { CRDDetails } from "../components/+custom-resources"; +import { EventDetails } from "../components/+events"; +import { KubeEventDetails } from "../components/+events/kube-event-details"; +import { NamespaceDetails } from "../components/+namespaces"; +import { EndpointDetails } from "../components/+network-endpoints"; +import { IngressDetails } from "../components/+network-ingresses"; +import { NetworkPolicyDetails } from "../components/+network-policies"; +import { ServiceDetails } from "../components/+network-services"; +import { NodeDetails } from "../components/+nodes"; +import { PodSecurityPolicyDetails } from "../components/+pod-security-policies"; +import { StorageClassDetails } from "../components/+storage-classes"; +import { PersistentVolumeClaimDetails } from "../components/+storage-volume-claims"; +import { PersistentVolumeDetails } from "../components/+storage-volumes"; +import { RoleDetails } from "../components/+user-management-roles"; +import { RoleBindingDetails } from "../components/+user-management-roles-bindings"; +import { ServiceAccountsDetails } from "../components/+user-management-service-accounts"; +import { CronJobDetails } from "../components/+workloads-cronjobs"; +import { DaemonSetDetails } from "../components/+workloads-daemonsets"; +import { DeploymentDetails } from "../components/+workloads-deployments"; +import { JobDetails } from "../components/+workloads-jobs"; +import { PodDetails } from "../components/+workloads-pods"; +import { ReplicaSetDetails } from "../components/+workloads-replicasets"; +import { StatefulSetDetails } from "../components/+workloads-statefulsets"; + +export function intiKubeObjectDetailRegistry() { + KubeObjectDetailRegistry.getInstance() + .add([ + { + kind: "HorizontalPodAutoscaler", + apiVersions: ["autoscaling/v2beta1"], + components: { + Details: HpaDetails, + } + }, + { + kind: "HorizontalPodAutoscaler", + apiVersions: ["autoscaling/v2beta1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "LimitRange", + apiVersions: ["v1"], + components: { + Details: LimitRangeDetails, + } + }, + { + kind: "ConfigMap", + apiVersions: ["v1"], + components: { + Details: ConfigMapDetails, + } + }, + { + kind: "ConfigMap", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "PodDisruptionBudget", + apiVersions: ["policy/v1beta1"], + components: { + Details: PodDisruptionBudgetDetails, + } + }, + { + kind: "ResourceQuota", + apiVersions: ["v1"], + components: { + Details: ResourceQuotaDetails, + } + }, + { + kind: "Secret", + apiVersions: ["v1"], + components: { + Details: SecretDetails, + } + }, + { + kind: "CustomResourceDefinition", + apiVersions: ["apiextensions.k8s.io/v1", "apiextensions.k8s.io/v1beta1"], + components: { + Details: CRDDetails, + } + }, + { + kind: "Event", + apiVersions: ["v1"], + components: { + Details: EventDetails, + } + }, + { + kind: "Namespace", + apiVersions: ["v1"], + components: { + Details: NamespaceDetails, + } + }, + { + kind: "Endpoints", + apiVersions: ["v1"], + components: { + Details: EndpointDetails, + } + }, + { + kind: "Endpoints", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Ingress", + apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], + components: { + Details: IngressDetails, + } + }, + { + kind: "Ingress", + apiVersions: ["networking.k8s.io/v1", "extensions/v1beta1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "NetworkPolicy", + apiVersions: ["networking.k8s.io/v1"], + components: { + Details: NetworkPolicyDetails, + } + }, + { + kind: "NetworkPolicy", + apiVersions: ["networking.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Service", + apiVersions: ["v1"], + components: { + Details: ServiceDetails, + } + }, + { + kind: "Service", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Node", + apiVersions: ["v1"], + components: { + Details: NodeDetails, + } + }, + { + kind: "Node", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "PodSecurityPolicy", + apiVersions: ["policy/v1beta1"], + components: { + Details: PodSecurityPolicyDetails, + } + }, + { + kind: "StorageClass", + apiVersions: ["storage.k8s.io/v1"], + components: { + Details: StorageClassDetails, + } + }, + { + kind: "StorageClass", + apiVersions: ["storage.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "PersistentVolumeClaim", + apiVersions: ["v1"], + components: { + Details: PersistentVolumeClaimDetails, + } + }, + { + kind: "PersistentVolumeClaim", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "PersistentVolume", + apiVersions: ["v1"], + components: { + Details: PersistentVolumeDetails, + } + }, + { + kind: "PersistentVolume", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Role", + apiVersions: ["rbac.authorization.k8s.io/v1"], + components: { + Details: RoleDetails, + } + }, + { + kind: "Role", + apiVersions: ["rbac.authorization.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "ClusterRole", + apiVersions: ["rbac.authorization.k8s.io/v1"], + components: { + Details: RoleDetails, + } + }, + { + kind: "ClusterRole", + apiVersions: ["rbac.authorization.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "RoleBinding", + apiVersions: ["rbac.authorization.k8s.io/v1"], + components: { + Details: RoleBindingDetails, + } + }, + { + kind: "RoleBinding", + apiVersions: ["rbac.authorization.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "ClusterRoleBinding", + apiVersions: ["rbac.authorization.k8s.io/v1"], + components: { + Details: RoleBindingDetails, + } + }, + { + kind: "ClusterRoleBinding", + apiVersions: ["rbac.authorization.k8s.io/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "ServiceAccount", + apiVersions: ["v1"], + components: { + Details: ServiceAccountsDetails, + } + }, + { + kind: "ServiceAccount", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "CronJob", + apiVersions: ["batch/v1beta1"], + components: { + Details: CronJobDetails, + } + }, + { + kind: "CronJob", + apiVersions: ["batch/v1beta1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "DaemonSet", + apiVersions: ["apps/v1"], + components: { + Details: DaemonSetDetails, + } + }, + { + kind: "DaemonSet", + apiVersions: ["apps/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Deployment", + apiVersions: ["apps/v1"], + components: { + Details: DeploymentDetails, + } + }, + { + kind: "Deployment", + apiVersions: ["apps/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Job", + apiVersions: ["batch/v1"], + components: { + Details: JobDetails, + } + }, + { + kind: "Job", + apiVersions: ["batch/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "Pod", + apiVersions: ["v1"], + components: { + Details: PodDetails, + } + }, + { + kind: "Pod", + apiVersions: ["v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "ReplicaSet", + apiVersions: ["apps/v1"], + components: { + Details: ReplicaSetDetails, + } + }, + { + kind: "ReplicaSet", + apiVersions: ["apps/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + }, + { + kind: "StatefulSet", + apiVersions: ["apps/v1"], + components: { + Details: StatefulSetDetails, + } + }, + { + kind: "StatefulSet", + apiVersions: ["apps/v1"], + priority: 5, + components: { + Details: KubeEventDetails, + } + } + ]); +} diff --git a/src/renderer/initializers/kube-object-menu-registry.ts b/src/renderer/initializers/kube-object-menu-registry.ts new file mode 100644 index 0000000000..38f895a21a --- /dev/null +++ b/src/renderer/initializers/kube-object-menu-registry.ts @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { KubeObjectMenuRegistry } from "../../extensions/registries"; +import { ServiceAccountMenu } from "../components/+user-management-service-accounts"; +import { CronJobMenu } from "../components/+workloads-cronjobs"; +import { DeploymentMenu } from "../components/+workloads-deployments"; +import { ReplicaSetMenu } from "../components/+workloads-replicasets"; +import { StatefulSetMenu } from "../components/+workloads-statefulsets"; + +export function initKubeObjectMenuRegistry() { + KubeObjectMenuRegistry.getInstance() + .add([ + { + kind: "ServiceAccount", + apiVersions: ["v1"], + components: { + MenuItem: ServiceAccountMenu, + } + }, + { + kind: "CronJob", + apiVersions: ["batch/v1beta1"], + components: { + MenuItem: CronJobMenu + } + }, + { + kind: "Deployment", + apiVersions: ["apps/v1"], + components: { + MenuItem: DeploymentMenu + } + }, + { + kind: "ReplicaSet", + apiVersions: ["apps/v1"], + components: { + MenuItem: ReplicaSetMenu + } + }, + { + kind: "StatefulSet", + apiVersions: ["apps/v1"], + components: { + MenuItem: StatefulSetMenu + } + } + ]); +} diff --git a/src/renderer/components/+network/network.command.ts b/src/renderer/initializers/registries.ts similarity index 57% rename from src/renderer/components/+network/network.command.ts rename to src/renderer/initializers/registries.ts index 4171348a1b..ce883728a8 100644 --- a/src/renderer/components/+network/network.command.ts +++ b/src/renderer/initializers/registries.ts @@ -19,34 +19,19 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import * as routes from "../../../common/routes"; +import * as registries from "../../extensions/registries"; -commandRegistry.add({ - id: "cluster.viewServices", - title: "Cluster: View Services", - scope: "entity", - action: () => navigate(routes.servicesURL()) -}); - -commandRegistry.add({ - id: "cluster.viewEndpoints", - title: "Cluster: View Endpoints", - scope: "entity", - action: () => navigate(routes.endpointURL()) -}); - -commandRegistry.add({ - id: "cluster.viewIngresses", - title: "Cluster: View Ingresses", - scope: "entity", - action: () => navigate(routes.ingressURL()) -}); - -commandRegistry.add({ - id: "cluster.viewNetworkPolicies", - title: "Cluster: View NetworkPolicies", - scope: "entity", - action: () => navigate(routes.networkPoliciesURL()) -}); +export function initRegistries() { + registries.GlobalPageRegistry.createInstance(); + registries.AppPreferenceRegistry.createInstance(); + registries.EntitySettingRegistry.createInstance(); + registries.StatusBarRegistry.createInstance(); + registries.CommandRegistry.createInstance(); + registries.WelcomeMenuRegistry.createInstance(); + registries.ClusterPageRegistry.createInstance(); + registries.ClusterPageMenuRegistry.createInstance(); + registries.KubeObjectMenuRegistry.createInstance(); + registries.KubeObjectDetailRegistry.createInstance(); + registries.KubeObjectStatusRegistry.createInstance(); + registries.CommandRegistry.createInstance(); +} diff --git a/src/renderer/components/cluster-settings/cluster-settings.command.ts b/src/renderer/initializers/welcome-menu-registry.ts similarity index 67% rename from src/renderer/components/cluster-settings/cluster-settings.command.ts rename to src/renderer/initializers/welcome-menu-registry.ts index e0325d5340..887735b357 100644 --- a/src/renderer/components/cluster-settings/cluster-settings.command.ts +++ b/src/renderer/initializers/welcome-menu-registry.ts @@ -19,19 +19,22 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { navigate } from "../../navigation"; -import { commandRegistry } from "../../../extensions/registries/command-registry"; -import { ClusterStore } from "../../../common/cluster-store"; -import { entitySettingsURL } from "../../../common/routes"; +import { catalogURL, preferencesURL } from "../../common/routes"; +import { WelcomeMenuRegistry } from "../../extensions/registries"; +import { navigate } from "../navigation"; -commandRegistry.add({ - id: "cluster.viewCurrentClusterSettings", - title: "Cluster: View Settings", - scope: "global", - action: () => navigate(entitySettingsURL({ - params: { - entityId: ClusterStore.getInstance().active.id - } - })), - isActive: (context) => !!context.entity -}); +export function initWelcomeMenuRegistry() { + WelcomeMenuRegistry.getInstance() + .add([ + { + title: "Browse Your Catalog", + icon: "view_list", + click: () => navigate(catalogURL()) + }, + { + title: "Configure Preferences", + icon: "settings", + click: () => navigate(preferencesURL()) + } + ]); +} diff --git a/src/renderer/lens-app.tsx b/src/renderer/lens-app.tsx index 9043819761..afec8bfde6 100644 --- a/src/renderer/lens-app.tsx +++ b/src/renderer/lens-app.tsx @@ -36,7 +36,7 @@ import { registerIpcHandlers } from "./ipc"; import { ipcRenderer } from "electron"; import { IpcRendererNavigationEvents } from "./navigation/events"; import { catalogEntityRegistry } from "./api/catalog-entity-registry"; -import { commandRegistry } from "../extensions/registries"; +import { CommandRegistry } from "../extensions/registries"; import { reaction } from "mobx"; @observer @@ -56,12 +56,10 @@ export class LensApp extends React.Component { componentDidMount() { reaction(() => catalogEntityRegistry.items, (items) => { - if (!commandRegistry.activeEntity) { - return; - } + const reg = CommandRegistry.getInstance(); - if (!items.includes(commandRegistry.activeEntity)) { - commandRegistry.activeEntity = null; + if (reg.activeEntity && items.includes(reg.activeEntity)) { + reg.activeEntity = null; } }); } diff --git a/webpack.extensions.ts b/webpack.extensions.ts index e5a95660aa..90b20c3589 100644 --- a/webpack.extensions.ts +++ b/webpack.extensions.ts @@ -47,6 +47,7 @@ export default function generateExtensionTypes(): webpack.Configuration { optimization: { minimize: false, // speed up types compilation }, + stats: "errors-warnings", module: { rules: [ {