From c2e53065353995abebbab4cf0a6290a16058b1ab Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Thu, 15 Jun 2023 18:40:37 -0500 Subject: [PATCH 1/3] feat(kubernetes-backend): Add WebSocket support to `kubernetes-backend` proxy. Signed-off-by: Carlos Esteban Lopez --- .changeset/khaki-rocks-do.md | 5 +++++ .../src/service/KubernetesProxy.ts | 14 ++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/khaki-rocks-do.md diff --git a/.changeset/khaki-rocks-do.md b/.changeset/khaki-rocks-do.md new file mode 100644 index 0000000000..a9eb55d533 --- /dev/null +++ b/.changeset/khaki-rocks-do.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Add WebSocket support to `kubernetes-backend` proxy. diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 8e8fd54c77..7e03d863b8 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -135,20 +135,26 @@ export class KubernetesProxy { const logger = this.logger.child({ cluster: originalCluster.name }); middleware = createProxyMiddleware({ logProvider: () => logger, + ws: true, secure: !originalCluster.skipTLSVerify, changeOrigin: true, + pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, router: async req => { - // Re-evaluate the cluster on each request, in case it has changed - const cluster = await this.getClusterForRequest(req); + const isWS = req.headers.upgrade === 'websocket'; + const cluster = isWS + ? originalCluster + : await this.getClusterForRequest(req); const url = new URL(cluster.url); + const ca = bufferFromFileOrString('', cluster.caData)?.toString(); + + // Re-evaluate the cluster on each request, in case it has changed return { protocol: url.protocol, host: url.hostname, port: url.port, - ca: bufferFromFileOrString('', cluster.caData)?.toString(), + ca, }; }, - pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, onError: (error, req, res) => { const wrappedError = new ForwardedError( `Cluster '${originalCluster.name}' request error`, From 11fad09c74acf7a3da9d452204197626485e013d Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Fri, 16 Jun 2023 17:41:52 -0500 Subject: [PATCH 2/3] fix(kubernetes-backend): Swap `.header()` for `.headers[]` Signed-off-by: Carlos Esteban Lopez --- .../src/service/KubernetesProxy.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts index 7e03d863b8..36617bbbad 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.ts @@ -140,19 +140,15 @@ export class KubernetesProxy { changeOrigin: true, pathRewrite: { [`^${originalReq.baseUrl}`]: '' }, router: async req => { - const isWS = req.headers.upgrade === 'websocket'; - const cluster = isWS - ? originalCluster - : await this.getClusterForRequest(req); - const url = new URL(cluster.url); - const ca = bufferFromFileOrString('', cluster.caData)?.toString(); - // Re-evaluate the cluster on each request, in case it has changed + const cluster = await this.getClusterForRequest(req); + const url = new URL(cluster.url); + return { protocol: url.protocol, host: url.hostname, port: url.port, - ca, + ca: bufferFromFileOrString('', cluster.caData)?.toString(), }; }, onError: (error, req, res) => { @@ -179,7 +175,7 @@ export class KubernetesProxy { } private async getClusterForRequest(req: Request): Promise { - const clusterName = req.header(HEADER_KUBERNETES_CLUSTER); + const clusterName = req.headers[HEADER_KUBERNETES_CLUSTER.toLowerCase()]; const clusters = await this.clusterSupplier.getClusters(); if (!clusters || clusters.length <= 0) { From b7267331b9f5b4d2abb0f2b7c24efb20a26ffb1b Mon Sep 17 00:00:00 2001 From: Carlos Esteban Lopez Date: Fri, 16 Jun 2023 21:50:00 -0500 Subject: [PATCH 3/3] test(kubernetes-backend): Fix test mocking for headers Signed-off-by: Carlos Esteban Lopez --- .../kubernetes-backend/src/service/KubernetesProxy.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts index aaf3843e61..038a3d4bad 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesProxy.test.ts @@ -54,6 +54,10 @@ describe('KubernetesProxy', () => { params: { path, }, + headers: { + 'content-type': 'application/json', + [HEADER_KUBERNETES_CLUSTER.toLowerCase()]: clusterName, + }, header: jest.fn((key: string) => { switch (key) { case 'Content-Type': {