From d620bf578ce0332c9b88a0ced2d02bc2e6d22587 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Fri, 26 Nov 2021 17:31:13 -0500 Subject: [PATCH] adding disabled status to port forwards (WIP) Signed-off-by: Jim Ehrismann --- .../port-forward/port-forward-item.ts | 6 ++- .../port-forward/port-forward.store.ts | 46 +++++++++++-------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/renderer/port-forward/port-forward-item.ts b/src/renderer/port-forward/port-forward-item.ts index 33126fafa5..9a353ef2d8 100644 --- a/src/renderer/port-forward/port-forward-item.ts +++ b/src/renderer/port-forward/port-forward-item.ts @@ -23,6 +23,7 @@ import type { ItemObject } from "../../common/item.store"; import { autoBind } from "../../common/utils"; +export type forwardedPortStatus = "Active" | "Disabled"; export interface ForwardedPort { clusterId?: string; kind: string; @@ -31,6 +32,7 @@ export interface ForwardedPort { port: number; forwardPort: number; protocol?: string; + status?: forwardedPortStatus; } export class PortForwardItem implements ItemObject { @@ -41,6 +43,7 @@ export class PortForwardItem implements ItemObject { port: number; forwardPort: number; protocol: string; + status: forwardedPortStatus; constructor(pf: ForwardedPort) { this.clusterId = pf.clusterId; @@ -50,6 +53,7 @@ export class PortForwardItem implements ItemObject { this.port = pf.port; this.forwardPort = pf.forwardPort; this.protocol = pf.protocol ?? "http"; + this.status = pf.status; autoBind(this); } @@ -87,7 +91,7 @@ export class PortForwardItem implements ItemObject { } getStatus() { - return "Active"; // to-do allow port-forward-items to be stopped (without removing them) + return this.status; } getSearchFields() { diff --git a/src/renderer/port-forward/port-forward.store.ts b/src/renderer/port-forward/port-forward.store.ts index 57c9d8a1c4..7d0d674ad1 100644 --- a/src/renderer/port-forward/port-forward.store.ts +++ b/src/renderer/port-forward/port-forward.store.ts @@ -27,6 +27,7 @@ import { ForwardedPort, PortForwardItem } from "./port-forward-item"; import { apiBase } from "../api"; import { waitUntilFree } from "tcp-port-used"; import logger from "../../common/logger"; +import { Notifications } from "../components/notifications"; export class PortForwardStore extends ItemStore { private storage = createStorage("port_forwards", undefined); @@ -48,13 +49,21 @@ export class PortForwardStore extends ItemStore { if (Array.isArray(savedPortForwards)) { logger.info("[PORT-FORWARD-STORE] starting saved port-forwards"); - await Promise.all(savedPortForwards.map(addPortForward)); + const results = await Promise.allSettled(savedPortForwards.map(addPortForward)); + + for (const result of results) { + if (result.status === "rejected") { + Notifications.info("One or more port-forwards could not be started"); + + return; + } + } } } watch() { return disposer( - reaction(() => this.portForwards, () => this.loadAll()), + reaction(() => this.portForwards.slice(), () => this.loadAll()), ); } @@ -64,17 +73,13 @@ export class PortForwardStore extends ItemStore { this.storage.set(portForwards); - this.reset(); + this.portForwards = []; portForwards.map(pf => this.portForwards.push(new PortForwardItem(pf))); return this.portForwards; }); } - reset() { - this.portForwards = []; - } - async removeSelectedItems() { return Promise.all(this.selectedItems.map(removePortForward)); } @@ -102,20 +107,28 @@ export async function addPortForward(portForward: ForwardedPort): Promise(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort, protocol }}); + 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}`); + // 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}`); + } } } catch (error) { - logger.warn("[PORT-FORWARD-STORE] Error adding port-forward:", error, portForward); - throw (error); + logger.warn("[PORT-FORWARD-STORE] Error starting port-forward:", error, portForward); + portForward.status = "Disabled"; + throw(error); + } finally { + portForwardStore.portForwards.push(new PortForwardItem(portForward)); } - portForwardStore.reset(); return response?.port; } @@ -141,8 +154,6 @@ export async function modifyPortForward(portForward: ForwardedPort, desiredPort: portForward.forwardPort = desiredPort; port = await addPortForward(portForward); - portForwardStore.reset(); - return port; } @@ -157,7 +168,6 @@ export async function removePortForward(portForward: ForwardedPort) { logger.warn("[PORT-FORWARD-STORE] Error removing port-forward:", error, portForward); throw (error); } - portForwardStore.reset(); } export async function getPortForwards(clusterId?: string): Promise {