From 0cc94f72b7a2eec5203bfab0481d04005c4f8a8b Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Fri, 7 Feb 2025 19:17:34 +0200 Subject: [PATCH 1/7] chore(dep): update k8s-client for ocm and k8s scaffolder plugins Signed-off-by: Oleksandr Andriienko --- .../ocm-backend/__fixtures__/handlers.ts | 2 +- .../ocm-backend/__fixtures__/kubeconfig.yaml | 2 +- .../ocm/plugins/ocm-backend/package.json | 2 +- .../src/helpers/kubernetes.test.ts | 190 +++++++++++------- .../ocm-backend/src/helpers/kubernetes.ts | 97 ++++----- .../ocm-backend/src/service/router.test.ts | 2 +- workspaces/ocm/yarn.lock | 152 +++++++++++--- .../plugins/kubernetes-actions/package.json | 2 +- .../actions/createKubernetesNamespace.test.ts | 6 +- .../src/actions/createKubernetesNamespace.ts | 38 ++-- .../yarn.lock | 116 +++++++---- 11 files changed, 402 insertions(+), 207 deletions(-) diff --git a/workspaces/ocm/plugins/ocm-backend/__fixtures__/handlers.ts b/workspaces/ocm/plugins/ocm-backend/__fixtures__/handlers.ts index 1958ef3064..00c0830815 100644 --- a/workspaces/ocm/plugins/ocm-backend/__fixtures__/handlers.ts +++ b/workspaces/ocm/plugins/ocm-backend/__fixtures__/handlers.ts @@ -15,7 +15,7 @@ */ import { rest } from 'msw'; -const LOCAL_ADDR = 'http://localhost:5000'; +const LOCAL_ADDR = 'https://example.com'; export const handlers = [ rest.get( diff --git a/workspaces/ocm/plugins/ocm-backend/__fixtures__/kubeconfig.yaml b/workspaces/ocm/plugins/ocm-backend/__fixtures__/kubeconfig.yaml index ab11b87bb7..2a8b2e38ef 100644 --- a/workspaces/ocm/plugins/ocm-backend/__fixtures__/kubeconfig.yaml +++ b/workspaces/ocm/plugins/ocm-backend/__fixtures__/kubeconfig.yaml @@ -2,7 +2,7 @@ apiVersion: v1 clusters: - cluster: certificate-authority-data: Q0FEQVRBMg== - server: http://example.com + server: https://example.com insecure-skip-tls-verify: true name: default-cluster diff --git a/workspaces/ocm/plugins/ocm-backend/package.json b/workspaces/ocm/plugins/ocm-backend/package.json index 57cea70cf7..cdc4750b68 100644 --- a/workspaces/ocm/plugins/ocm-backend/package.json +++ b/workspaces/ocm/plugins/ocm-backend/package.json @@ -54,7 +54,7 @@ "@backstage/plugin-catalog-node": "^1.15.1", "@backstage/plugin-permission-common": "^0.8.4", "@backstage/plugin-permission-node": "^0.8.7", - "@kubernetes/client-node": "^0.22.1", + "@kubernetes/client-node": "1.0.0-rc7", "express": "^4.18.2", "semver": "^7.5.4" }, diff --git a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.test.ts b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.test.ts index 64f266f8ba..83ad4eda40 100644 --- a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.test.ts +++ b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.test.ts @@ -23,7 +23,6 @@ import { OcmConfig } from '../types'; import { getManagedCluster, getManagedClusterInfo, - hubApiClient, listManagedClusterInfos, listManagedClusters, } from './kubernetes'; @@ -37,91 +36,134 @@ afterAll(() => server.close()); const FIXTURES_DIR = `${__dirname}/../../__fixtures__`; const logger = mockServices.logger.mock(); -describe('hubApiClient', () => { - it('should use the default config if there is no service account token configured', () => { - process.env.KUBECONFIG = `${FIXTURES_DIR}/kubeconfig.yaml`; - const clusterConfig = { - id: 'foo', - hubResourceName: 'cluster1', - } as OcmConfig; - - const result = hubApiClient(clusterConfig, logger); - - expect(result.basePath).toBe('http://example.com'); - // These fields aren't on the type but are there - const auth = (result as any).authentications.default; - expect(auth.clusters[0].name).toBe('default-cluster'); - expect(auth.users[0].token).toBeUndefined(); - }); +const mockKubeConfig = { + loadFromOptions: jest.fn(), + loadFromDefault: jest.fn(), + makeApiClient: jest.fn(), +}; - it('should use the provided config in the returned api client', () => { - const clusterConfig = { - id: 'foo', - hubResourceName: 'cluster1', - serviceAccountToken: 'TOKEN', - url: 'http://cluster.com', - } as OcmConfig; - - const result = hubApiClient(clusterConfig, logger); - - expect(result.basePath).toBe('http://cluster.com'); - // These fields aren't on the type but are there - const auth = (result as any).authentications.default; - expect(auth.clusters[0].name).toBe('cluster1'); - expect(auth.users[0].token).toBe('TOKEN'); +describe('kubernetes.ts', () => { + beforeEach(() => { + jest.resetModules(); }); -}); -const kubeConfig = { - clusters: [{ name: 'cluster', server: 'http://localhost:5000' }], - users: [{ name: 'user', password: 'password' }], - contexts: [{ name: 'currentContext', cluster: 'cluster', user: 'user' }], - currentContext: 'currentContext', -}; - -const getApi = () => { - const kc = new KubeConfig(); - kc.loadFromOptions(kubeConfig); - return kc.makeApiClient(CustomObjectsApi); -}; + describe('hubApiClient', () => { + beforeAll(() => { + jest.doMock('@kubernetes/client-node', () => { + const actualModule = jest.requireActual('@kubernetes/client-node'); + + return { + ...actualModule, + KubeConfig: jest.fn().mockImplementation(() => { + return mockKubeConfig; + }), + }; + }); + }); + + it('should use the default config if there is no service account token configured', () => { + process.env.KUBECONFIG = `${FIXTURES_DIR}/kubeconfig.yaml`; + const clusterConfig = { + id: 'foo', + hubResourceName: 'cluster1', + } as OcmConfig; + + // use require here to ensure the mock is used. It doesn't work with direct import + const { hubApiClient } = require('./kubernetes'); + + hubApiClient(clusterConfig, logger); + + expect(mockKubeConfig.loadFromDefault).toHaveBeenCalled(); + expect(mockKubeConfig.makeApiClient).toHaveBeenCalled(); + }); + + it('should use the provided config in the returned api client', () => { + const clusterConfig = { + id: 'foo', + hubResourceName: 'cluster1', + serviceAccountToken: 'TOKEN', + url: 'http://cluster.com', + } as OcmConfig; + + // use require here to ensure the mock is used. It doesn't work with direct import + const { hubApiClient } = require('./kubernetes'); + + hubApiClient(clusterConfig, logger); + + expect(mockKubeConfig.makeApiClient).toHaveBeenCalled(); + expect(mockKubeConfig.loadFromOptions).toHaveBeenCalledWith({ + clusters: [ + { + server: 'http://cluster.com', + name: 'cluster1', + skipTLSVerify: undefined, + caData: undefined, + }, + ], + users: [{ name: 'backstage', token: 'TOKEN' }], + contexts: [ + { cluster: 'cluster1', name: 'cluster1', user: 'backstage' }, + ], + currentContext: 'cluster1', + }); + }); + }); -describe('getManagedClusters', () => { - it('should return some clusters', async () => { - const result: any = await listManagedClusters(getApi()); - expect(result.items[0].metadata.name).toBe('local-cluster'); - expect(result.items[1].metadata.name).toBe('cluster1'); + const kubeConfig = { + clusters: [{ name: 'cluster', server: 'https://example.com' }], + users: [{ name: 'user', password: 'password' }], + contexts: [{ name: 'currentContext', cluster: 'cluster', user: 'user' }], + currentContext: 'currentContext', + }; + + const getApi = () => { + const kc = new KubeConfig(); + kc.loadFromOptions(kubeConfig); + return kc.makeApiClient(CustomObjectsApi); + }; + + describe('getManagedClusters', () => { + it('should return some clusters', async () => { + const api = getApi(); + const result: any = await listManagedClusters(api); + expect(result.items[0].metadata.name).toBe('local-cluster'); + expect(result.items[1].metadata.name).toBe('cluster1'); + }); }); -}); -describe('getManagedCluster', () => { - it('should return the correct cluster', async () => { - const result: any = await getManagedCluster(getApi(), 'cluster1'); + describe('getManagedCluster', () => { + it('should return the correct cluster', async () => { + const result: any = await getManagedCluster(getApi(), 'cluster1'); - expect(result.metadata.name).toBe('cluster1'); - }); + expect(result.metadata.name).toBe('cluster1'); + }); - it('should return an error object when cluster is not found', async () => { - const result = await getManagedCluster( - getApi(), - 'non_existent_cluster', - ).catch(r => r); + it('should return an error object when cluster is not found', async () => { + const result = await getManagedCluster( + getApi(), + 'non_existent_cluster', + ).catch(r => r); - expect(result.statusCode).toBe(404); - expect(result.name).toBe('NotFound'); + expect(result.statusCode).toBe(404); + expect(result.name).toBe('NotFound'); + }); }); -}); -describe('getManagedClusterInfo', () => { - it('should return cluster', async () => { - const result: any = await getManagedClusterInfo(getApi(), 'local-cluster'); - expect(result.metadata.name).toBe('local-cluster'); + describe('getManagedClusterInfo', () => { + it('should return cluster', async () => { + const result: any = await getManagedClusterInfo( + getApi(), + 'local-cluster', + ); + expect(result.metadata.name).toBe('local-cluster'); + }); }); -}); -describe('getManagedClusterInfos', () => { - it('should return some cluster infos', async () => { - const result: any = await listManagedClusterInfos(getApi()); - expect(result.items[0].metadata.name).toBe('local-cluster'); - expect(result.items[1].metadata.name).toBe('cluster1'); + describe('getManagedClusterInfos', () => { + it('should return some cluster infos', async () => { + const result: any = await listManagedClusterInfos(getApi()); + expect(result.items[0].metadata.name).toBe('local-cluster'); + expect(result.items[1].metadata.name).toBe('cluster1'); + }); }); }); diff --git a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts index 8d97d2712c..f903dc9461 100644 --- a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts +++ b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts @@ -21,8 +21,6 @@ import { KubernetesListObject, } from '@kubernetes/client-node'; -import http from 'http'; - import { ManagedCluster, ManagedClusterInfo, OcmConfig } from '../types'; export const hubApiClient = ( @@ -66,77 +64,84 @@ export const hubApiClient = ( return kubeConfig.makeApiClient(CustomObjectsApi); }; -const kubeApiResponseHandler = ( - call: Promise<{ - response: http.IncomingMessage; - body: object; - }>, -) => { +const kubeApiResponseHandler = (call: Promise) => { return call .then(r => { - return r.body as T; + return r; }) .catch(r => { - if (!r.body) { - throw Object.assign(new Error(r.message), { - // If there is no body, there is no status code, default to 500 - statusCode: 500, - name: r.message, - }); - } else if (typeof r.body === 'string') { - throw Object.assign(new Error(r.body), { - statusCode: r.body.code || r.statusCode, - name: r.body, - }); + if (r.body) { + if (typeof r.body === 'object') { + throw Object.assign(new Error(r.body.reason), { + // Name and statusCode are required by the backstage error handler + statusCode: r.body.code || r.statusCode, + name: r.body.reason, + ...r.body, + }); + } + if (typeof r.body === 'string') { + const body = JSON.parse(r.body); + throw Object.assign(new Error(), { + name: body.reason, + message: body.message, + statusCode: body.code, + kind: body.kind, + apiVersion: body.apiVersion, + metadata: body.metadata, + status: body.status, + reason: body.reason, + details: body.details, + code: body.code, + }); + } } - throw Object.assign(new Error(r.body.reason), { - // Name and statusCode are required by the backstage error handler - statusCode: r.body.code || r.statusCode, - name: r.body.reason, - ...r.body, + throw Object.assign(new Error(r.message), { + // If there is no body, there is no status code, default to 500 + statusCode: 500, + name: r.message, }); }); }; export const getManagedCluster = (api: CustomObjectsApi, name: string) => { return kubeApiResponseHandler( - api.getClusterCustomObject( - 'cluster.open-cluster-management.io', - 'v1', - 'managedclusters', + api.getClusterCustomObject({ + plural: 'managedclusters', + version: 'v1', + group: 'cluster.open-cluster-management.io', name, - ), + }), ); }; export const listManagedClusters = (api: CustomObjectsApi) => { return kubeApiResponseHandler>( - api.listClusterCustomObject( - 'cluster.open-cluster-management.io', - 'v1', - 'managedclusters', - ), + api.listClusterCustomObject({ + group: 'cluster.open-cluster-management.io', + version: 'v1', + plural: 'managedclusters', + }), ); }; export const getManagedClusterInfo = (api: CustomObjectsApi, name: string) => { return kubeApiResponseHandler( - api.getNamespacedCustomObject( - 'internal.open-cluster-management.io', - 'v1beta1', - name, - 'managedclusterinfos', + api.getNamespacedCustomObject({ + group: 'internal.open-cluster-management.io', + version: 'v1beta1', name, - ), + namespace: name, + plural: 'managedclusterinfos', + }), ); }; export const listManagedClusterInfos = (api: CustomObjectsApi) => { return kubeApiResponseHandler>( - api.listClusterCustomObject( - 'internal.open-cluster-management.io', - 'v1beta1', - 'managedclusterinfos', - ), + api.listClusterCustomObject({ + group: 'internal.open-cluster-management.io', + version: 'v1beta1', + plural: 'managedclusterinfos', + }), ); }; diff --git a/workspaces/ocm/plugins/ocm-backend/src/service/router.test.ts b/workspaces/ocm/plugins/ocm-backend/src/service/router.test.ts index 91270e3db5..39e07fe8e1 100644 --- a/workspaces/ocm/plugins/ocm-backend/src/service/router.test.ts +++ b/workspaces/ocm/plugins/ocm-backend/src/service/router.test.ts @@ -43,7 +43,7 @@ const config = mockServices.rootConfig.factory({ ocm: { foo: { name: 'thisishub', - url: 'http://localhost:5000', + url: 'https://example.com', serviceAccountToken: 'TOKEN', }, }, diff --git a/workspaces/ocm/yarn.lock b/workspaces/ocm/yarn.lock index cfe5f6b394..4ca2dea85e 100644 --- a/workspaces/ocm/yarn.lock +++ b/workspaces/ocm/yarn.lock @@ -2549,7 +2549,7 @@ __metadata: "@backstage/plugin-catalog-node": ^1.15.1 "@backstage/plugin-permission-common": ^0.8.4 "@backstage/plugin-permission-node": ^0.8.7 - "@kubernetes/client-node": ^0.22.1 + "@kubernetes/client-node": 1.0.0-rc7 "@openapitools/openapi-generator-cli": 2.15.3 "@spotify/prettier-config": ^15.0.0 "@types/express": 4.17.21 @@ -5514,16 +5514,16 @@ __metadata: languageName: node linkType: hard -"@jsep-plugin/assignment@npm:^1.2.1": - version: 1.2.1 - resolution: "@jsep-plugin/assignment@npm:1.2.1" +"@jsep-plugin/assignment@npm:^1.3.0": + version: 1.3.0 + resolution: "@jsep-plugin/assignment@npm:1.3.0" peerDependencies: jsep: ^0.4.0||^1.0.0 - checksum: d56fd7423c59dd269c50b0a9c22ec05f099a789ec8e8980f2307782f496ab3f0740151f1bdc7a1f3a8ee9085cdeb6f5b4def0d6b312e6b93ab160e6489b400f2 + checksum: 5549497d403a6c00969d61202a6d3dafc5a349929d190a524363dcfacb3436dbda3d9f88b2ec1330247a594ad3c5f1c17b0997769d0b206802281bad6cf9a410 languageName: node linkType: hard -"@jsep-plugin/regex@npm:^1.0.1, @jsep-plugin/regex@npm:^1.0.3": +"@jsep-plugin/regex@npm:^1.0.1": version: 1.0.3 resolution: "@jsep-plugin/regex@npm:1.0.3" peerDependencies: @@ -5532,6 +5532,15 @@ __metadata: languageName: node linkType: hard +"@jsep-plugin/regex@npm:^1.0.4": + version: 1.0.4 + resolution: "@jsep-plugin/regex@npm:1.0.4" + peerDependencies: + jsep: ^0.4.0||^1.0.0 + checksum: 78ef01554535ac6c108851a2a6d86377bce10de01a263ad7b31f9b37c8aa9fc6c49f24b753e5da7d771c5921c913e43c1c33e0bc0fa5d02562d906c83a237836 + languageName: node + linkType: hard + "@jsep-plugin/ternary@npm:^1.0.2": version: 1.1.3 resolution: "@jsep-plugin/ternary@npm:1.1.3" @@ -5649,29 +5658,30 @@ __metadata: languageName: node linkType: hard -"@kubernetes/client-node@npm:^0.22.1": - version: 0.22.1 - resolution: "@kubernetes/client-node@npm:0.22.1" +"@kubernetes/client-node@npm:1.0.0-rc7": + version: 1.0.0-rc7 + resolution: "@kubernetes/client-node@npm:1.0.0-rc7" dependencies: "@types/js-yaml": ^4.0.1 "@types/node": ^22.0.0 - "@types/request": ^2.47.1 - "@types/ws": ^8.5.3 - byline: ^5.0.0 + "@types/node-fetch": ^2.6.9 + "@types/stream-buffers": ^3.0.3 + "@types/tar": ^6.1.1 + "@types/ws": ^8.5.4 + form-data: ^4.0.0 isomorphic-ws: ^5.0.0 js-yaml: ^4.1.0 jsonpath-plus: ^10.0.0 - openid-client: ^5.3.0 - request: ^2.88.0 + node-fetch: ^2.6.9 + openid-client: ^5.6.5 rfc4648: ^1.3.0 stream-buffers: ^3.0.2 tar: ^7.0.0 - tslib: ^2.4.1 + tmp-promise: ^3.0.2 + tslib: ^2.5.0 + url-parse: ^1.4.3 ws: ^8.18.0 - dependenciesMeta: - openid-client: - optional: true - checksum: 501377ad70681df9e30885cf18e40f9b16fd452bc50d9a46688a6f667a2a7f490238269e528b1f1804a6eaf4347f8edda57e5129b1a28a52915fe7898ea84329 + checksum: 82dca69f28e24c635badf866c1f548078d9ce2db5d4911c1831d257b9db3748fe306e35bdb3c04b54d9d6e5565625c0f3a43fc4bd75945b83475654b74ce5c31 languageName: node linkType: hard @@ -9217,6 +9227,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.6.9": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" + dependencies: + "@types/node": "*" + form-data: ^4.0.0 + checksum: 9647e68f9a125a090220c38d77b3c8e669c488658ae7506f1b4f9568214beba087624b1705bba1dc76649a65281ce3fd5b400e15266cbef8088027fb88777557 + languageName: node + linkType: hard + "@types/node-forge@npm:^1.3.0": version: 1.3.11 resolution: "@types/node-forge@npm:1.3.11" @@ -9226,7 +9246,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^22.0.0": +"@types/node@npm:*": version: 22.7.8 resolution: "@types/node@npm:22.7.8" dependencies: @@ -9260,6 +9280,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.0.0": + version: 22.13.1 + resolution: "@types/node@npm:22.13.1" + dependencies: + undici-types: ~6.20.0 + checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -9469,6 +9498,15 @@ __metadata: languageName: node linkType: hard +"@types/stream-buffers@npm:^3.0.3": + version: 3.0.7 + resolution: "@types/stream-buffers@npm:3.0.7" + dependencies: + "@types/node": "*" + checksum: b5cf12f69ba866035207e2313bd795166c30ca18329b8c07a96ec5e30d702a0c23b12fa789c7ebc3a08091ea01eca8db84203c93b6823e7477df016a49540f84 + languageName: node + linkType: hard + "@types/styled-jsx@npm:^2.2.8": version: 2.2.9 resolution: "@types/styled-jsx@npm:2.2.9" @@ -9499,6 +9537,16 @@ __metadata: languageName: node linkType: hard +"@types/tar@npm:^6.1.1": + version: 6.1.13 + resolution: "@types/tar@npm:6.1.13" + dependencies: + "@types/node": "*" + minipass: ^4.0.0 + checksum: bb3910936a6b37f093e38b73a52b0544fd73079685f5ea72e5c049fddc3770e58d80cf6d714425853f0746290221852c1a7ca89ffdb9614f3b2a858a3bf5436a + languageName: node + linkType: hard + "@types/tough-cookie@npm:*": version: 4.0.5 resolution: "@types/tough-cookie@npm:4.0.5" @@ -9550,6 +9598,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.5.4": + version: 8.5.14 + resolution: "@types/ws@npm:8.5.14" + dependencies: + "@types/node": "*" + checksum: b63d25146a0d2ebb9cb35e4b68c5a01d81b8f4657d62b0a0d9470df6a357798349a44064b2f84b8f98a553ba84d9a5ee302d3053feef02c7771010c55d290ca6 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -18133,13 +18190,20 @@ __metadata: languageName: node linkType: hard -"jsep@npm:^1.1.2, jsep@npm:^1.2.0, jsep@npm:^1.3.9": +"jsep@npm:^1.1.2, jsep@npm:^1.2.0": version: 1.3.9 resolution: "jsep@npm:1.3.9" checksum: d1f3e2cc00209f67a989b73c2a89d2ccbea908d950ec959e2448c6449b134c6367b47eef4e1292767cb490f0b5b72e7309080b93ee4c7398684df2514dbd33a3 languageName: node linkType: hard +"jsep@npm:^1.4.0": + version: 1.4.0 + resolution: "jsep@npm:1.4.0" + checksum: 8e7af5ecb91483b227092b87a3e85b5df3e848dbe6f201b19efcb18047567530d21dfeecb0978e09d1f66554fcfaed84176819eeacdfc86f61dc05c40c18f824 + languageName: node + linkType: hard + "jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": version: 3.0.2 resolution: "jsesc@npm:3.0.2" @@ -18323,16 +18387,16 @@ __metadata: linkType: hard "jsonpath-plus@npm:^10.0.0": - version: 10.1.0 - resolution: "jsonpath-plus@npm:10.1.0" + version: 10.2.0 + resolution: "jsonpath-plus@npm:10.2.0" dependencies: - "@jsep-plugin/assignment": ^1.2.1 - "@jsep-plugin/regex": ^1.0.3 - jsep: ^1.3.9 + "@jsep-plugin/assignment": ^1.3.0 + "@jsep-plugin/regex": ^1.0.4 + jsep: ^1.4.0 bin: jsonpath: bin/jsonpath-cli.js jsonpath-plus: bin/jsonpath-cli.js - checksum: 9369a9466e3bb3eca064debe3fd87d9cf791b9c8a23be7c00902497cd8f9dd632290d471e3c7bb09da0aa92626204f9c9a27c429940802bc5046cc8c87f3c596 + checksum: 862a96a0179f342fa6c012065fa78458d4ae4835f18a6ef580d18807101d8c2c3509dc20c9857474503205bff8f06c309e17d7420b68196262d15ad1e4f22146 languageName: node linkType: hard @@ -20225,7 +20289,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.2.4": +"minipass@npm:^4.0.0, minipass@npm:^4.2.4": version: 4.2.8 resolution: "minipass@npm:4.2.8" checksum: 7f4914d5295a9a30807cae5227a37a926e6d910c03f315930fde52332cf0575dfbc20295318f91f0baf0e6bb11a6f668e30cde8027dea7a11b9d159867a3c830 @@ -21116,6 +21180,18 @@ __metadata: languageName: node linkType: hard +"openid-client@npm:^5.6.5": + version: 5.7.1 + resolution: "openid-client@npm:5.7.1" + dependencies: + jose: ^4.15.9 + lru-cache: ^6.0.0 + object-hash: ^2.2.0 + oidc-token-hash: ^5.0.3 + checksum: 497aad2c8a022cef112ade19ed88fba6c8ca0e79607ebe5efdcf75c4095d7924ca479085c1c94f689f6dbc9442c61aab3c2443eb347bcbc6ef51df68827c7c47 + languageName: node + linkType: hard + "oppa@npm:^0.4.0": version: 0.4.0 resolution: "oppa@npm:0.4.0" @@ -25724,6 +25800,15 @@ __metadata: languageName: node linkType: hard +"tmp-promise@npm:^3.0.2": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: ^0.2.0 + checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -25733,7 +25818,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.3": +"tmp@npm:^0.2.0, tmp@npm:^0.2.3": version: 0.2.3 resolution: "tmp@npm:0.2.3" checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 @@ -26293,6 +26378,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: b7bc50f012dc6afbcce56c9fd62d7e86b20a62ff21f12b7b5cbf1973b9578d90f22a9c7fe50e638e96905d33893bf2f9f16d98929c4673c2480de05c6c96ea8b + languageName: node + linkType: hard + "undici@npm:^5.28.4": version: 5.28.4 resolution: "undici@npm:5.28.4" @@ -26537,7 +26629,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": +"url-parse@npm:^1.4.3, url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/package.json b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/package.json index 6d647a864e..276e899da4 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/package.json +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/package.json @@ -42,7 +42,7 @@ "@backstage/backend-plugin-api": "^1.1.1", "@backstage/catalog-client": "^1.9.1", "@backstage/plugin-scaffolder-node": "^0.6.3", - "@kubernetes/client-node": "^0.22.1" + "@kubernetes/client-node": "1.0.0-rc7" }, "devDependencies": { "@backstage/catalog-model": "^1.7.3", diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts index 1db818fbdf..ff58ded338 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts @@ -25,7 +25,7 @@ import { createKubernetesNamespaceAction, } from './createKubernetesNamespace'; -const LOCAL_ADDR = 'http://localhost:5000'; +const LOCAL_ADDR = 'https://kube-api:5000'; const FIXTURES_DIR = `${__dirname}/../../__fixtures__/cluster-entities`; const handlers = [ @@ -185,12 +185,12 @@ describe('kubernetes:create-namespace', () => { ...mockContext, input: { namespace: 'error', - url: 'http://localhost:5000', + url: 'https://kube-api:5000', token: 'TOKEN', }, }); }).rejects.toThrow( - 'Failed to create kubernetes namespace, 401 -- Unauthorized', + `Failed to create kubernetes namespace, HTTP-Code: 401\nMessage: Unauthorized\nBody: undefined\nHeaders: {\"content-type\":\"application/json\",\"x-powered-by\":\"msw\"}`, ); }); diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts index 9638dbe9e6..a0cebd587f 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts @@ -22,9 +22,8 @@ import { import { CoreV1Api, + CoreV1ApiCreateNamespaceRequest, KubeConfig, - V1Namespace, - type HttpError, } from '@kubernetes/client-node'; const KUBERNETES_API_URL_ANNOTATION = 'kubernetes.io/api-server'; @@ -231,19 +230,32 @@ export function createKubernetesNamespaceAction(catalogClient: CatalogClient) { const namespaceLabels = convertLabelsToObject(labels); const api = kubeConfig.makeApiClient(CoreV1Api); - const k8sNamespace: V1Namespace = { - metadata: { - name: namespace, - labels: namespaceLabels, + const k8sNamespace: CoreV1ApiCreateNamespaceRequest = { + body: { + metadata: { + name: namespace, + labels: namespaceLabels, + }, }, }; - await api.createNamespace(k8sNamespace).catch((e: HttpError) => { - const errorBody = e.body as HttpErrorBody; - const statusCode = errorBody?.code || e.statusCode; - const message = errorBody?.message || e.message; - throw new Error( - `Failed to create kubernetes namespace, ${statusCode} -- ${message}`, - ); + await api.createNamespace(k8sNamespace).catch((e: Error) => { + if ('body' in e && typeof e.body === 'string') { + let body: HttpErrorBody | undefined; + try { + body = JSON.parse((e as { body: string }).body); + } catch (error) { + throw new Error( + `Failed to create kubernetes namespace, ${e.message}`, + ); + } + if (body) { + const { code, message } = body; + throw new Error( + `Failed to create kubernetes namespace, API code: ${code} -- ${message}`, + ); + } + } + throw new Error(`Failed to create kubernetes namespace, ${e.message}`); }); }, }); diff --git a/workspaces/scaffolder-backend-module-kubernetes/yarn.lock b/workspaces/scaffolder-backend-module-kubernetes/yarn.lock index f2bd46d850..6cd7c80b74 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/yarn.lock +++ b/workspaces/scaffolder-backend-module-kubernetes/yarn.lock @@ -2538,7 +2538,7 @@ __metadata: "@backstage/cli": ^0.29.6 "@backstage/plugin-scaffolder-node": ^0.6.3 "@backstage/plugin-scaffolder-node-test-utils": ^0.1.18 - "@kubernetes/client-node": ^0.22.1 + "@kubernetes/client-node": 1.0.0-rc7 msw: 1.3.5 prettier: 3.4.2 languageName: unknown @@ -4524,25 +4524,30 @@ __metadata: languageName: node linkType: hard -"@kubernetes/client-node@npm:^0.22.1": - version: 0.22.3 - resolution: "@kubernetes/client-node@npm:0.22.3" +"@kubernetes/client-node@npm:1.0.0-rc7": + version: 1.0.0-rc7 + resolution: "@kubernetes/client-node@npm:1.0.0-rc7" dependencies: - byline: ^5.0.0 + "@types/js-yaml": ^4.0.1 + "@types/node": ^22.0.0 + "@types/node-fetch": ^2.6.9 + "@types/stream-buffers": ^3.0.3 + "@types/tar": ^6.1.1 + "@types/ws": ^8.5.4 + form-data: ^4.0.0 isomorphic-ws: ^5.0.0 js-yaml: ^4.1.0 - jsonpath-plus: ^10.2.0 - openid-client: ^6.1.3 - request: ^2.88.0 + jsonpath-plus: ^10.0.0 + node-fetch: ^2.6.9 + openid-client: ^5.6.5 rfc4648: ^1.3.0 stream-buffers: ^3.0.2 tar: ^7.0.0 - tslib: ^2.4.1 + tmp-promise: ^3.0.2 + tslib: ^2.5.0 + url-parse: ^1.4.3 ws: ^8.18.0 - dependenciesMeta: - openid-client: - optional: true - checksum: bd51c8b7f999d31772bb949492c5e817be972db5c872047f61bc25084d8cbc5fb69a335182a1e3afcd247dc5d4249a073fc4960eeaea8ccd8a85dff107c2de16 + checksum: 82dca69f28e24c635badf866c1f548078d9ce2db5d4911c1831d257b9db3748fe306e35bdb3c04b54d9d6e5565625c0f3a43fc4bd75945b83475654b74ce5c31 languageName: node linkType: hard @@ -7431,6 +7436,16 @@ __metadata: languageName: node linkType: hard +"@types/node-fetch@npm:^2.6.9": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" + dependencies: + "@types/node": "*" + form-data: ^4.0.0 + checksum: 9647e68f9a125a090220c38d77b3c8e669c488658ae7506f1b4f9568214beba087624b1705bba1dc76649a65281ce3fd5b400e15266cbef8088027fb88777557 + languageName: node + linkType: hard + "@types/node-forge@npm:^1.3.0": version: 1.3.11 resolution: "@types/node-forge@npm:1.3.11" @@ -7474,6 +7489,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^22.0.0": + version: 22.13.1 + resolution: "@types/node@npm:22.13.1" + dependencies: + undici-types: ~6.20.0 + checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 + languageName: node + linkType: hard + "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -7627,6 +7651,25 @@ __metadata: languageName: node linkType: hard +"@types/stream-buffers@npm:^3.0.3": + version: 3.0.7 + resolution: "@types/stream-buffers@npm:3.0.7" + dependencies: + "@types/node": "*" + checksum: b5cf12f69ba866035207e2313bd795166c30ca18329b8c07a96ec5e30d702a0c23b12fa789c7ebc3a08091ea01eca8db84203c93b6823e7477df016a49540f84 + languageName: node + linkType: hard + +"@types/tar@npm:^6.1.1": + version: 6.1.13 + resolution: "@types/tar@npm:6.1.13" + dependencies: + "@types/node": "*" + minipass: ^4.0.0 + checksum: bb3910936a6b37f093e38b73a52b0544fd73079685f5ea72e5c049fddc3770e58d80cf6d714425853f0746290221852c1a7ca89ffdb9614f3b2a858a3bf5436a + languageName: node + linkType: hard + "@types/tough-cookie@npm:*": version: 4.0.5 resolution: "@types/tough-cookie@npm:4.0.5" @@ -7671,6 +7714,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.5.4": + version: 8.5.14 + resolution: "@types/ws@npm:8.5.14" + dependencies: + "@types/node": "*" + checksum: b63d25146a0d2ebb9cb35e4b68c5a01d81b8f4657d62b0a0d9470df6a357798349a44064b2f84b8f98a553ba84d9a5ee302d3053feef02c7771010c55d290ca6 + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -15270,7 +15322,7 @@ __metadata: languageName: node linkType: hard -"jose@npm:^5.0.0, jose@npm:^5.9.6": +"jose@npm:^5.0.0": version: 5.9.6 resolution: "jose@npm:5.9.6" checksum: 4b536da0201858ed4c4582e8bb479081f11e0c63dd0f5e473adde16fc539785e1f2f0409bc1fc7cbbb5b68026776c960b4952da3a06f6fdfff0b9764c9127ae0 @@ -15551,7 +15603,7 @@ __metadata: languageName: node linkType: hard -"jsonpath-plus@npm:10.2.0, jsonpath-plus@npm:^10.2.0, jsonpath-plus@npm:^6.0.1 || ^10.1.0": +"jsonpath-plus@npm:10.2.0, jsonpath-plus@npm:^10.0.0, jsonpath-plus@npm:^6.0.1 || ^10.1.0": version: 10.2.0 resolution: "jsonpath-plus@npm:10.2.0" dependencies: @@ -16703,7 +16755,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.2.4": +"minipass@npm:^4.0.0, minipass@npm:^4.2.4": version: 4.2.8 resolution: "minipass@npm:4.2.8" checksum: 7f4914d5295a9a30807cae5227a37a926e6d910c03f315930fde52332cf0575dfbc20295318f91f0baf0e6bb11a6f668e30cde8027dea7a11b9d159867a3c830 @@ -17261,13 +17313,6 @@ __metadata: languageName: node linkType: hard -"oauth4webapi@npm:^3.1.3": - version: 3.1.3 - resolution: "oauth4webapi@npm:3.1.3" - checksum: 9d6e94522f5dccf9193009a4af0f6ef7eed59bfd4dbf3551f80d95d03d1b792edc9b1a8a10dd6a33472dedad406b0b9e269393b6ee7e8126c69f05d79368e0ce - languageName: node - linkType: hard - "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -17459,7 +17504,7 @@ __metadata: languageName: node linkType: hard -"openid-client@npm:^5.3.0": +"openid-client@npm:^5.3.0, openid-client@npm:^5.6.5": version: 5.7.1 resolution: "openid-client@npm:5.7.1" dependencies: @@ -17471,16 +17516,6 @@ __metadata: languageName: node linkType: hard -"openid-client@npm:^6.1.3": - version: 6.1.4 - resolution: "openid-client@npm:6.1.4" - dependencies: - jose: ^5.9.6 - oauth4webapi: ^3.1.3 - checksum: aa1c212f1f7d6e259f0fb9373bc893643273f22ce1d00c0612dbf3e5d1007229b1d84792a45b2c0e884b411f4415cd82f4b547a3eacc36bb43922e167780b174 - languageName: node - linkType: hard - "oppa@npm:^0.4.0": version: 0.4.0 resolution: "oppa@npm:0.4.0" @@ -21299,6 +21334,15 @@ __metadata: languageName: node linkType: hard +"tmp-promise@npm:^3.0.2": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: ^0.2.0 + checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -21308,7 +21352,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.3": +"tmp@npm:^0.2.0, tmp@npm:^0.2.3": version: 0.2.3 resolution: "tmp@npm:0.2.3" checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 @@ -22000,7 +22044,7 @@ __metadata: languageName: node linkType: hard -"url-parse@npm:^1.5.3": +"url-parse@npm:^1.4.3, url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" dependencies: From 58bac148ffc4c6f9d3c8eb12a2e7dccd50552652 Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Mon, 10 Feb 2025 06:14:45 +0200 Subject: [PATCH 2/7] chore(dep): fix unit tests Signed-off-by: Oleksandr Andriienko --- .../kubernetes-actions/__fixtures__/cluster-entities/bar.json | 2 +- .../kubernetes-actions/__fixtures__/cluster-entities/foo.json | 2 +- .../src/actions/createKubernetesNamespace.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/bar.json b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/bar.json index 58355f445d..e2644b7e80 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/bar.json +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/bar.json @@ -3,7 +3,7 @@ "kind": "Resource", "metadata": { "annotations": { - "kubernetes.io/api-server": "http://localhost:5000" + "kubernetes.io/api-server": "https://kube-api:5000" }, "name": "bar" }, diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/foo.json b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/foo.json index 7a5679be19..8d295abbed 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/foo.json +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/__fixtures__/cluster-entities/foo.json @@ -3,7 +3,7 @@ "kind": "Resource", "metadata": { "annotations": { - "kubernetes.io/api-server": "http://localhost:5000" + "kubernetes.io/api-server": "https://kube-api:5000" }, "name": "foo" }, diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts index ff58ded338..2b02a116e4 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.test.ts @@ -169,7 +169,7 @@ describe('kubernetes:create-namespace', () => { ...mockContext, input: { namespace: 'foo', - url: 'http://example.com', + url: 'https://example.com', clusterRef: 'foo', token: 'TOKEN', }, From a8df7d03994dc520130b49b11e8959a486bdd31f Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Mon, 10 Feb 2025 06:18:20 +0200 Subject: [PATCH 3/7] chore(dep): update yarn.lock files Signed-off-by: Oleksandr Andriienko --- workspaces/ocm/yarn.lock | 64 +++---------------- .../yarn.lock | 28 ++------ 2 files changed, 14 insertions(+), 78 deletions(-) diff --git a/workspaces/ocm/yarn.lock b/workspaces/ocm/yarn.lock index 4ca2dea85e..9640015aef 100644 --- a/workspaces/ocm/yarn.lock +++ b/workspaces/ocm/yarn.lock @@ -5523,16 +5523,7 @@ __metadata: languageName: node linkType: hard -"@jsep-plugin/regex@npm:^1.0.1": - version: 1.0.3 - resolution: "@jsep-plugin/regex@npm:1.0.3" - peerDependencies: - jsep: ^0.4.0||^1.0.0 - checksum: a57718ae5c86bd10ff5de51843a771b96a10a9c6b5c5f4e02aa5318257c3d5fdec96f8b389fcbe129c7a6ad6b0746d9a0fd934c949b80882230fbc14b548c922 - languageName: node - linkType: hard - -"@jsep-plugin/regex@npm:^1.0.4": +"@jsep-plugin/regex@npm:^1.0.1, @jsep-plugin/regex@npm:^1.0.4": version: 1.0.4 resolution: "@jsep-plugin/regex@npm:1.0.4" peerDependencies: @@ -9246,12 +9237,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 22.7.8 - resolution: "@types/node@npm:22.7.8" +"@types/node@npm:*, @types/node@npm:^22.0.0": + version: 22.13.1 + resolution: "@types/node@npm:22.13.1" dependencies: - undici-types: ~6.19.2 - checksum: c1dd36bd0bf82588e61f82edb29a792f21ce902f90cc5485591f9fd60cec3ea9172e044bf7b1c0849e7cf3a5a01da39516db260cb65cb0b94904010e00634a1c + undici-types: ~6.20.0 + checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 languageName: node linkType: hard @@ -9280,15 +9271,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^22.0.0": - version: 22.13.1 - resolution: "@types/node@npm:22.13.1" - dependencies: - undici-types: ~6.20.0 - checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 - languageName: node - linkType: hard - "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -9589,16 +9571,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:*, @types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3": - version: 8.5.12 - resolution: "@types/ws@npm:8.5.12" - dependencies: - "@types/node": "*" - checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.4": +"@types/ws@npm:*, @types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3, @types/ws@npm:^8.5.4": version: 8.5.14 resolution: "@types/ws@npm:8.5.14" dependencies: @@ -18190,14 +18163,7 @@ __metadata: languageName: node linkType: hard -"jsep@npm:^1.1.2, jsep@npm:^1.2.0": - version: 1.3.9 - resolution: "jsep@npm:1.3.9" - checksum: d1f3e2cc00209f67a989b73c2a89d2ccbea908d950ec959e2448c6449b134c6367b47eef4e1292767cb490f0b5b72e7309080b93ee4c7398684df2514dbd33a3 - languageName: node - linkType: hard - -"jsep@npm:^1.4.0": +"jsep@npm:^1.1.2, jsep@npm:^1.2.0, jsep@npm:^1.4.0": version: 1.4.0 resolution: "jsep@npm:1.4.0" checksum: 8e7af5ecb91483b227092b87a3e85b5df3e848dbe6f201b19efcb18047567530d21dfeecb0978e09d1f66554fcfaed84176819eeacdfc86f61dc05c40c18f824 @@ -21168,19 +21134,7 @@ __metadata: languageName: node linkType: hard -"openid-client@npm:^5.3.0": - version: 5.7.0 - resolution: "openid-client@npm:5.7.0" - dependencies: - jose: ^4.15.9 - lru-cache: ^6.0.0 - object-hash: ^2.2.0 - oidc-token-hash: ^5.0.3 - checksum: 63fc76918fc12f3d6e1456a0b170f417defccf6820acb4581ffc226cb8c9a18d50f76f0982d7a00cce2896c732eb2a6361ad6ea04b127b2603e56408b680ef9c - languageName: node - linkType: hard - -"openid-client@npm:^5.6.5": +"openid-client@npm:^5.3.0, openid-client@npm:^5.6.5": version: 5.7.1 resolution: "openid-client@npm:5.7.1" dependencies: diff --git a/workspaces/scaffolder-backend-module-kubernetes/yarn.lock b/workspaces/scaffolder-backend-module-kubernetes/yarn.lock index 6cd7c80b74..d44eca9943 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/yarn.lock +++ b/workspaces/scaffolder-backend-module-kubernetes/yarn.lock @@ -7455,12 +7455,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 22.10.0 - resolution: "@types/node@npm:22.10.0" +"@types/node@npm:*, @types/node@npm:^22.0.0": + version: 22.13.1 + resolution: "@types/node@npm:22.13.1" dependencies: undici-types: ~6.20.0 - checksum: 72b1314ba9dfbabaf1ba01480086399ff3831c8fc30ce82be4755d87cfc25f2ef17ec43d528e655797bbe4de4dd7d3eb7fa7ce2f91dccb8d434865a72870a149 + checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 languageName: node linkType: hard @@ -7489,15 +7489,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^22.0.0": - version: 22.13.1 - resolution: "@types/node@npm:22.13.1" - dependencies: - undici-types: ~6.20.0 - checksum: a0759e4bedc3fe892c3ddef5fa9cb5251f9c5b24defc1a389438ea3b5b727c481c1a9bc94bae4ecc7426c89ad293cd66633d163da1ab14d74d358cbec9e1ce31 - languageName: node - linkType: hard - "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -7705,16 +7696,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3": - version: 8.5.13 - resolution: "@types/ws@npm:8.5.13" - dependencies: - "@types/node": "*" - checksum: f17023ce7b89c6124249c90211803a4aaa02886e12bc2d0d2cd47fa665eeb058db4d871ce4397d8e423f6beea97dd56835dd3fdbb921030fe4d887601e37d609 - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.4": +"@types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3, @types/ws@npm:^8.5.4": version: 8.5.14 resolution: "@types/ws@npm:8.5.14" dependencies: From d70da4477cae8f052a3c0295223dc0595e1d899e Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Mon, 10 Feb 2025 07:48:35 +0200 Subject: [PATCH 4/7] fix(rbac): update topology and tekton plugins Signed-off-by: Oleksandr Andriienko --- workspaces/tekton/plugins/tekton/package.json | 4 ++-- workspaces/tekton/yarn.lock | 2 +- workspaces/topology/plugins/topology/package.json | 2 +- workspaces/topology/yarn.lock | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/workspaces/tekton/plugins/tekton/package.json b/workspaces/tekton/plugins/tekton/package.json index f41d14cb98..73d485d169 100644 --- a/workspaces/tekton/plugins/tekton/package.json +++ b/workspaces/tekton/plugins/tekton/package.json @@ -27,7 +27,7 @@ "start": "backstage-cli package start", "build": "backstage-cli package build", "lint": "backstage-cli package lint", - "test": "backstage-cli package test", + "test": "backstage-cli package test --passWithNoTests --coverage", "clean": "backstage-cli package clean", "prepack": "backstage-cli package prepack", "postpack": "backstage-cli package postpack", @@ -46,7 +46,7 @@ "@backstage/plugin-permission-react": "^0.4.30", "@backstage/theme": "^0.6.3", "@janus-idp/shared-react": "^2.13.1", - "@kubernetes/client-node": "^0.22.1", + "@kubernetes/client-node": "1.0.0-rc7", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.11.3", "@material-ui/lab": "^4.0.0-alpha.45", diff --git a/workspaces/tekton/yarn.lock b/workspaces/tekton/yarn.lock index a7304e91b1..8a3377976f 100644 --- a/workspaces/tekton/yarn.lock +++ b/workspaces/tekton/yarn.lock @@ -2840,7 +2840,7 @@ __metadata: "@backstage/test-utils": ^1.7.4 "@backstage/theme": ^0.6.3 "@janus-idp/shared-react": ^2.13.1 - "@kubernetes/client-node": ^0.22.1 + "@kubernetes/client-node": 1.0.0-rc7 "@material-ui/core": ^4.9.13 "@material-ui/icons": ^4.11.3 "@material-ui/lab": ^4.0.0-alpha.45 diff --git a/workspaces/topology/plugins/topology/package.json b/workspaces/topology/plugins/topology/package.json index 5a6960703c..da2e70a73a 100644 --- a/workspaces/topology/plugins/topology/package.json +++ b/workspaces/topology/plugins/topology/package.json @@ -46,7 +46,7 @@ "@backstage/plugin-permission-react": "^0.4.30", "@backstage/theme": "^0.6.3", "@janus-idp/shared-react": "^2.14.1", - "@kubernetes/client-node": "^0.22.1", + "@kubernetes/client-node": "1.0.0-rc7", "@mui/icons-material": "5.15.17", "@mui/lab": "5.0.0-alpha.173", "@mui/material": "^5.15.17", diff --git a/workspaces/topology/yarn.lock b/workspaces/topology/yarn.lock index 48ab501ec9..d3cf4d0eb5 100644 --- a/workspaces/topology/yarn.lock +++ b/workspaces/topology/yarn.lock @@ -2811,7 +2811,7 @@ __metadata: "@backstage/test-utils": ^1.7.4 "@backstage/theme": ^0.6.3 "@janus-idp/shared-react": ^2.14.1 - "@kubernetes/client-node": ^0.22.1 + "@kubernetes/client-node": 1.0.0-rc7 "@mui/icons-material": 5.15.17 "@mui/lab": 5.0.0-alpha.173 "@mui/material": ^5.15.17 From 751bc760d8555469040cd4f14247a84cda1bab7f Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Mon, 10 Feb 2025 15:51:59 +0200 Subject: [PATCH 5/7] chore(dep): work on error handling Signed-off-by: Oleksandr Andriienko --- .../ocm-backend/src/helpers/kubernetes.ts | 57 ++++++++----------- .../src/actions/createKubernetesNamespace.ts | 11 ++-- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts index f903dc9461..c1b1114de0 100644 --- a/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts +++ b/workspaces/ocm/plugins/ocm-backend/src/helpers/kubernetes.ts @@ -65,42 +65,31 @@ export const hubApiClient = ( }; const kubeApiResponseHandler = (call: Promise) => { - return call - .then(r => { - return r; - }) - .catch(r => { - if (r.body) { - if (typeof r.body === 'object') { - throw Object.assign(new Error(r.body.reason), { - // Name and statusCode are required by the backstage error handler - statusCode: r.body.code || r.statusCode, - name: r.body.reason, - ...r.body, - }); - } - if (typeof r.body === 'string') { - const body = JSON.parse(r.body); - throw Object.assign(new Error(), { - name: body.reason, - message: body.message, - statusCode: body.code, - kind: body.kind, - apiVersion: body.apiVersion, - metadata: body.metadata, - status: body.status, - reason: body.reason, - details: body.details, - code: body.code, - }); - } + return call.catch(e => { + // r.body should be string or blob binary + if ('body' in e && typeof e.body === 'string') { + let body; + try { + body = JSON.parse(e.body); + } catch (error) { + /* eslint-disable-line no-empty */ } - throw Object.assign(new Error(r.message), { - // If there is no body, there is no status code, default to 500 - statusCode: 500, - name: r.message, - }); + if (body) { + throw Object.assign(new Error(body.reason), { + // Name and statusCode are required by the backstage error handler + statusCode: body.code, + name: body.reason, + ...body, + }); + } + } + + throw Object.assign(new Error(e.message), { + // If there is no body, default to 500 + statusCode: 500, + name: e.message, }); + }); }; export const getManagedCluster = (api: CustomObjectsApi, name: string) => { diff --git a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts index a0cebd587f..67611a34fa 100644 --- a/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts +++ b/workspaces/scaffolder-backend-module-kubernetes/plugins/kubernetes-actions/src/actions/createKubernetesNamespace.ts @@ -239,22 +239,21 @@ export function createKubernetesNamespaceAction(catalogClient: CatalogClient) { }, }; await api.createNamespace(k8sNamespace).catch((e: Error) => { + // e.body should be string or blob binary if ('body' in e && typeof e.body === 'string') { let body: HttpErrorBody | undefined; try { - body = JSON.parse((e as { body: string }).body); + body = JSON.parse(e.body); } catch (error) { - throw new Error( - `Failed to create kubernetes namespace, ${e.message}`, - ); + /* eslint-disable-line no-empty */ } if (body) { - const { code, message } = body; throw new Error( - `Failed to create kubernetes namespace, API code: ${code} -- ${message}`, + `Failed to create kubernetes namespace, API code: ${body.code} -- ${body.message}`, ); } } + throw new Error(`Failed to create kubernetes namespace, ${e.message}`); }); }, From a46a053761d20e2dfae7f46c330ec75e22bd68ad Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Tue, 11 Feb 2025 18:37:13 +0200 Subject: [PATCH 6/7] chore(dep): remove deps that break application startup Signed-off-by: Oleksandr Andriienko --- workspaces/ocm/plugins/ocm/package.json | 6 +-- workspaces/ocm/yarn.lock | 67 +------------------------ 2 files changed, 2 insertions(+), 71 deletions(-) diff --git a/workspaces/ocm/plugins/ocm/package.json b/workspaces/ocm/plugins/ocm/package.json index 1c1b69c0c6..37cd3f5d69 100644 --- a/workspaces/ocm/plugins/ocm/package.json +++ b/workspaces/ocm/plugins/ocm/package.json @@ -72,11 +72,7 @@ "@types/react": "^18.2.58", "@types/react-dom": "^18.2.19", "cross-fetch": "4.0.0", - "msw": "1.3.5", - "prettier": "3.4.2", - "react": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", - "react-router-dom": "^6.0.0" + "msw": "1.3.5" }, "files": [ "dist", diff --git a/workspaces/ocm/yarn.lock b/workspaces/ocm/yarn.lock index 9640015aef..25cf761e27 100644 --- a/workspaces/ocm/yarn.lock +++ b/workspaces/ocm/yarn.lock @@ -2610,10 +2610,6 @@ __metadata: "@types/react-dom": ^18.2.19 cross-fetch: 4.0.0 msw: 1.3.5 - prettier: 3.4.2 - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 react-use: ^17.4.0 semver: ^7.5.4 peerDependencies: @@ -6971,13 +6967,6 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.20.0": - version: 1.20.0 - resolution: "@remix-run/router@npm:1.20.0" - checksum: 6bff41117eabb867b17c89baa727580f0a431368b309cd9a1f69767aafa68ea9cac95ff0eeb86d37c2c8655f5cd7c6283d37ae5e6d93e94f648c6112ddb24ede - languageName: node - linkType: hard - "@rjsf/core@npm:5.23.2": version: 5.23.2 resolution: "@rjsf/core@npm:5.23.2" @@ -19137,7 +19126,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -22861,18 +22850,6 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^16.13.1 || ^17.0.0 || ^18.0.0": - version: 18.3.1 - resolution: "react-dom@npm:18.3.1" - dependencies: - loose-envify: ^1.1.0 - scheduler: ^0.23.2 - peerDependencies: - react: ^18.3.1 - checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 - languageName: node - linkType: hard - "react-double-scrollbar@npm:0.0.15": version: 0.0.15 resolution: "react-double-scrollbar@npm:0.0.15" @@ -23045,30 +23022,6 @@ __metadata: languageName: node linkType: hard -"react-router-dom@npm:^6.0.0": - version: 6.27.0 - resolution: "react-router-dom@npm:6.27.0" - dependencies: - "@remix-run/router": 1.20.0 - react-router: 6.27.0 - peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" - checksum: de3dcc56297a2879a0e3997fa34ba0f3e1b9986a2ad3ef7991f913902ecf38da0282c98f7834f344ce2d881dbab0a382201a57e9f9ef5e9816febdb26dc038b7 - languageName: node - linkType: hard - -"react-router@npm:6.27.0": - version: 6.27.0 - resolution: "react-router@npm:6.27.0" - dependencies: - "@remix-run/router": 1.20.0 - peerDependencies: - react: ">=16.8" - checksum: d22eedc33bcb11891b431655f90eed2d52c2fb3165ad11ca625f62970caf59c4859e6b1a3f92e78902b31ff1a8b2482ebf97ddebb82e9687d1f98730c14e04e6 - languageName: node - linkType: hard - "react-side-effect@npm:^2.1.0": version: 2.1.2 resolution: "react-side-effect@npm:2.1.2" @@ -23179,15 +23132,6 @@ __metadata: languageName: node linkType: hard -"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: ^1.1.0 - checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 - languageName: node - linkType: hard - "read-tls-client-hello@npm:^1.0.0": version: 1.0.1 resolution: "read-tls-client-hello@npm:1.0.1" @@ -24067,15 +24011,6 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.2": - version: 0.23.2 - resolution: "scheduler@npm:0.23.2" - dependencies: - loose-envify: ^1.1.0 - checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 - languageName: node - linkType: hard - "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" From 7d37b4f4517ad547530f84175da42c92db7821a9 Mon Sep 17 00:00:00 2001 From: Oleksandr Andriienko Date: Tue, 11 Feb 2025 20:05:24 +0200 Subject: [PATCH 7/7] chore(dep): update react libs instead of removing Signed-off-by: Oleksandr Andriienko --- workspaces/ocm/plugins/ocm/package.json | 5 +- workspaces/ocm/yarn.lock | 66 ++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/workspaces/ocm/plugins/ocm/package.json b/workspaces/ocm/plugins/ocm/package.json index 37cd3f5d69..ff8999c570 100644 --- a/workspaces/ocm/plugins/ocm/package.json +++ b/workspaces/ocm/plugins/ocm/package.json @@ -72,7 +72,10 @@ "@types/react": "^18.2.58", "@types/react-dom": "^18.2.19", "cross-fetch": "4.0.0", - "msw": "1.3.5" + "msw": "1.3.5", + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "files": [ "dist", diff --git a/workspaces/ocm/yarn.lock b/workspaces/ocm/yarn.lock index 25cf761e27..766577f6a4 100644 --- a/workspaces/ocm/yarn.lock +++ b/workspaces/ocm/yarn.lock @@ -2610,6 +2610,9 @@ __metadata: "@types/react-dom": ^18.2.19 cross-fetch: 4.0.0 msw: 1.3.5 + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-router-dom: 6.0.0-beta.0 || ^6.3.0 react-use: ^17.4.0 semver: ^7.5.4 peerDependencies: @@ -6967,6 +6970,13 @@ __metadata: languageName: node linkType: hard +"@remix-run/router@npm:1.22.0": + version: 1.22.0 + resolution: "@remix-run/router@npm:1.22.0" + checksum: 09c6b29ce940d350fd33b22925c2131a828cbb0573cb12470e5abf96fdaa44714032d0a9caba89e96aeb61cc2544dabc51c227863aa51291cb763dba5dd2e316 + languageName: node + linkType: hard + "@rjsf/core@npm:5.23.2": version: 5.23.2 resolution: "@rjsf/core@npm:5.23.2" @@ -19126,7 +19136,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -22850,6 +22860,18 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^16.13.1 || ^17.0.0 || ^18.0.0": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.2 + peerDependencies: + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 + languageName: node + linkType: hard + "react-double-scrollbar@npm:0.0.15": version: 0.0.15 resolution: "react-double-scrollbar@npm:0.0.15" @@ -23022,6 +23044,30 @@ __metadata: languageName: node linkType: hard +"react-router-dom@npm:6.0.0-beta.0 || ^6.3.0": + version: 6.29.0 + resolution: "react-router-dom@npm:6.29.0" + dependencies: + "@remix-run/router": 1.22.0 + react-router: 6.29.0 + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 0000208e404ba09a03937c3a543e688d59bb4f23a902a7f343ca69d8315b262849745f8e3ef1dedf322be87856103f08cab689da39b67b65153606ed788dd51e + languageName: node + linkType: hard + +"react-router@npm:6.29.0": + version: 6.29.0 + resolution: "react-router@npm:6.29.0" + dependencies: + "@remix-run/router": 1.22.0 + peerDependencies: + react: ">=16.8" + checksum: 5fefc27c294b5db5f0da2d0872c8e186e770e6b6e5c954aef3040df240d325b1e57dd6a5ed2ed870a3ceae2483c772524725872155de6de491f664d766556630 + languageName: node + linkType: hard + "react-side-effect@npm:^2.1.0": version: 2.1.2 resolution: "react-side-effect@npm:2.1.2" @@ -23132,6 +23178,15 @@ __metadata: languageName: node linkType: hard +"react@npm:^16.13.1 || ^17.0.0 || ^18.0.0": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: ^1.1.0 + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 + languageName: node + linkType: hard + "read-tls-client-hello@npm:^1.0.0": version: 1.0.1 resolution: "read-tls-client-hello@npm:1.0.1" @@ -24011,6 +24066,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: ^1.1.0 + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0"