From e31bacc553e2ed49a0aadcd6eab512bf6f5f6be1 Mon Sep 17 00:00:00 2001 From: secustor Date: Thu, 4 Apr 2024 19:15:57 +0200 Subject: [PATCH 1/6] feat(packages/backend-common): allows providing authentification in parameters Signed-off-by: secustor --- .changeset/tame-pianos-hunt.md | 5 +++++ .../src/util/ContainerRunner.ts | 16 ++++++++++++++ .../src/util/DockerContainerRunner.test.ts | 22 +++++++++++++++++++ .../src/util/DockerContainerRunner.ts | 19 ++++++++++------ 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 .changeset/tame-pianos-hunt.md diff --git a/.changeset/tame-pianos-hunt.md b/.changeset/tame-pianos-hunt.md new file mode 100644 index 0000000000..b19f69a8b9 --- /dev/null +++ b/.changeset/tame-pianos-hunt.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': minor +--- + +Allow to provide authentification which in turn allows usage of private registries diff --git a/packages/backend-common/src/util/ContainerRunner.ts b/packages/backend-common/src/util/ContainerRunner.ts index 7dc12919b3..11d75bcd8d 100644 --- a/packages/backend-common/src/util/ContainerRunner.ts +++ b/packages/backend-common/src/util/ContainerRunner.ts @@ -16,6 +16,21 @@ import { Writable } from 'stream'; +/** + * Allows defining access credentials for a registry + * Follows dockerode auth configuration: + * {@link https://github.com/apocas/dockerode?tab=readme-ov-file#pull-from-private-repos} + * + * @public + */ +export interface DockerAuthentication { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; +} + /** * Options passed to the {@link ContainerRunner.runContainer} method. * @@ -31,6 +46,7 @@ export type RunContainerOptions = { envVars?: Record; pullImage?: boolean; defaultUser?: boolean; + authentication?: DockerAuthentication; }; /** diff --git a/packages/backend-common/src/util/DockerContainerRunner.test.ts b/packages/backend-common/src/util/DockerContainerRunner.test.ts index 737bf3d178..dde4e48113 100644 --- a/packages/backend-common/src/util/DockerContainerRunner.test.ts +++ b/packages/backend-common/src/util/DockerContainerRunner.test.ts @@ -83,6 +83,28 @@ describe('DockerContainerRunner', () => { expect(mockDocker.run).toHaveBeenCalled(); }); + it('should pull the docker container with authentication', async () => { + await containerTaskApi.runContainer({ + imageName, + args, + authentication: { + auth: 'aaaaaaaaa', + }, + }); + + expect(mockDocker.pull).toHaveBeenCalledWith( + imageName, + { + authconfig: { + auth: 'aaaaaaaaa', + }, + }, + expect.any(Function), + ); + + expect(mockDocker.run).toHaveBeenCalled(); + }); + it('should not pull the docker container when pullImage is false', async () => { await containerTaskApi.runContainer({ imageName, diff --git a/packages/backend-common/src/util/DockerContainerRunner.ts b/packages/backend-common/src/util/DockerContainerRunner.ts index 986470eb98..675b618cab 100644 --- a/packages/backend-common/src/util/DockerContainerRunner.ts +++ b/packages/backend-common/src/util/DockerContainerRunner.ts @@ -47,6 +47,7 @@ export class DockerContainerRunner implements ContainerRunner { envVars = {}, pullImage = true, defaultUser = false, + authentication, } = options; // Show a better error message when Docker is unavailable. @@ -61,13 +62,17 @@ export class DockerContainerRunner implements ContainerRunner { if (pullImage) { await new Promise((resolve, reject) => { - this.dockerClient.pull(imageName, {}, (err, stream) => { - if (err) return reject(err); - stream.pipe(logStream, { end: false }); - stream.on('end', () => resolve()); - stream.on('error', (error: Error) => reject(error)); - return undefined; - }); + this.dockerClient.pull( + imageName, + { authconfig: authentication }, + (err, stream) => { + if (err) return reject(err); + stream.pipe(logStream, { end: false }); + stream.on('end', () => resolve()); + stream.on('error', (error: Error) => reject(error)); + return undefined; + }, + ); }); } From 5fad80cf78cfeccba52c5135956231d5f62c582b Mon Sep 17 00:00:00 2001 From: secustor Date: Thu, 4 Apr 2024 19:26:30 +0200 Subject: [PATCH 2/6] docs(packages/backend-common): changeset grammar Signed-off-by: secustor --- .changeset/tame-pianos-hunt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tame-pianos-hunt.md b/.changeset/tame-pianos-hunt.md index b19f69a8b9..3ab3e88623 100644 --- a/.changeset/tame-pianos-hunt.md +++ b/.changeset/tame-pianos-hunt.md @@ -2,4 +2,4 @@ '@backstage/backend-common': minor --- -Allow to provide authentification which in turn allows usage of private registries +Allow providing authentication which in turn allows usage of private registries From a0f55a1217073f43c13a744d803ca11113bdbd42 Mon Sep 17 00:00:00 2001 From: secustor Date: Thu, 4 Apr 2024 19:37:46 +0200 Subject: [PATCH 3/6] docs(packages/backend-common): fix api report Signed-off-by: secustor --- packages/backend-common/api-report.md | 15 +++++++++++++++ packages/backend-common/src/util/index.ts | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 55cb3b34dc..be9d3f5658 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -305,6 +305,20 @@ export type DatabaseManagerOptions = { logger?: LoggerService; }; +// @public +export interface DockerAuthentication { + // (undocumented) + auth?: string; + // (undocumented) + email?: string; + // (undocumented) + password?: string; + // (undocumented) + serveraddress?: string; + // (undocumented) + username?: string; +} + // @public export class DockerContainerRunner implements ContainerRunner { constructor(options: { dockerClient: Docker }); @@ -740,6 +754,7 @@ export type RunContainerOptions = { envVars?: Record; pullImage?: boolean; defaultUser?: boolean; + authentication?: DockerAuthentication; }; export { SearchOptions }; diff --git a/packages/backend-common/src/util/index.ts b/packages/backend-common/src/util/index.ts index 3e7b762519..5767653253 100644 --- a/packages/backend-common/src/util/index.ts +++ b/packages/backend-common/src/util/index.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -export type { ContainerRunner, RunContainerOptions } from './ContainerRunner'; +export type { + ContainerRunner, + RunContainerOptions, + DockerAuthentication, +} from './ContainerRunner'; export { DockerContainerRunner } from './DockerContainerRunner'; export type { KubernetesContainerRunnerOptions, From 5b02d00f2e149adbbb303c124faa19e0dc992c46 Mon Sep 17 00:00:00 2001 From: secustor Date: Thu, 4 Apr 2024 21:54:45 +0200 Subject: [PATCH 4/6] refactor(packages/backend-common): allow supplying generic options to pull images Signed-off-by: secustor --- packages/backend-common/api-report.md | 31 ++++++++++--------- .../src/util/ContainerRunner.ts | 18 ++++++----- .../src/util/DockerContainerRunner.test.ts | 6 ++-- .../src/util/DockerContainerRunner.ts | 20 +++++------- packages/backend-common/src/util/index.ts | 2 +- 5 files changed, 40 insertions(+), 37 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index be9d3f5658..888bc1639c 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -305,20 +305,6 @@ export type DatabaseManagerOptions = { logger?: LoggerService; }; -// @public -export interface DockerAuthentication { - // (undocumented) - auth?: string; - // (undocumented) - email?: string; - // (undocumented) - password?: string; - // (undocumented) - serveraddress?: string; - // (undocumented) - username?: string; -} - // @public export class DockerContainerRunner implements ContainerRunner { constructor(options: { dockerClient: Docker }); @@ -656,6 +642,21 @@ export { PluginDatabaseManager }; export { PluginEndpointDiscovery }; +// @public +export interface PullOptions { + // (undocumented) + [key: string]: unknown; + // (undocumented) + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; +} + // @public export type ReaderFactory = (options: { config: Config; @@ -754,7 +755,7 @@ export type RunContainerOptions = { envVars?: Record; pullImage?: boolean; defaultUser?: boolean; - authentication?: DockerAuthentication; + pullOptions?: PullOptions; }; export { SearchOptions }; diff --git a/packages/backend-common/src/util/ContainerRunner.ts b/packages/backend-common/src/util/ContainerRunner.ts index 11d75bcd8d..351a5da613 100644 --- a/packages/backend-common/src/util/ContainerRunner.ts +++ b/packages/backend-common/src/util/ContainerRunner.ts @@ -23,12 +23,16 @@ import { Writable } from 'stream'; * * @public */ -export interface DockerAuthentication { - username?: string; - password?: string; - auth?: string; - email?: string; - serveraddress?: string; +export interface PullOptions { + authconfig?: { + username?: string; + password?: string; + auth?: string; + email?: string; + serveraddress?: string; + [key: string]: unknown; + }; + [key: string]: unknown; } /** @@ -46,7 +50,7 @@ export type RunContainerOptions = { envVars?: Record; pullImage?: boolean; defaultUser?: boolean; - authentication?: DockerAuthentication; + pullOptions?: PullOptions; }; /** diff --git a/packages/backend-common/src/util/DockerContainerRunner.test.ts b/packages/backend-common/src/util/DockerContainerRunner.test.ts index dde4e48113..f5d0e18480 100644 --- a/packages/backend-common/src/util/DockerContainerRunner.test.ts +++ b/packages/backend-common/src/util/DockerContainerRunner.test.ts @@ -87,8 +87,10 @@ describe('DockerContainerRunner', () => { await containerTaskApi.runContainer({ imageName, args, - authentication: { - auth: 'aaaaaaaaa', + pullOptions: { + authconfig: { + auth: 'aaaaaaaaa', + }, }, }); diff --git a/packages/backend-common/src/util/DockerContainerRunner.ts b/packages/backend-common/src/util/DockerContainerRunner.ts index 675b618cab..89a17fff51 100644 --- a/packages/backend-common/src/util/DockerContainerRunner.ts +++ b/packages/backend-common/src/util/DockerContainerRunner.ts @@ -47,7 +47,7 @@ export class DockerContainerRunner implements ContainerRunner { envVars = {}, pullImage = true, defaultUser = false, - authentication, + pullOptions = {}, } = options; // Show a better error message when Docker is unavailable. @@ -62,17 +62,13 @@ export class DockerContainerRunner implements ContainerRunner { if (pullImage) { await new Promise((resolve, reject) => { - this.dockerClient.pull( - imageName, - { authconfig: authentication }, - (err, stream) => { - if (err) return reject(err); - stream.pipe(logStream, { end: false }); - stream.on('end', () => resolve()); - stream.on('error', (error: Error) => reject(error)); - return undefined; - }, - ); + this.dockerClient.pull(imageName, pullOptions, (err, stream) => { + if (err) return reject(err); + stream.pipe(logStream, { end: false }); + stream.on('end', () => resolve()); + stream.on('error', (error: Error) => reject(error)); + return undefined; + }); }); } diff --git a/packages/backend-common/src/util/index.ts b/packages/backend-common/src/util/index.ts index 5767653253..39bade08be 100644 --- a/packages/backend-common/src/util/index.ts +++ b/packages/backend-common/src/util/index.ts @@ -17,7 +17,7 @@ export type { ContainerRunner, RunContainerOptions, - DockerAuthentication, + PullOptions, } from './ContainerRunner'; export { DockerContainerRunner } from './DockerContainerRunner'; export type { From 70e962ceaf6f7ee3e8f3abfec9207a52fbfdf5e8 Mon Sep 17 00:00:00 2001 From: Sebastian Poxhofer Date: Fri, 12 Apr 2024 11:09:18 +0200 Subject: [PATCH 5/6] Update .changeset/tame-pianos-hunt.md Co-authored-by: Vincenzo Scamporlino Signed-off-by: Sebastian Poxhofer --- .changeset/tame-pianos-hunt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tame-pianos-hunt.md b/.changeset/tame-pianos-hunt.md index 3ab3e88623..2799a3a1da 100644 --- a/.changeset/tame-pianos-hunt.md +++ b/.changeset/tame-pianos-hunt.md @@ -2,4 +2,4 @@ '@backstage/backend-common': minor --- -Allow providing authentication which in turn allows usage of private registries +Added `pullOptions` to `DockerContainerRunner#runContainer` method to pass down options when pulling an image. From 1328adbcc0c4416fd81b30044339132b2f3bb850 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 13 Apr 2024 17:26:49 +0200 Subject: [PATCH 6/6] Update .changeset/tame-pianos-hunt.md Signed-off-by: Patrik Oldsberg --- .changeset/tame-pianos-hunt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tame-pianos-hunt.md b/.changeset/tame-pianos-hunt.md index 2799a3a1da..74475291ef 100644 --- a/.changeset/tame-pianos-hunt.md +++ b/.changeset/tame-pianos-hunt.md @@ -1,5 +1,5 @@ --- -'@backstage/backend-common': minor +'@backstage/backend-common': patch --- Added `pullOptions` to `DockerContainerRunner#runContainer` method to pass down options when pulling an image.