From 4f09e01c7244acb559107fcee9b23a48dbb05985 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Mon, 6 Dec 2021 19:30:14 -0500 Subject: [PATCH] almost working Signed-off-by: Jim Ehrismann --- .../port-forward-menu.tsx | 23 ++++- .../service-port-component.tsx | 2 +- .../components/+network/network-mixins.scss | 1 + .../+workloads-pods/pod-container-port.tsx | 2 +- .../port-forward/port-forward-item.ts | 3 - .../port-forward/port-forward-utils.ts | 1 - .../port-forward/port-forward.store.ts | 86 +++++++++++++------ 7 files changed, 87 insertions(+), 31 deletions(-) diff --git a/src/renderer/components/+network-port-forwards/port-forward-menu.tsx b/src/renderer/components/+network-port-forwards/port-forward-menu.tsx index 5b49c3f85c..75169b251d 100644 --- a/src/renderer/components/+network-port-forwards/port-forward-menu.tsx +++ b/src/renderer/components/+network-port-forwards/port-forward-menu.tsx @@ -21,7 +21,7 @@ import React from "react"; import { boundMethod, cssNames } from "../../utils"; -import { openPortForward, PortForwardItem, removePortForward } from "../../port-forward"; +import { openPortForward, PortForwardItem, removePortForward, startPortForward, stopPortForward } from "../../port-forward"; import { MenuActions, MenuActionsProps } from "../menu/menu-actions"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; @@ -45,6 +45,26 @@ export class PortForwardMenu extends React.Component { } } + renderStartStopMenuItem() { + const { portForward, toolbar } = this.props; + + if (portForward.status === "Active") { + return ( + stopPortForward(portForward)}> + + Stop + + ); + } + + return ( + startPortForward(portForward)}> + + Start + + ); + } + renderContent() { const { portForward, toolbar } = this.props; @@ -60,6 +80,7 @@ export class PortForwardMenu extends React.Component { Edit + {this.renderStartStopMenuItem()} ); } diff --git a/src/renderer/components/+network-services/service-port-component.tsx b/src/renderer/components/+network-services/service-port-component.tsx index 0e38749a42..e058039440 100644 --- a/src/renderer/components/+network-services/service-port-component.tsx +++ b/src/renderer/components/+network-services/service-port-component.tsx @@ -51,7 +51,7 @@ export class ServicePortComponent extends React.Component { componentDidMount() { disposeOnUnmount(this, [ - reaction(() => [portForwardStore.portForwards, this.props.service], () => this.checkExistingPortForwarding()), + reaction(() => [portForwardStore.portForwards.slice(), this.props.service], () => this.checkExistingPortForwarding()), ]); } diff --git a/src/renderer/components/+network/network-mixins.scss b/src/renderer/components/+network/network-mixins.scss index 3fa05ac072..3b9ca4fbb9 100644 --- a/src/renderer/components/+network/network-mixins.scss +++ b/src/renderer/components/+network/network-mixins.scss @@ -34,6 +34,7 @@ $service-status-color-list: ( $port-forward-status-color-list: ( active: var(--colorOk), + disabled: var(--colorSoftError) ); @mixin port-forward-status-colors { diff --git a/src/renderer/components/+workloads-pods/pod-container-port.tsx b/src/renderer/components/+workloads-pods/pod-container-port.tsx index 485a7a72aa..df25fae95e 100644 --- a/src/renderer/components/+workloads-pods/pod-container-port.tsx +++ b/src/renderer/components/+workloads-pods/pod-container-port.tsx @@ -55,7 +55,7 @@ export class PodContainerPort extends React.Component { componentDidMount() { disposeOnUnmount(this, [ - reaction(() => [portForwardStore.portForwards, this.props.pod], () => this.checkExistingPortForwarding()), + reaction(() => [portForwardStore.portForwards.slice(), this.props.pod], () => this.checkExistingPortForwarding()), ]); } diff --git a/src/renderer/port-forward/port-forward-item.ts b/src/renderer/port-forward/port-forward-item.ts index 9a353ef2d8..0135912e84 100644 --- a/src/renderer/port-forward/port-forward-item.ts +++ b/src/renderer/port-forward/port-forward-item.ts @@ -25,7 +25,6 @@ import { autoBind } from "../../common/utils"; export type forwardedPortStatus = "Active" | "Disabled"; export interface ForwardedPort { - clusterId?: string; kind: string; namespace: string; name: string; @@ -36,7 +35,6 @@ export interface ForwardedPort { } export class PortForwardItem implements ItemObject { - clusterId: string; kind: string; namespace: string; name: string; @@ -46,7 +44,6 @@ export class PortForwardItem implements ItemObject { status: forwardedPortStatus; constructor(pf: ForwardedPort) { - this.clusterId = pf.clusterId; this.kind = pf.kind; this.namespace = pf.namespace; this.name = pf.name; diff --git a/src/renderer/port-forward/port-forward-utils.ts b/src/renderer/port-forward/port-forward-utils.ts index c88761f344..775a350e2b 100644 --- a/src/renderer/port-forward/port-forward-utils.ts +++ b/src/renderer/port-forward/port-forward-utils.ts @@ -35,7 +35,6 @@ export function openPortForward(portForward: ForwardedPort) { openExternal(browseTo) .catch(error => { logger.error(`failed to open in browser: ${error}`, { - clusterId: portForward.clusterId, port: portForward.port, kind: portForward.kind, namespace: portForward.namespace, diff --git a/src/renderer/port-forward/port-forward.store.ts b/src/renderer/port-forward/port-forward.store.ts index 6b8efe09f9..61efeec201 100644 --- a/src/renderer/port-forward/port-forward.store.ts +++ b/src/renderer/port-forward/port-forward.store.ts @@ -53,7 +53,7 @@ export class PortForwardStore extends ItemStore { for (const result of results) { if (result.status === "rejected") { - Notifications.info("One or more port-forwards could not be started"); + Notifications.error("One or more port-forwards could not be started", { timeout: 10_000 }); return; } @@ -105,7 +105,6 @@ interface PortForwardsResult { function portForwardsEqual(portForward: ForwardedPort) { return (pf: ForwardedPort) => ( - pf.clusterId == portForward.clusterId && pf.kind == portForward.kind && pf.name == portForward.name && pf.namespace == portForward.namespace && @@ -118,41 +117,65 @@ function findPortForward(portForward: ForwardedPort) { } -export async function addPortForward(portForward: ForwardedPort): Promise { +export async function startPortForward(portForward: ForwardedPort): Promise { + const pf = findPortForward(portForward); + + if (!pf) { + const error = new Error("port-forward not found"); + + logger.warn("[PORT-FORWARD-STORE] Error starting port-forward:", error, portForward); + throw(error); + } + const { port, forwardPort } = portForward; let response: PortForwardResult; + try { + const protocol = portForward.protocol ?? "http"; + + response = await apiBase.post(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort, protocol }}); + + // expecting the received port to be the specified port, unless the specified port is 0, which indicates any available port is suitable + if (portForward.forwardPort && response?.port && response.port != +portForward.forwardPort) { + logger.warn(`[PORT-FORWARD-STORE] specified ${portForward.forwardPort}, got ${response.port}`); + } + + pf.forwardPort = response.port; + pf.status = "Active"; + } catch (error) { + logger.warn("[PORT-FORWARD-STORE] Error adding port-forward:", error, portForward); + pf.status = "Disabled"; + throw (error); + } + + return response?.port; +} + +export async function addPortForward(portForward: ForwardedPort): Promise { const pf = findPortForward(portForward); if (pf) { return pf.forwardPort; } + portForwardStore.portForwards.push(new PortForwardItem(portForward)); + if (!portForward.status) { portForward.status = "Active"; } try { if (portForward.status === "Active") { - const protocol = portForward.protocol ?? "http"; - - response = await apiBase.post(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort, protocol }}); - - // expecting the received port to be the specified port, unless the specified port is 0, which indicates any available port is suitable - if (portForward.forwardPort && response?.port && response.port != +portForward.forwardPort) { - logger.warn(`[PORT-FORWARD-STORE] specified ${portForward.forwardPort} got ${response.port}`); - } - portForward.forwardPort = response.port; + const port = await startPortForward(portForward); + + portForward.forwardPort = port; } } catch (error) { logger.warn("[PORT-FORWARD-STORE] Error starting port-forward:", error, portForward); - portForward.status = "Disabled"; throw(error); - } finally { - portForwardStore.portForwards.push(new PortForwardItem(portForward)); } - return response?.port; + return portForward.forwardPort; } export async function getActivePortForward(portForward: ForwardedPort): Promise { @@ -180,12 +203,15 @@ export async function getPortForward(portForward: ForwardedPort): Promise item !== pf); - console.log("portForwards:", portForwardStore.portForwards); + portForwardStore.portForwards = portForwardStore.portForwards.filter(item => item !== pf); } export async function getActivePortForwards(clusterId?: string): Promise {