diff --git a/src/main/router.ts b/src/main/router.ts index 1db1a2a302..0832ace304 100644 --- a/src/main/router.ts +++ b/src/main/router.ts @@ -63,7 +63,6 @@ function getMimeType(filename: string) { } interface Dependencies { - routePortForward: (request: LensApiRequest) => Promise; httpProxy?: httpProxy; } @@ -168,7 +167,7 @@ export class Router { } else { this.router.add({ method: "get", path: "/{path*}" }, Router.handleStaticFile); } - + this.router.add({ method: "get", path: "/version" }, VersionRoute.getVersion); this.router.add({ method: "get", path: `${apiPrefix}/kubeconfig/service-account/{namespace}/{account}` }, KubeconfigRoute.routeServiceAccountRoute); @@ -176,9 +175,6 @@ export class Router { // Metrics API this.router.add({ method: "post", path: `${apiPrefix}/metrics` }, MetricsRoute.routeMetrics); this.router.add({ method: "get", path: `${apiPrefix}/metrics/providers` }, MetricsRoute.routeMetricsProviders); - - // Port-forward API (the container port and local forwarding port are obtained from the query parameters) - this.router.add({ method: "post", path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}` }, this.dependencies.routePortForward); } } diff --git a/src/main/router/router.injectable.ts b/src/main/router/router.injectable.ts index ed14516aee..2d9ff0d1fe 100644 --- a/src/main/router/router.injectable.ts +++ b/src/main/router/router.injectable.ts @@ -4,7 +4,6 @@ */ import { getInjectable, getInjectionToken } from "@ogre-tools/injectable"; import { Router, Route } from "../router"; -import routePortForwardInjectable from "../routes/port-forward/route-port-forward/route-port-forward.injectable"; import isDevelopmentInjectable from "../../common/vars/is-development.injectable"; import httpProxy from "http-proxy"; @@ -20,7 +19,6 @@ const routerInjectable = getInjectable({ const proxy = isDevelopment ? httpProxy.createProxy() : undefined; const router = new Router({ - routePortForward: di.inject(routePortForwardInjectable), httpProxy: proxy, }); diff --git a/src/main/routes/port-forward/create-port-forward.injectable.ts b/src/main/routes/port-forward/functionality/create-port-forward.injectable.ts similarity index 89% rename from src/main/routes/port-forward/create-port-forward.injectable.ts rename to src/main/routes/port-forward/functionality/create-port-forward.injectable.ts index bc00f7d791..1bd7a1ea41 100644 --- a/src/main/routes/port-forward/create-port-forward.injectable.ts +++ b/src/main/routes/port-forward/functionality/create-port-forward.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import { PortForward, PortForwardArgs } from "./port-forward"; -import bundledKubectlInjectable from "../../kubectl/bundled-kubectl.injectable"; +import bundledKubectlInjectable from "../../../kubectl/bundled-kubectl.injectable"; const createPortForwardInjectable = getInjectable({ id: "create-port-forward", diff --git a/src/main/routes/port-forward/port-forward.ts b/src/main/routes/port-forward/functionality/port-forward.ts similarity index 96% rename from src/main/routes/port-forward/port-forward.ts rename to src/main/routes/port-forward/functionality/port-forward.ts index 964b4e6ff2..dcbfb3d752 100644 --- a/src/main/routes/port-forward/port-forward.ts +++ b/src/main/routes/port-forward/functionality/port-forward.ts @@ -2,8 +2,8 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ -import logger from "../../logger"; -import { getPortFrom } from "../../utils/get-port"; +import logger from "../../../logger"; +import { getPortFrom } from "../../../utils/get-port"; import { spawn, ChildProcessWithoutNullStreams } from "child_process"; import * as tcpPortUsed from "tcp-port-used"; diff --git a/src/main/routes/port-forward2/get-current-port-forward-route.injectable.ts b/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts similarity index 95% rename from src/main/routes/port-forward2/get-current-port-forward-route.injectable.ts rename to src/main/routes/port-forward/get-current-port-forward-route.injectable.ts index 678bc2dc2e..4c649dfd4b 100644 --- a/src/main/routes/port-forward2/get-current-port-forward-route.injectable.ts +++ b/src/main/routes/port-forward/get-current-port-forward-route.injectable.ts @@ -7,7 +7,7 @@ import { routeInjectionToken } from "../../router/router.injectable"; import type { LensApiRequest } from "../../router"; import { apiPrefix } from "../../../common/vars"; import { respondJson } from "../../utils/http-responses"; -import { PortForward } from "../port-forward/port-forward"; +import { PortForward } from "./functionality/port-forward"; const getCurrentPortForward = async (request: LensApiRequest) => { const { params, query, response, cluster } = request; diff --git a/src/main/routes/port-forward/route-port-forward/route-port-forward.injectable.ts b/src/main/routes/port-forward/route-port-forward/route-port-forward.injectable.ts deleted file mode 100644 index af7758d0eb..0000000000 --- a/src/main/routes/port-forward/route-port-forward/route-port-forward.injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { routePortForward } from "./route-port-forward"; -import { getInjectable } from "@ogre-tools/injectable"; -import createPortForwardInjectable from "../create-port-forward.injectable"; - -const routePortForwardInjectable = getInjectable({ - id: "route-port-forward", - - instantiate: (di) => routePortForward({ - createPortForward: di.inject(createPortForwardInjectable), - }), -}); - -export default routePortForwardInjectable; diff --git a/src/main/routes/port-forward/route-port-forward/route-port-forward.ts b/src/main/routes/port-forward/route-port-forward/route-port-forward.ts deleted file mode 100644 index 267bc7529c..0000000000 --- a/src/main/routes/port-forward/route-port-forward/route-port-forward.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { LensApiRequest } from "../../../router"; -import logger from "../../../logger"; -import { respondJson } from "../../../utils/http-responses"; -import { PortForward, PortForwardArgs } from "../port-forward"; - -interface Dependencies { - createPortForward: (pathToKubeConfig: string, args: PortForwardArgs) => PortForward; -} - -export const routePortForward = - ({ createPortForward }: Dependencies) => - async (request: LensApiRequest) => { - const { params, query, response, cluster } = request; - const { namespace, resourceType, resourceName } = params; - const port = Number(query.get("port")); - const forwardPort = Number(query.get("forwardPort")); - - try { - let portForward = PortForward.getPortforward({ - clusterId: cluster.id, - kind: resourceType, - name: resourceName, - namespace, - port, - forwardPort, - }); - - if (!portForward) { - logger.info( - `Creating a new port-forward ${namespace}/${resourceType}/${resourceName}:${port}`, - ); - - const thePort = - 0 < forwardPort && forwardPort < 65536 ? forwardPort : 0; - - portForward = createPortForward(await cluster.getProxyKubeconfigPath(), { - clusterId: cluster.id, - kind: resourceType, - namespace, - name: resourceName, - port, - forwardPort: thePort, - }); - - const started = await portForward.start(); - - if (!started) { - logger.error("[PORT-FORWARD-ROUTE]: failed to start a port-forward", { - namespace, - port, - resourceType, - resourceName, - }); - - return respondJson( - response, - { - message: `Failed to forward port ${port} to ${ - thePort ? forwardPort : "random port" - }`, - }, - 400, - ); - } - } - - respondJson(response, { port: portForward.forwardPort }); - } catch (error) { - logger.error( - `[PORT-FORWARD-ROUTE]: failed to open a port-forward: ${error}`, - { namespace, port, resourceType, resourceName }, - ); - - return respondJson( - response, - { - message: `Failed to forward port ${port}`, - }, - 400, - ); - } - }; diff --git a/src/main/routes/port-forward/start-port-forward-route.injectable.ts b/src/main/routes/port-forward/start-port-forward-route.injectable.ts new file mode 100644 index 0000000000..142eab3934 --- /dev/null +++ b/src/main/routes/port-forward/start-port-forward-route.injectable.ts @@ -0,0 +1,102 @@ +/** + * 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 { routeInjectionToken } from "../../router/router.injectable"; +import type { LensApiRequest } from "../../router"; +import { apiPrefix } from "../../../common/vars"; +import { PortForward, PortForwardArgs } from "./functionality/port-forward"; +import logger from "../../logger"; +import { respondJson } from "../../utils/http-responses"; +import createPortForwardInjectable from "./functionality/create-port-forward.injectable"; + +interface Dependencies { + createPortForward: (pathToKubeConfig: string, args: PortForwardArgs) => PortForward; +} + +const startPortForward = ({ createPortForward }: Dependencies) => async (request: LensApiRequest) => { + const { params, query, response, cluster } = request; + const { namespace, resourceType, resourceName } = params; + const port = Number(query.get("port")); + const forwardPort = Number(query.get("forwardPort")); + + try { + let portForward = PortForward.getPortforward({ + clusterId: cluster.id, + kind: resourceType, + name: resourceName, + namespace, + port, + forwardPort, + }); + + if (!portForward) { + logger.info( + `Creating a new port-forward ${namespace}/${resourceType}/${resourceName}:${port}`, + ); + + const thePort = + 0 < forwardPort && forwardPort < 65536 ? forwardPort : 0; + + portForward = createPortForward(await cluster.getProxyKubeconfigPath(), { + clusterId: cluster.id, + kind: resourceType, + namespace, + name: resourceName, + port, + forwardPort: thePort, + }); + + const started = await portForward.start(); + + if (!started) { + logger.error("[PORT-FORWARD-ROUTE]: failed to start a port-forward", { + namespace, + port, + resourceType, + resourceName, + }); + + return respondJson( + response, + { + message: `Failed to forward port ${port} to ${ + thePort ? forwardPort : "random port" + }`, + }, + 400, + ); + } + } + + respondJson(response, { port: portForward.forwardPort }); + } catch (error) { + logger.error( + `[PORT-FORWARD-ROUTE]: failed to open a port-forward: ${error}`, + { namespace, port, resourceType, resourceName }, + ); + + return respondJson( + response, + { + message: `Failed to forward port ${port}`, + }, + 400, + ); + } +}; + +const startPortForwardRouteInjectable = getInjectable({ + id: "start-current-port-forward-route", + + instantiate: (di) => ({ + method: "post", + path: `${apiPrefix}/pods/port-forward/{namespace}/{resourceType}/{resourceName}`, + handler: startPortForward({ createPortForward: di.inject(createPortForwardInjectable) }), + }), + + injectionToken: routeInjectionToken, +}); + +export default startPortForwardRouteInjectable; diff --git a/src/main/routes/port-forward2/stop-current-port-forward-route.injectable.ts b/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts similarity index 96% rename from src/main/routes/port-forward2/stop-current-port-forward-route.injectable.ts rename to src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts index c56a3ff1a8..3919816872 100644 --- a/src/main/routes/port-forward2/stop-current-port-forward-route.injectable.ts +++ b/src/main/routes/port-forward/stop-current-port-forward-route.injectable.ts @@ -7,7 +7,7 @@ import { routeInjectionToken } from "../../router/router.injectable"; import type { LensApiRequest } from "../../router"; import { apiPrefix } from "../../../common/vars"; import { respondJson } from "../../utils/http-responses"; -import { PortForward } from "../port-forward/port-forward"; +import { PortForward } from "./functionality/port-forward"; import logger from "../../logger"; const stopCurrentPortForward = async (request: LensApiRequest) => {