From c0c26244db538dc8751e4e23b72529295445b3c0 Mon Sep 17 00:00:00 2001 From: Himanshu Mishra Date: Mon, 8 Mar 2021 12:44:11 +0100 Subject: [PATCH] 1. Use plain Record instead of Map 2. Call fs.realpath inside the utility function Signed-off-by: Himanshu Mishra --- packages/backend-common/src/util/docker.test.ts | 8 ++++---- packages/backend-common/src/util/docker.ts | 16 ++++++++++------ .../src/stages/generate/techdocs.ts | 11 ++++------- .../stages/templater/cookiecutter.test.ts | 16 ++++++++-------- .../scaffolder/stages/templater/cookiecutter.ts | 10 ++++------ .../src/scaffolder/stages/templater/cra/index.ts | 8 ++++---- 6 files changed, 34 insertions(+), 35 deletions(-) diff --git a/packages/backend-common/src/util/docker.test.ts b/packages/backend-common/src/util/docker.test.ts index 8af6a7366f..a6cc9889fe 100644 --- a/packages/backend-common/src/util/docker.test.ts +++ b/packages/backend-common/src/util/docker.test.ts @@ -57,10 +57,10 @@ describe('runDockerContainer', () => { const imageName = 'dockerOrg/image'; const args = ['bash', '-c', 'echo test']; - const mountDirs = new Map([ - [path.join(rootDir, 'input'), '/input'], - [path.join(rootDir, 'output'), '/output'], - ]); + const mountDirs = { + [path.join(rootDir, 'input')]: '/input', + [path.join(rootDir, 'output')]: '/output', + }; const workingDir = path.join(rootDir, 'input'); const envVars = ['HOME=/tmp', 'LOG_LEVEL=debug']; diff --git a/packages/backend-common/src/util/docker.ts b/packages/backend-common/src/util/docker.ts index f2d1ff6993..4e143a6d1b 100644 --- a/packages/backend-common/src/util/docker.ts +++ b/packages/backend-common/src/util/docker.ts @@ -15,6 +15,7 @@ */ import Docker from 'dockerode'; +import fs from 'fs-extra'; import { PassThrough, Writable } from 'stream'; export type UserOptions = { @@ -26,7 +27,7 @@ export type RunDockerContainerOptions = { args: string[]; logStream?: Writable; dockerClient: Docker; - mountDirs?: Map; + mountDirs?: Record; workingDir?: string; envVars?: string[]; createOptions?: Docker.ContainerCreateOptions; @@ -40,7 +41,7 @@ export type RunDockerContainerOptions = { * @param options.logStream the log streamer to capture log messages * @param options.dockerClient the dockerClient to use * @param options.mountDirs A map of host directories to mount on the container. - * Map Key: Path on host machine, Value: Path on Docker container + * Object Key: Path on host machine, Value: Path on Docker container * @param options.workingDir Working dir in the container * @param options.envVars Environment variables to set in the container. e.g. ['HOME=/tmp'] */ @@ -49,7 +50,7 @@ export const runDockerContainer = async ({ args, logStream = new PassThrough(), dockerClient, - mountDirs = new Map(), + mountDirs = {}, workingDir, envVars = [], createOptions = {}, @@ -85,14 +86,17 @@ export const runDockerContainer = async ({ // Initialize volumes to mount based on mountDirs map const Volumes: { [T: string]: object } = {}; - for (const containerDir of mountDirs.values()) { + for (const containerDir of Object.values(mountDirs)) { Volumes[containerDir] = {}; } // Create bind volumes const Binds: string[] = []; - for (const [hostDir, containerDir] of mountDirs.entries()) { - Binds.push(`${hostDir}:${containerDir}`); + for (const [hostDir, containerDir] of Object.entries(mountDirs)) { + // Need to use realpath here as Docker mounting does not like + // symlinks for binding volumes + const realHostDir = await fs.realpath(hostDir); + Binds.push(`${realHostDir}:${containerDir}`); } const [{ Error: error, StatusCode: statusCode }] = await dockerClient.run( diff --git a/packages/techdocs-common/src/stages/generate/techdocs.ts b/packages/techdocs-common/src/stages/generate/techdocs.ts index ab7b730106..a17ab94a2a 100644 --- a/packages/techdocs-common/src/stages/generate/techdocs.ts +++ b/packages/techdocs-common/src/stages/generate/techdocs.ts @@ -16,7 +16,6 @@ import { runDockerContainer } from '@backstage/backend-common'; import { Config } from '@backstage/config'; -import fs from 'fs-extra'; import path from 'path'; import { PassThrough } from 'stream'; import { Logger } from 'winston'; @@ -80,12 +79,10 @@ export class TechdocsGenerator implements GeneratorBase { } // Directories to bind on container - const mountDirs = new Map([ - // Need to use realpath here as Docker mounting does not like - // symlinks for binding volumes - [await fs.realpath(inputDir), '/input'], - [await fs.realpath(outputDir), '/output'], - ]); + const mountDirs = { + [inputDir]: '/input', + [outputDir]: '/output', + }; try { switch (this.options.runGeneratorIn) { diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts index a48a117639..cadff9e016 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.test.ts @@ -160,10 +160,10 @@ describe('CookieCutter Templater', () => { '--verbose', ], envVars: ['HOME=/tmp'], - mountDirs: new Map([ - [path.join('tempdir', 'template'), '/input'], - [path.join('tempdir', 'intermediate'), '/output'], - ]), + mountDirs: { + [path.join('tempdir', 'template')]: '/input', + [path.join('tempdir', 'intermediate')]: '/output', + }, workingDir: '/input', logStream: undefined, dockerClient: mockDocker, @@ -203,10 +203,10 @@ describe('CookieCutter Templater', () => { '--verbose', ], envVars: ['HOME=/tmp'], - mountDirs: new Map([ - [path.join('tempdir', 'template'), '/input'], - [path.join('tempdir', 'intermediate'), '/output'], - ]), + mountDirs: { + [path.join('tempdir', 'template')]: '/input', + [path.join('tempdir', 'intermediate')]: '/output', + }, workingDir: '/input', logStream: stream, dockerClient: mockDocker, diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts index 39e6d7be42..73822b150e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cookiecutter.ts @@ -59,12 +59,10 @@ export class CookieCutter implements TemplaterBase { await fs.writeJSON(path.join(templateDir, 'cookiecutter.json'), cookieInfo); // Directories to bind on container - const mountDirs = new Map([ - // Need to use realpath here as Docker mounting does not like - // symlinks for binding volumes - [await fs.realpath(templateDir), '/input'], - [await fs.realpath(intermediateDir), '/output'], - ]); + const mountDirs = { + [templateDir]: '/input', + [intermediateDir]: '/output', + }; const cookieCutterInstalled = await commandExists('cookiecutter'); if (cookieCutterInstalled) { diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cra/index.ts b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cra/index.ts index 371586d1da..3006b924d5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/templater/cra/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/templater/cra/index.ts @@ -40,10 +40,10 @@ export class CreateReactAppTemplater implements TemplaterBase { const intermediateDir = path.join(workspacePath, 'template'); await fs.ensureDir(intermediateDir); - const mountDirs = new Map([ - [await fs.realpath(intermediateDir), '/template'], - [await fs.realpath(intermediateDir), '/result'], - ]); + const mountDirs = { + [intermediateDir]: '/template', + [intermediateDir]: '/result', + }; await runDockerContainer({ imageName: 'node:lts-alpine',