From 879fc04c7d7b38b5a91b17d3e2ed68f81293bda3 Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Mon, 6 Dec 2021 12:15:17 -0500 Subject: [PATCH] more work Signed-off-by: Jim Ehrismann --- .../service-port-component.tsx | 2 +- .../+workloads-pods/pod-container-port.tsx | 2 +- .../port-forward/port-forward-dialog.tsx | 2 +- .../port-forward/port-forward.store.ts | 99 +++++++++++++++++-- 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/+network-services/service-port-component.tsx b/src/renderer/components/+network-services/service-port-component.tsx index 95355d0f0d..0e38749a42 100644 --- a/src/renderer/components/+network-services/service-port-component.tsx +++ b/src/renderer/components/+network-services/service-port-component.tsx @@ -93,7 +93,7 @@ export class ServicePortComponent extends React.Component { this.waiting = true; try { - // determine how many port-forwards are already active + // determine how many port-forwards already exist const { length } = await getPortForwards(); this.forwardPort = await addPortForward(portForward); diff --git a/src/renderer/components/+workloads-pods/pod-container-port.tsx b/src/renderer/components/+workloads-pods/pod-container-port.tsx index 50417ce9dd..485a7a72aa 100644 --- a/src/renderer/components/+workloads-pods/pod-container-port.tsx +++ b/src/renderer/components/+workloads-pods/pod-container-port.tsx @@ -97,7 +97,7 @@ export class PodContainerPort extends React.Component { this.waiting = true; try { - // determine how many port-forwards are already active + // determine how many port-forwards already exist const { length } = await getPortForwards(); this.forwardPort = await addPortForward(portForward); diff --git a/src/renderer/port-forward/port-forward-dialog.tsx b/src/renderer/port-forward/port-forward-dialog.tsx index bacfff9fa0..51f9b2d902 100644 --- a/src/renderer/port-forward/port-forward-dialog.tsx +++ b/src/renderer/port-forward/port-forward-dialog.tsx @@ -96,7 +96,7 @@ export class PortForwardDialog extends Component { const { currentPort, desiredPort, close } = this; try { - // determine how many port-forwards are already active + // determine how many port-forwards already exist const { length } = await getPortForwards(); let port: number; diff --git a/src/renderer/port-forward/port-forward.store.ts b/src/renderer/port-forward/port-forward.store.ts index 7d0d674ad1..6b8efe09f9 100644 --- a/src/renderer/port-forward/port-forward.store.ts +++ b/src/renderer/port-forward/port-forward.store.ts @@ -32,7 +32,7 @@ import { Notifications } from "../components/notifications"; export class PortForwardStore extends ItemStore { private storage = createStorage("port_forwards", undefined); - @observable portForwards: PortForwardItem[]; + @observable portForwards: PortForwardItem[] = []; constructor() { super(); @@ -103,10 +103,31 @@ interface PortForwardsResult { portForwards: ForwardedPort[]; } +function portForwardsEqual(portForward: ForwardedPort) { + return (pf: ForwardedPort) => ( + pf.clusterId == portForward.clusterId && + pf.kind == portForward.kind && + pf.name == portForward.name && + pf.namespace == portForward.namespace && + pf.port == portForward.port + ); +} + +function findPortForward(portForward: ForwardedPort) { + return (portForwardStore.portForwards.find(portForwardsEqual(portForward))); + +} + export async function addPortForward(portForward: ForwardedPort): Promise { const { port, forwardPort } = portForward; let response: PortForwardResult; + const pf = findPortForward(portForward); + + if (pf) { + return pf.forwardPort; + } + if (!portForward.status) { portForward.status = "Active"; } @@ -121,6 +142,7 @@ export async function addPortForward(portForward: ForwardedPort): Promise { +export async function getActivePortForward(portForward: ForwardedPort): Promise { const { port, forwardPort, protocol } = portForward; let response: PortForwardResult; try { response = await apiBase.get(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort, protocol }}); } catch (error) { - logger.warn("[PORT-FORWARD-STORE] Error getting port-forward:", error, portForward); + logger.warn("[PORT-FORWARD-STORE] Error getting active port-forward:", error, portForward); throw (error); } return response?.port; } +export async function getPortForward(portForward: ForwardedPort): Promise { + + const pf = findPortForward(portForward); + + if (!pf) { + const error = new Error("port-forward not found"); + + logger.warn("[PORT-FORWARD-STORE] Error getting port-forward:", error, portForward); + throw (error); + } + + let port = pf.port; + + try { + port = await getActivePortForward(portForward); + pf.status = "Active"; + pf.forwardPort = port; + } catch (error) { + // port is not active + pf.status = "Disabled"; + } + + return port; +} + export async function modifyPortForward(portForward: ForwardedPort, desiredPort: number): Promise { let port = 0; @@ -158,19 +205,40 @@ export async function modifyPortForward(portForward: ForwardedPort, desiredPort: } -export async function removePortForward(portForward: ForwardedPort) { +export async function removeActivePortForward(portForward: ForwardedPort) { const { port, forwardPort } = portForward; try { await apiBase.del(`/pods/port-forward/${portForward.namespace}/${portForward.kind}/${portForward.name}`, { query: { port, forwardPort }}); await waitUntilFree(+forwardPort, 200, 1000); } catch (error) { - logger.warn("[PORT-FORWARD-STORE] Error removing port-forward:", error, portForward); + logger.warn("[PORT-FORWARD-STORE] Error removing active port-forward:", error, portForward); throw (error); } } -export async function getPortForwards(clusterId?: string): Promise { +export async function removePortForward(portForward: ForwardedPort) { + const pf = findPortForward(portForward); + + if (!pf) { + const error = new Error("port-forward not found"); + + logger.warn("[PORT-FORWARD-STORE] Error getting port-forward:", error, portForward); + throw (error); + } + + try { + await removeActivePortForward(portForward); + } catch (error) { + if (pf.status === "Active") { + logger.warn("[PORT-FORWARD-STORE] Error removing port-forward:", error, portForward); + } + } + portForwardStore.portForwards.filter(item => item !== pf); + console.log("portForwards:", portForwardStore.portForwards); +} + +export async function getActivePortForwards(clusterId?: string): Promise { try { const response = await apiBase.get("/pods/port-forwards", { query: { clusterId }}); @@ -182,4 +250,23 @@ export async function getPortForwards(clusterId?: string): Promise { + try { + // get the active port-forwards to update the status + const activePortForwards = await getActivePortForwards(clusterId); + + portForwardStore.portForwards.map((item, index) => { + if (activePortForwards.find(portForwardsEqual(item))) { + portForwardStore.portForwards[index].status = "Active"; + } else { + portForwardStore.portForwards[index].status = "Disabled"; + } + }); + } catch (error) { + logger.warn("[PORT-FORWARD-STORE] Error getting all active port-forwards:", error); + } + + return portForwardStore.portForwards; +} + export const portForwardStore = new PortForwardStore();