From 1f2b2de3fe24746297efc6596f8d5192a45c60f2 Mon Sep 17 00:00:00 2001 From: Matteo Silvestri Date: Thu, 24 Nov 2022 15:30:02 +0100 Subject: [PATCH 1/2] exported KubernetesContainerRunner, KubernetesContainerRunnerOptions, KubernetesContainerRunnerMountBase Signed-off-by: Matteo Silvestri --- .changeset/kind-walls-share.md | 5 ++++ packages/backend-common/api-report.md | 25 +++++++++++++++++ .../src/util/KubernetesContainerRunner.ts | 28 +++++++++---------- packages/backend-common/src/util/index.ts | 5 ++++ 4 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 .changeset/kind-walls-share.md diff --git a/.changeset/kind-walls-share.md b/.changeset/kind-walls-share.md new file mode 100644 index 0000000000..5df03999b1 --- /dev/null +++ b/.changeset/kind-walls-share.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +exported KubernetesContainerRunner, KubernetesContainerRunnerOptions, KubernetesContainerRunnerMountBase diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index e8dbd8d150..a063815056 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -28,6 +28,7 @@ import { GitLabIntegration } from '@backstage/integration'; import { isChildPath } from '@backstage/cli-common'; import { JsonValue } from '@backstage/types'; import { Knex } from 'knex'; +import { KubeConfig } from '@kubernetes/client-node'; import { LoadConfigOptionsRemote } from '@backstage/config-loader'; import { Logger } from 'winston'; import { MergeResult } from 'isomorphic-git'; @@ -37,6 +38,7 @@ import { ReadCommitResult } from 'isomorphic-git'; import { RequestHandler } from 'express'; import { Router } from 'express'; import { Server } from 'http'; +import { V1PodTemplateSpec } from '@kubernetes/client-node'; import * as winston from 'winston'; import { Writable } from 'stream'; @@ -474,6 +476,29 @@ export { isChildPath }; // @public export function isDatabaseConflictError(e: unknown): boolean; +// @public +export class KubernetesContainerRunner implements ContainerRunner { + constructor(options: KubernetesContainerRunnerOptions); + // (undocumented) + runContainer(options: RunContainerOptions): Promise; +} + +// @public +export type KubernetesContainerRunnerMountBase = { + volumeName: string; + basePath: string; +}; + +// @public +export type KubernetesContainerRunnerOptions = { + kubeConfig: KubeConfig; + name: string; + namespace?: string; + mountBase?: KubernetesContainerRunnerMountBase; + podTemplate?: V1PodTemplateSpec; + timeoutMs?: number; +}; + // @public export function loadBackendConfig(options: { logger: Logger; diff --git a/packages/backend-common/src/util/KubernetesContainerRunner.ts b/packages/backend-common/src/util/KubernetesContainerRunner.ts index af00351fd1..f3590a0bdc 100644 --- a/packages/backend-common/src/util/KubernetesContainerRunner.ts +++ b/packages/backend-common/src/util/KubernetesContainerRunner.ts @@ -39,7 +39,7 @@ import { Request } from 'request'; * * @public */ -export type MountBaseOptions = { +export type KubernetesContainerRunnerMountBase = { volumeName: string; basePath: string; }; @@ -51,7 +51,7 @@ export type MountBaseOptions = { * and their names will be prefixed with the provided 'name'. * * 'podTemplate' defines a Pod template for the Jobs. It has to include - * a volume definition named as the {@link MountBaseOptions} 'volumeName'. + * a volume definition named as the {@link KubernetesContainerRunnerMountBase} 'volumeName'. * * @public */ @@ -59,7 +59,7 @@ export type KubernetesContainerRunnerOptions = { kubeConfig: KubeConfig; name: string; namespace?: string; - mountBase?: MountBaseOptions; + mountBase?: KubernetesContainerRunnerMountBase; podTemplate?: V1PodTemplateSpec; timeoutMs?: number; }; @@ -77,12 +77,12 @@ export class KubernetesContainerRunner implements ContainerRunner { private readonly log: Log; private readonly name: string; private readonly namespace: string; - private readonly mountBase?: MountBaseOptions; + private readonly mountBase?: KubernetesContainerRunnerMountBase; private readonly podTemplate?: V1PodTemplateSpec; private readonly timeoutMs: number; private readonly containerName = 'executor'; - getNamespace(kubeConfig: KubeConfig, namespace?: string): string { + private getNamespace(kubeConfig: KubeConfig, namespace?: string): string { let _namespace = namespace; if (!_namespace) { _namespace = kubeConfig.getContextObject( @@ -95,10 +95,10 @@ export class KubernetesContainerRunner implements ContainerRunner { return _namespace; } - validateMountBase( - mountBase: MountBaseOptions, + private validateMountBase( + mountBase: KubernetesContainerRunnerMountBase, podTemplate?: V1PodTemplateSpec, - ): MountBaseOptions { + ): KubernetesContainerRunnerMountBase { if ( !podTemplate?.spec?.volumes?.filter(v => v.name === mountBase.volumeName) .length @@ -213,7 +213,7 @@ export class KubernetesContainerRunner implements ContainerRunner { await this.runJob(jobSpec, taskId, logStream); } - handleError(err: any, errorCallback: (reason: any) => void) { + private handleError(err: any, errorCallback: (reason: any) => void) { if (err.code !== 'ECONNRESET' && err.message !== 'aborted') { errorCallback( handleKubernetesError( @@ -224,7 +224,7 @@ export class KubernetesContainerRunner implements ContainerRunner { } } - watchPod( + private watchPod( taskId: string, callback: (pod: V1Pod) => void, errorCallback: (reason: any) => void, @@ -247,7 +247,7 @@ export class KubernetesContainerRunner implements ContainerRunner { ); } - tailLogs( + private tailLogs( taskId: string, logStream: Writable, ): { promise: Promise; close: () => Promise } { @@ -295,7 +295,7 @@ export class KubernetesContainerRunner implements ContainerRunner { return { promise: Promise.race([watchPromise, logPromise]), close }; } - waitPod(taskId: string): { + private waitPod(taskId: string): { promise: Promise; close: () => Promise; } { @@ -322,7 +322,7 @@ export class KubernetesContainerRunner implements ContainerRunner { return { promise, close }; } - async createJob(jobSpec: V1Job): Promise { + private async createJob(jobSpec: V1Job): Promise { return this.batchV1Api .createNamespacedJob(this.namespace, jobSpec) .catch(err => { @@ -333,7 +333,7 @@ export class KubernetesContainerRunner implements ContainerRunner { }); } - async runJob( + private async runJob( jobSpec: V1Job, taskId: string, logStream: Writable, diff --git a/packages/backend-common/src/util/index.ts b/packages/backend-common/src/util/index.ts index ba8074a11e..3e7b762519 100644 --- a/packages/backend-common/src/util/index.ts +++ b/packages/backend-common/src/util/index.ts @@ -16,3 +16,8 @@ export type { ContainerRunner, RunContainerOptions } from './ContainerRunner'; export { DockerContainerRunner } from './DockerContainerRunner'; +export type { + KubernetesContainerRunnerOptions, + KubernetesContainerRunnerMountBase, +} from './KubernetesContainerRunner'; +export { KubernetesContainerRunner } from './KubernetesContainerRunner'; From ab77f1477f6d3f1f6c4976a04f633b0a95bd52cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:03:33 +0000 Subject: [PATCH 2/2] Update dependency lint-staged to v13.0.4 Signed-off-by: Renovate Bot --- yarn.lock | 65 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/yarn.lock b/yarn.lock index c92d77b72a..eea278d3b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18007,7 +18007,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:2.0.19, colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.17": +"colorette@npm:2.0.19, colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.19": version: 2.0.19 resolution: "colorette@npm:2.0.19" checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 @@ -18075,7 +18075,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.3.0": +"commander@npm:*, commander@npm:^9.1.0, commander@npm:^9.4.1": version: 9.4.1 resolution: "commander@npm:9.4.1" checksum: bfb18e325a5bdf772763c2213d5c7d9e77144d944124e988bcd8e5e65fb6d45d5d4e86b09155d0f2556c9a59c31e428720e57968bcd050b2306e910a0bf3cf13 @@ -26641,10 +26641,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.0.5, lilconfig@npm:^2.0.3": - version: 2.0.5 - resolution: "lilconfig@npm:2.0.5" - checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1 +"lilconfig@npm:2.0.6, lilconfig@npm:^2.0.3": + version: 2.0.6 + resolution: "lilconfig@npm:2.0.6" + checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d languageName: node linkType: hard @@ -26665,25 +26665,25 @@ __metadata: linkType: hard "lint-staged@npm:^13.0.0": - version: 13.0.3 - resolution: "lint-staged@npm:13.0.3" + version: 13.0.4 + resolution: "lint-staged@npm:13.0.4" dependencies: cli-truncate: ^3.1.0 - colorette: ^2.0.17 - commander: ^9.3.0 + colorette: ^2.0.19 + commander: ^9.4.1 debug: ^4.3.4 execa: ^6.1.0 - lilconfig: 2.0.5 - listr2: ^4.0.5 + lilconfig: 2.0.6 + listr2: ^5.0.5 micromatch: ^4.0.5 normalize-path: ^3.0.0 object-inspect: ^1.12.2 pidtree: ^0.6.0 string-argv: ^0.3.1 - yaml: ^2.1.1 + yaml: ^2.1.3 bin: lint-staged: bin/lint-staged.js - checksum: 53d585007df06e162febab6b0836b55016d902586a267823c8a1158529d8c742dc7297e523f7023dff02250bef3eb0d6934f4ec4f9961adfc2ebbed5f54162d0 + checksum: 4676172df5dc734a7f409ad786a72d39bd2239de8b2e5eb1d99eaa751479f60f7b4ef85c8508698855b51b125a512f395ac6a3c7d2d57de8e8221e0aaaab6f4f languageName: node linkType: hard @@ -26729,6 +26729,27 @@ __metadata: languageName: node linkType: hard +"listr2@npm:^5.0.5": + version: 5.0.5 + resolution: "listr2@npm:5.0.5" + dependencies: + cli-truncate: ^2.1.0 + colorette: ^2.0.19 + log-update: ^4.0.0 + p-map: ^4.0.0 + rfdc: ^1.3.0 + rxjs: ^7.5.6 + through: ^2.3.8 + wrap-ansi: ^7.0.0 + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + checksum: 71c44eb648405d2725f248747ef8d5e192dd16938ec81df854c4a7e74ff1b3f4c3149461b1cff31c761bfbdf110f7f2603c9957c908294a1c6db299c9168608c + languageName: node + linkType: hard + "load-bmfont@npm:^1.3.1, load-bmfont@npm:^1.4.0": version: 1.4.1 resolution: "load-bmfont@npm:1.4.1" @@ -33456,12 +33477,12 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.1.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5": - version: 7.5.6 - resolution: "rxjs@npm:7.5.6" +"rxjs@npm:^7.0.0, rxjs@npm:^7.1.0, rxjs@npm:^7.5.1, rxjs@npm:^7.5.5, rxjs@npm:^7.5.6": + version: 7.5.7 + resolution: "rxjs@npm:7.5.7" dependencies: tslib: ^2.1.0 - checksum: fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b + checksum: edabcdb73b0f7e0f5f6e05c2077aff8c52222ac939069729704357d6406438acca831c24210db320aba269e86dbe1a400f3769c89101791885121a342fb15d9c languageName: node linkType: hard @@ -37891,10 +37912,10 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.1.1": - version: 2.1.1 - resolution: "yaml@npm:2.1.1" - checksum: f48bb209918aa57cfaf78ef6448d1a1f8187f45c746f933268b7023dc59e5456004611879126c9bb5ea55b0a2b1c2b392dfde436931ece0c703a3d754562bb96 +"yaml@npm:^2.0.0, yaml@npm:^2.1.1, yaml@npm:^2.1.3": + version: 2.1.3 + resolution: "yaml@npm:2.1.3" + checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 languageName: node linkType: hard