From 12beacec814d8e5e88f7724e26cabecf11ce3c92 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 9 Aug 2022 10:26:19 -0400 Subject: [PATCH] Make PortForward's use of apiBase fully injectable Signed-off-by: Sebastian Malton --- src/renderer/api/index.ts | 11 ----- .../port-forward-store.injectable.ts | 14 ++++--- .../port-forward-store/port-forward-store.ts | 39 +++++------------ .../request-active-port-forward.injectable.ts | 42 +++++++++++++++++++ 4 files changed, 60 insertions(+), 46 deletions(-) delete mode 100644 src/renderer/api/index.ts create mode 100644 src/renderer/port-forward/port-forward-store/request-active-port-forward.injectable.ts diff --git a/src/renderer/api/index.ts b/src/renderer/api/index.ts deleted file mode 100644 index 897a452d03..0000000000 --- a/src/renderer/api/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { apiBaseInjectionToken } from "../../common/k8s-api/api-base"; -import { apiKubeInjectionToken } from "../../common/k8s-api/api-kube"; -import { asLegacyGlobalForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; - -export const apiBase = asLegacyGlobalForExtensionApi(apiBaseInjectionToken); -export const apiKube = asLegacyGlobalForExtensionApi(apiKubeInjectionToken); diff --git a/src/renderer/port-forward/port-forward-store/port-forward-store.injectable.ts b/src/renderer/port-forward/port-forward-store/port-forward-store.injectable.ts index 4e834d0650..5339a3e4e7 100644 --- a/src/renderer/port-forward/port-forward-store/port-forward-store.injectable.ts +++ b/src/renderer/port-forward/port-forward-store/port-forward-store.injectable.ts @@ -7,6 +7,8 @@ import { PortForwardStore } from "./port-forward-store"; import type { ForwardedPort } from "../port-forward-item"; import createStorageInjectable from "../../utils/create-storage/create-storage.injectable"; import notifyErrorPortForwardingInjectable from "../notify-error-port-forwarding.injectable"; +import { apiBaseInjectionToken } from "../../../common/k8s-api/api-base"; +import requestActivePortForwardInjectable from "./request-active-port-forward.injectable"; const portForwardStoreInjectable = getInjectable({ id: "port-forward-store", @@ -14,14 +16,14 @@ const portForwardStoreInjectable = getInjectable({ instantiate: (di) => { const createStorage = di.inject(createStorageInjectable); - const storage = createStorage( - "port_forwards", - undefined, - ); - return new PortForwardStore({ - storage, + storage: createStorage( + "port_forwards", + undefined, + ), notifyErrorPortForwarding: di.inject(notifyErrorPortForwardingInjectable), + apiBase: di.inject(apiBaseInjectionToken), + requestActivePortForward: di.inject(requestActivePortForwardInjectable), }); }, }); diff --git a/src/renderer/port-forward/port-forward-store/port-forward-store.ts b/src/renderer/port-forward/port-forward-store/port-forward-store.ts index 542996e00b..179dd2f39c 100644 --- a/src/renderer/port-forward/port-forward-store/port-forward-store.ts +++ b/src/renderer/port-forward/port-forward-store/port-forward-store.ts @@ -9,19 +9,22 @@ import type { StorageLayer } from "../../utils"; import { autoBind, disposer } from "../../utils"; import type { ForwardedPort } from "../port-forward-item"; import { PortForwardItem } from "../port-forward-item"; -import { apiBase } from "../../api"; import { waitUntilFree } from "tcp-port-used"; import logger from "../../../common/logger"; +import type { JsonApi } from "../../../common/k8s-api/json-api"; +import type { RequestActivePortForward } from "./request-active-port-forward.injectable"; interface Dependencies { - storage: StorageLayer; + readonly storage: StorageLayer; notifyErrorPortForwarding: (message: string) => void; + readonly apiBase: JsonApi; // TODO: replace with individual dependencies + requestActivePortForward: RequestActivePortForward; } export class PortForwardStore extends ItemStore { @observable portForwards: PortForwardItem[] = []; - constructor(private dependencies: Dependencies) { + constructor(protected readonly dependencies: Dependencies) { super(); makeObservable(this); autoBind(this); @@ -222,7 +225,7 @@ export class PortForwardStore extends ItemStore { const { port, forwardPort } = portForward; try { - await apiBase.del( + await this.dependencies.apiBase.del( `/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort }}, ); @@ -272,10 +275,10 @@ export class PortForwardStore extends ItemStore { } const { port, forwardPort } = pf; - let response: PortForwardResult; + let response: { port: number }; try { - response = await apiBase.post( + response = await this.dependencies.apiBase.post( `/pods/port-forward/${pf.namespace}/${pf.kind}/${pf.name}`, { query: { port, forwardPort }}, ); @@ -322,7 +325,7 @@ export class PortForwardStore extends ItemStore { try { // check if the port-forward is active, and if so check if it has the same local port - const pf = await getActivePortForward(portForward); + const pf = await this.dependencies.requestActivePortForward(portForward); if (pf?.forwardPort && pf.forwardPort !== portForward.forwardPort) { logger.warn( @@ -338,10 +341,6 @@ export class PortForwardStore extends ItemStore { }; } -interface PortForwardResult { - port: number; -} - function portForwardsEqual(portForward: ForwardedPort) { return (pf: ForwardedPort) => ( pf.kind == portForward.kind && @@ -350,21 +349,3 @@ function portForwardsEqual(portForward: ForwardedPort) { pf.port == portForward.port ); } - -async function getActivePortForward(portForward: ForwardedPort): Promise { - const { port, forwardPort } = portForward; - let response: PortForwardResult; - - try { - response = await apiBase.get(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort }}); - } catch (error) { - logger.warn(`[PORT-FORWARD-STORE] Error getting active port-forward: ${error}`, portForward); - - return undefined; - } - - portForward.status = response?.port ? "Active" : "Disabled"; - portForward.forwardPort = response?.port; - - return portForward; -} diff --git a/src/renderer/port-forward/port-forward-store/request-active-port-forward.injectable.ts b/src/renderer/port-forward/port-forward-store/request-active-port-forward.injectable.ts new file mode 100644 index 0000000000..5e18e7b2ab --- /dev/null +++ b/src/renderer/port-forward/port-forward-store/request-active-port-forward.injectable.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getInjectable } from "@ogre-tools/injectable"; +import { apiBaseInjectionToken } from "../../../common/k8s-api/api-base"; +import loggerInjectable from "../../../common/logger.injectable"; +import { urlBuilderFor } from "../../../common/utils/buildUrl"; +import type { ForwardedPort } from "../port-forward-item"; + +export type RequestActivePortForward = (portForward: ForwardedPort) => Promise; + +const requestActiveEndpoint = urlBuilderFor("/pods/port-forward/:namespace/:kind/:name"); + +const requestActivePortForwardInjectable = getInjectable({ + id: "request-active-port-forward", + instantiate: (di): RequestActivePortForward => { + const apiBase = di.inject(apiBaseInjectionToken); + const logger = di.inject(loggerInjectable); + + return async (portForward) => { + const { port, forwardPort } = portForward; + let response: { port: number }; + + try { + response = await apiBase.get(requestActiveEndpoint.compile(portForward), { query: { port, forwardPort }}); + } catch (error) { + logger.warn(`[PORT-FORWARD-STORE] Error getting active port-forward: ${error}`, portForward); + + return undefined; + } + + portForward.status = response?.port ? "Active" : "Disabled"; + portForward.forwardPort = response?.port; + + return portForward; + }; + }, +}); + +export default requestActivePortForwardInjectable;