From 47b7ac5adefd8c9039e12d3850b5e0c500286930 Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Tue, 25 Jun 2024 11:43:45 +0200 Subject: [PATCH] wip Signed-off-by: bnechyporenko --- .../providers/GcpBucketWorkspaceProvider.ts | 6 ++--- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 7 ++++-- .../src/tasks/serializer.test.ts | 7 ++++-- .../scaffolder-node/src/tasks/serializer.ts | 23 ++++++++++++++----- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts b/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts index cd2beb2073..3d269f690e 100644 --- a/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts +++ b/plugins/scaffolder-backend-module-gcp/src/providers/GcpBucketWorkspaceProvider.ts @@ -55,7 +55,7 @@ export class GcpBucketWorkspaceProvider implements WorkspaceProvider { const fileCloud = this.storage .bucket(this.getGcpBucketName()) .file(options.taskId); - const workspace = await serializeWorkspace(options.path); + const { contents: workspace } = await serializeWorkspace(options); try { await fileCloud.save(workspace, { contentType: 'application/x-tar', @@ -80,8 +80,8 @@ export class GcpBucketWorkspaceProvider implements WorkspaceProvider { const file = bucket.file(options.taskId); const result = await file.exists(); if (result[0]) { - const workspace = getRawBody(file.createReadStream()); - await restoreWorkspace(options.targetPath, await workspace); + const workspace = await getRawBody(file.createReadStream()); + await restoreWorkspace({ path: options.targetPath, buffer: workspace }); } } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index 02b657032a..a4447c5dc0 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -520,7 +520,10 @@ export class DatabaseTaskStore implements TaskStore { .where({ id: options.taskId }) .select('workspace'); - await restoreWorkspace(options.targetPath, result.workspace); + await restoreWorkspace({ + path: options.targetPath, + buffer: result.workspace, + }); } async cleanWorkspace({ taskId }: { taskId: string }): Promise { @@ -537,7 +540,7 @@ export class DatabaseTaskStore implements TaskStore { await this.db('tasks') .where({ id: options.taskId }) .update({ - workspace: await serializeWorkspace(options.path), + workspace: (await serializeWorkspace(options)).contents, }); } } diff --git a/plugins/scaffolder-node/src/tasks/serializer.test.ts b/plugins/scaffolder-node/src/tasks/serializer.test.ts index bec5398e28..a0ddfa624d 100644 --- a/plugins/scaffolder-node/src/tasks/serializer.test.ts +++ b/plugins/scaffolder-node/src/tasks/serializer.test.ts @@ -72,8 +72,11 @@ describe('serializer', () => { const restoredWorkspaceDir = createMockDirectory(); it('should be able to archive and restore the workspace', async () => { - const workspaceBuffer = await serializeWorkspace(workspaceDir.path); - await restoreWorkspace(restoredWorkspaceDir.path, workspaceBuffer); + const workspaceBuffer = await serializeWorkspace(workspaceDir); + await restoreWorkspace({ + path: restoredWorkspaceDir.path, + buffer: workspaceBuffer.contents, + }); expect( fs.existsSync(`${restoredWorkspaceDir.path}/\$\{ESCAPE_ME\}.txt`), diff --git a/plugins/scaffolder-node/src/tasks/serializer.ts b/plugins/scaffolder-node/src/tasks/serializer.ts index f9a55a68f4..baf1b42157 100644 --- a/plugins/scaffolder-node/src/tasks/serializer.ts +++ b/plugins/scaffolder-node/src/tasks/serializer.ts @@ -23,20 +23,31 @@ const pipeline = promisify(pipelineCb); /** * Serializes provided path into tar archive * - * @public + * @alpha */ -export const serializeWorkspace = async (path: string): Promise => { - return new Promise(async resolve => { - await pipeline(tar.create({ cwd: path }, ['']), concatStream(resolve)); +export const serializeWorkspace = async (opts: { + path: string; +}): Promise<{ contents: Buffer }> => { + return new Promise<{ contents: Buffer }>(async resolve => { + await pipeline( + tar.create({ cwd: opts.path }, ['']), + concatStream(buffer => { + return resolve({ contents: buffer }); + }), + ); }); }; /** * Rehydrates the provided buffer of tar archive into the provide destination path * - * @public + * @alpha */ -export const restoreWorkspace = async (path: string, buffer?: Buffer) => { +export const restoreWorkspace = async (opts: { + path: string; + buffer?: Buffer; +}): Promise => { + const { buffer, path } = opts; if (buffer) { await pipeline( Readable.from(buffer),