From a771c791d6f4ea7c941f8354213756397a2c7acd Mon Sep 17 00:00:00 2001 From: ElaineDeMattosSilvaB Date: Mon, 7 Oct 2024 23:14:20 +0200 Subject: [PATCH] feat: fix actions Signed-off-by: ElaineDeMattosSilvaB --- .../src/actions/fetch/cookiecutter.test.ts | 18 ++++---- .../src/actions/fetch/cookiecutter.ts | 29 +++++------- .../src/actions/fetch/rails/index.test.ts | 14 +++--- .../src/actions/fetch/rails/index.ts | 18 +++----- .../fetch/rails/railsNewRunner.test.ts | 44 +++++++++---------- .../src/actions/fetch/rails/railsNewRunner.ts | 16 +++---- 6 files changed, 64 insertions(+), 75 deletions(-) diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts index 52946ce7fd..c88c7cde54 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.test.ts @@ -15,16 +15,16 @@ */ import { ContainerRunner } from '@backstage/backend-common'; -import { ConfigReader } from '@backstage/config'; -import { JsonObject } from '@backstage/types'; -import { ScmIntegrations } from '@backstage/integration'; +import { UrlReaderService } from '@backstage/backend-plugin-api'; import { createMockDirectory } from '@backstage/backend-test-utils'; -import { createFetchCookiecutterAction } from './cookiecutter'; -import { join } from 'path'; +import { ConfigReader } from '@backstage/config'; +import { ScmIntegrations } from '@backstage/integration'; import type { ActionContext } from '@backstage/plugin-scaffolder-node'; import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; -import { Writable } from 'stream'; -import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { JsonObject } from '@backstage/types'; +import { join } from 'path'; +import { Logger } from 'winston'; +import { createFetchCookiecutterAction } from './cookiecutter'; const executeShellCommand = jest.fn(); const commandExists = jest.fn(); @@ -168,7 +168,7 @@ describe('fetch:cookiecutter', () => { join(mockTmpDir, 'template'), '--verbose', ], - logStream: expect.any(Writable), + logger: expect.any(Logger), }), ); }); @@ -189,7 +189,7 @@ describe('fetch:cookiecutter', () => { }, workingDir: '/input', envVars: { HOME: '/tmp' }, - logStream: expect.any(Writable), + logger: expect.any(Logger), }), ); }); diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts index 6e540d7fca..1b61376a31 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts +++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts @@ -19,18 +19,18 @@ import { UrlReaderService, resolveSafeChildPath, } from '@backstage/backend-plugin-api'; -import { JsonObject, JsonValue } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; +import { + createTemplateAction, + executeShellCommand, + fetchContents, +} from '@backstage/plugin-scaffolder-node'; +import { JsonObject, JsonValue } from '@backstage/types'; import commandExists from 'command-exists'; import fs from 'fs-extra'; import path, { resolve as resolvePath } from 'path'; -import { PassThrough, Writable } from 'stream'; -import { - createTemplateAction, - fetchContents, - executeShellCommand, -} from '@backstage/plugin-scaffolder-node'; +import { Logger } from 'winston'; import { examples } from './cookiecutter.examples'; export class CookiecutterRunner { @@ -57,14 +57,14 @@ export class CookiecutterRunner { public async run({ workspacePath, values, - logStream, + logger, imageName, templateDir, templateContentsDir, }: { workspacePath: string; values: JsonObject; - logStream: Writable; + logger: Logger; imageName?: string; templateDir: string; templateContentsDir: string; @@ -99,7 +99,7 @@ export class CookiecutterRunner { await executeShellCommand({ command: 'cookiecutter', args: ['--no-input', '-o', intermediateDir, templateDir, '--verbose'], - logStream, + logger, }); } else { if (this.containerRunner === undefined) { @@ -116,7 +116,7 @@ export class CookiecutterRunner { // Set the home directory inside the container as something that applications can // write to, otherwise they will just fail trying to write to / envVars: { HOME: '/tmp' }, - logStream, + logger, }); } @@ -247,15 +247,10 @@ export function createFetchCookiecutterAction(options: { _extensions: ctx.input.extensions, }; - const logStream = new PassThrough(); - logStream.on('data', chunk => { - ctx.logger.info(chunk.toString()); - }); - // Will execute the template in ./template and put the result in ./result await cookiecutter.run({ workspacePath: workDir, - logStream, + logger: ctx.logger, values: values, imageName: ctx.input.imageName, templateDir: templateDir, diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts index 616c90e0de..3ea3e01bef 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.test.ts @@ -28,15 +28,15 @@ jest.mock('./railsNewRunner', () => { }); import { ContainerRunner } from '@backstage/backend-common'; +import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { createMockDirectory } from '@backstage/backend-test-utils'; import { ConfigReader } from '@backstage/config'; import { ScmIntegrations } from '@backstage/integration'; -import { resolve as resolvePath } from 'path'; -import { createFetchRailsAction } from './index'; import { fetchContents } from '@backstage/plugin-scaffolder-node'; -import { createMockDirectory } from '@backstage/backend-test-utils'; import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils'; -import { Writable } from 'stream'; -import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { resolve as resolvePath } from 'path'; +import { Logger } from 'winston'; +import { createFetchRailsAction } from './index'; describe('fetch:rails', () => { const mockDir = createMockDirectory(); @@ -106,7 +106,7 @@ describe('fetch:rails', () => { expect(mockRailsTemplater.run).toHaveBeenCalledWith({ workspacePath: mockContext.workspacePath, - logStream: expect.any(Writable), + logger: expect.any(Logger), values: mockContext.input.values, }); }); @@ -122,7 +122,7 @@ describe('fetch:rails', () => { expect(mockRailsTemplater.run).toHaveBeenCalledWith({ workspacePath: mockContext.workspacePath, - logStream: expect.any(Writable), + logger: expect.any(Logger), values: { ...mockContext.input.values, imageName: 'foo/rails-custom-image', diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts index 4d5db0f3ef..223aeb19a2 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/index.ts @@ -15,20 +15,19 @@ */ import { ContainerRunner } from '@backstage/backend-common'; -import { JsonObject } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; -import fs from 'fs-extra'; import { createTemplateAction, fetchContents, } from '@backstage/plugin-scaffolder-node'; +import { JsonObject } from '@backstage/types'; +import fs from 'fs-extra'; -import { resolve as resolvePath } from 'path'; -import { RailsNewRunner } from './railsNewRunner'; -import { PassThrough } from 'stream'; -import { examples } from './index.examples'; import { UrlReaderService } from '@backstage/backend-plugin-api'; +import { resolve as resolvePath } from 'path'; +import { examples } from './index.examples'; +import { RailsNewRunner } from './railsNewRunner'; /** * Creates the `fetch:rails` Scaffolder action. @@ -219,15 +218,10 @@ export function createFetchRailsAction(options: { throw new Error(`Image ${imageName} is not allowed`); } - const logStream = new PassThrough(); - logStream.on('data', chunk => { - ctx.logger.info(chunk.toString()); - }); - // Will execute the template in ./template and put the result in ./result await templateRunner.run({ workspacePath: workDir, - logStream, + logger: ctx.logger, values: { ...ctx.input.values, imageName }, }); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts index 47104c66e1..2fd1b954c2 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.test.ts @@ -28,10 +28,10 @@ jest.mock( ); import { ContainerRunner } from '@backstage/backend-common'; -import path from 'path'; -import { PassThrough } from 'stream'; -import { RailsNewRunner } from './railsNewRunner'; import { createMockDirectory } from '@backstage/backend-test-utils'; +import path from 'path'; +import { Logger } from 'winston'; +import { RailsNewRunner } from './railsNewRunner'; describe('Rails Templater', () => { const containerRunner: jest.Mocked = { @@ -47,7 +47,7 @@ describe('Rails Templater', () => { describe('when running on docker', () => { it('should run the correct bindings for the volumes', async () => { - const logStream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', storePath: 'https://github.com/angeliski/rails-project', @@ -65,7 +65,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream, + logger, }); expect(containerRunner.runContainer).toHaveBeenCalledWith({ @@ -78,12 +78,12 @@ describe('Rails Templater', () => { [path.join(mockDir.path, 'intermediate')]: '/output', }, workingDir: '/input', - logStream: logStream, + logger: logger, }); }); it('should use the provided imageName', async () => { - const logStream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', storePath: 'https://github.com/angeliski/rails-project', @@ -101,7 +101,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream, + logger, }); expect(containerRunner.runContainer).toHaveBeenCalledWith( @@ -112,7 +112,7 @@ describe('Rails Templater', () => { }); it('should pass through the streamer to the run docker helper', async () => { - const stream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', @@ -131,7 +131,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream: stream, + logger, }); expect(containerRunner.runContainer).toHaveBeenCalledWith({ @@ -144,12 +144,12 @@ describe('Rails Templater', () => { [path.join(mockDir.path, 'intermediate')]: '/output', }, workingDir: '/input', - logStream: stream, + logger, }); }); it('update the template path to correct location', async () => { - const logStream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', storePath: 'https://github.com/angeliski/rails-project', @@ -168,7 +168,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream, + logger, }); expect(containerRunner.runContainer).toHaveBeenCalledWith({ @@ -186,14 +186,14 @@ describe('Rails Templater', () => { [path.join(mockDir.path, 'intermediate')]: '/output', }, workingDir: '/input', - logStream: logStream, + logger, }); }); }); describe('when rails is available', () => { it('use the binary', async () => { - const stream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', @@ -213,7 +213,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream: stream, + logger, }); expect(executeShellCommand).toHaveBeenCalledWith({ @@ -222,12 +222,12 @@ describe('Rails Templater', () => { 'new', path.join(mockDir.path, 'intermediate', 'rails-project'), ]), - logStream: stream, + logger, }); }); it('update the template path to correct location', async () => { - const stream = new PassThrough(); + const logger = new Logger(); const values = { owner: 'angeliski', @@ -248,7 +248,7 @@ describe('Rails Templater', () => { await templater.run({ workspacePath: mockDir.path, values, - logStream: stream, + logger, }); expect(executeShellCommand).toHaveBeenCalledWith({ @@ -259,14 +259,14 @@ describe('Rails Templater', () => { '--template', path.join(mockDir.path, './something.rb'), ]), - logStream: stream, + logger, }); }); }); describe('when nothing was generated', () => { it('throws an error', async () => { - const stream = new PassThrough(); + const logger = new Logger(); mockDir.setContent({ intermediate: {}, @@ -282,7 +282,7 @@ describe('Rails Templater', () => { name: 'rails-project', imageName: 'foo/rails-custom-image', }, - logStream: stream, + logger, }), ).rejects.toThrow(/No data generated by rails/); }); diff --git a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts index 31cfea4a76..386e7b427f 100644 --- a/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts +++ b/plugins/scaffolder-backend-module-rails/src/actions/fetch/rails/railsNewRunner.ts @@ -15,16 +15,16 @@ */ import { ContainerRunner } from '@backstage/backend-common'; +import { executeShellCommand } from '@backstage/plugin-scaffolder-node'; +import { JsonObject } from '@backstage/types'; +import commandExists from 'command-exists'; import fs from 'fs-extra'; import path from 'path'; -import { executeShellCommand } from '@backstage/plugin-scaffolder-node'; -import commandExists from 'command-exists'; +import { Logger } from 'winston'; import { railsArgumentResolver, RailsRunOptions, } from './railsArgumentResolver'; -import { JsonObject } from '@backstage/types'; -import { Writable } from 'stream'; export class RailsNewRunner { private readonly containerRunner?: ContainerRunner; @@ -36,11 +36,11 @@ export class RailsNewRunner { public async run({ workspacePath, values, - logStream, + logger, }: { workspacePath: string; values: JsonObject; - logStream: Writable; + logger: Logger; }): Promise { const intermediateDir = path.join(workspacePath, 'intermediate'); await fs.ensureDir(intermediateDir); @@ -71,7 +71,7 @@ export class RailsNewRunner { `${intermediateDir}${path.sep}${name}`, ...arrayExtraArguments, ], - logStream, + logger, }); } else { if (!imageName) { @@ -96,7 +96,7 @@ export class RailsNewRunner { // Set the home directory inside the container as something that applications can // write to, otherwise they will just fail trying to write to / envVars: { HOME: '/tmp' }, - logStream, + logger, }); }