From f70853b95e2745d56c29943eff92684dd0aef3e7 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Thu, 21 Oct 2021 16:56:42 -0400 Subject: [PATCH] added support for port-forwarding https Signed-off-by: Jim Ehrismann --- src/main/routes/port-forward-route.ts | 17 ++++++++++++---- .../port-forward/port-forward-dialog.tsx | 13 +++++++++++- .../port-forward/port-forward-item.ts | 7 +++++++ .../port-forward/port-forward.store.ts | 20 +++++++++++++++---- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/main/routes/port-forward-route.ts b/src/main/routes/port-forward-route.ts index 763ea16b43..220c5dcf82 100644 --- a/src/main/routes/port-forward-route.ts +++ b/src/main/routes/port-forward-route.ts @@ -34,6 +34,7 @@ interface PortForwardArgs { name: string; port: number; forwardPort: number; + protocol: string; } const internalPortRegex = /^forwarding from (?
.+) ->/i; @@ -47,7 +48,8 @@ class PortForward { pf.kind == forward.kind && pf.name == forward.name && pf.namespace == forward.namespace && - pf.port == forward.port + pf.port == forward.port && + (!forward.protocol || pf.protocol == forward.protocol) )); } @@ -58,6 +60,7 @@ class PortForward { public name: string; public port: number; public forwardPort: number; + public protocol: string; constructor(public kubeConfig: string, args: PortForwardArgs) { this.clusterId = args.clusterId; @@ -66,6 +69,7 @@ class PortForward { this.name = args.name; this.port = args.port; this.forwardPort = args.forwardPort; + this.protocol = args.protocol ?? "http"; } public async start() { @@ -119,11 +123,12 @@ export class PortForwardRoute { const { namespace, resourceType, resourceName } = params; const port = Number(query.get("port")); const forwardPort = Number(query.get("forwardPort")); + const protocol = query.get("protocol"); try { let portForward = PortForward.getPortforward({ clusterId: cluster.id, kind: resourceType, name: resourceName, - namespace, port, forwardPort, + namespace, port, forwardPort, protocol, }); let thePort = 0; @@ -141,6 +146,7 @@ export class PortForwardRoute { name: resourceName, port, forwardPort: thePort, + protocol, }); const started = await portForward.start(); @@ -169,10 +175,11 @@ export class PortForwardRoute { const { namespace, resourceType, resourceName } = params; const port = Number(query.get("port")); const forwardPort = Number(query.get("forwardPort")); + const protocol = query.get("protocol"); const portForward = PortForward.getPortforward({ clusterId: cluster.id, kind: resourceType, name: resourceName, - namespace, port, forwardPort + namespace, port, forwardPort, protocol, }); respondJson(response, { port: portForward?.forwardPort ?? null }); @@ -189,6 +196,7 @@ export class PortForwardRoute { name: f.name, port: f.port, forwardPort: f.forwardPort, + protocol: f.protocol, }) ); @@ -200,10 +208,11 @@ export class PortForwardRoute { const { namespace, resourceType, resourceName } = params; const port = Number(query.get("port")); const forwardPort = Number(query.get("forwardPort")); + const protocol = query.get("protocol"); const portForward = PortForward.getPortforward({ clusterId: cluster.id, kind: resourceType, name: resourceName, - namespace, port, forwardPort, + namespace, port, forwardPort, protocol, }); try { diff --git a/src/renderer/port-forward/port-forward-dialog.tsx b/src/renderer/port-forward/port-forward-dialog.tsx index 7299228789..cf7442ceea 100644 --- a/src/renderer/port-forward/port-forward-dialog.tsx +++ b/src/renderer/port-forward/port-forward-dialog.tsx @@ -44,7 +44,8 @@ interface PortForwardDialogOpenOptions { const dialogState = observable.object({ isOpen: false, data: null as ForwardedPort, - openInBrowser: false + useHttps: false, + openInBrowser: false, }); @observer @@ -60,6 +61,7 @@ export class PortForwardDialog extends Component { static open(portForward: ForwardedPort, options: PortForwardDialogOpenOptions = { openInBrowser: false }) { dialogState.isOpen = true; dialogState.data = portForward; + dialogState.useHttps = Boolean(portForward.protocol === "https"); dialogState.openInBrowser = options.openInBrowser; } @@ -96,6 +98,8 @@ export class PortForwardDialog extends Component { try { let port: number; + portForward.protocol = dialogState.useHttps ? "https" : "http"; + if (currentPort) { port = await modifyPortForward(portForward, desiredPort); } else { @@ -131,6 +135,13 @@ export class PortForwardDialog extends Component { onChange={this.changePort} /> + dialogState.useHttps = value} + /> (`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + const protocol = portForward.protocol ?? "http"; + + response = await apiBase.post(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}&protocol=${protocol}`); if (response?.port && response.port != +portForward.forwardPort) { logger.warn(`specified ${portForward.forwardPort} got ${response.port}`); @@ -118,11 +120,18 @@ export async function addPortForward(portForward: ForwardedPort): Promise { let response: PortForwardResult; try { - response = await apiBase.get(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + response = await apiBase.get(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}${getProtocolQuery(portForward.protocol)}`); } catch (error) { logger.warn(error); // don't care, caller must check } @@ -134,8 +143,11 @@ export async function modifyPortForward(portForward: ForwardedPort, desiredPort: let port = 0; try { + const protocol = portForward.protocol; + delete portForward.protocol; await removePortForward(portForward); portForward.forwardPort = desiredPort; + portForward.protocol = protocol; port = await addPortForward(portForward); } catch (error) { logger.warn(error); // don't care, caller must check @@ -148,7 +160,7 @@ export async function modifyPortForward(portForward: ForwardedPort, desiredPort: export async function removePortForward(portForward: ForwardedPort) { try { - await apiBase.del(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}`); + await apiBase.del(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}?port=${portForward.port}&forwardPort=${portForward.forwardPort}${getProtocolQuery(portForward.protocol)}`); await waitUntilFree(+portForward.forwardPort, 200, 1000); } catch (error) { logger.warn(error); // don't care, caller must check @@ -169,7 +181,7 @@ export async function getPortForwards(): Promise { } export function openPortForward(portForward: ForwardedPort) { - const browseTo = `http://localhost:${portForward.forwardPort}`; + const browseTo = `${portForward.protocol ?? "http"}://localhost:${portForward.forwardPort}`; openExternal(browseTo) .catch(error => {