From 6da3cc8fec2fa9f04c4645e82a35ad0ccd5182a8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 12 Jun 2020 18:13:56 +0200 Subject: [PATCH] packages/config-loader: move readSecret and secret reading switch to context --- packages/config-loader/src/lib/index.ts | 1 + packages/config-loader/src/lib/reader.ts | 3 +- packages/config-loader/src/lib/secrets.ts | 4 -- packages/config-loader/src/lib/types.ts | 7 ++- packages/config-loader/src/loader.ts | 52 ++++++++++++++++++----- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/packages/config-loader/src/lib/index.ts b/packages/config-loader/src/lib/index.ts index c0b6fbc93b..226932784b 100644 --- a/packages/config-loader/src/lib/index.ts +++ b/packages/config-loader/src/lib/index.ts @@ -17,3 +17,4 @@ export { resolveStaticConfig } from './resolver'; export { readConfigFile } from './reader'; export { readEnv } from './env'; +export { readSecret } from './secrets'; diff --git a/packages/config-loader/src/lib/reader.ts b/packages/config-loader/src/lib/reader.ts index 160e45417e..7ff514b0e2 100644 --- a/packages/config-loader/src/lib/reader.ts +++ b/packages/config-loader/src/lib/reader.ts @@ -16,7 +16,6 @@ import yaml from 'yaml'; import { isObject } from './utils'; -import { readSecret } from './secrets'; import { JsonValue, JsonObject } from '@backstage/config'; import { ReaderContext } from './types'; @@ -51,7 +50,7 @@ export async function readConfigFile(filePath: string, ctx: ReaderContext) { } try { - return await readSecret(obj.$secret, ctx); + return await ctx.readSecret(obj.$secret); } catch (error) { throw new Error(`Invalid secret at ${path}: ${error.message}`); } diff --git a/packages/config-loader/src/lib/secrets.ts b/packages/config-loader/src/lib/secrets.ts index 797b9d1f44..44c07d9822 100644 --- a/packages/config-loader/src/lib/secrets.ts +++ b/packages/config-loader/src/lib/secrets.ts @@ -87,10 +87,6 @@ export async function readSecret( data: JsonObject, ctx: ReaderContext, ): Promise { - if (!ctx.shouldReadSecrets) { - return undefined; - } - const secret = secretSchema.validateSync(data) as Secret; if ('file' in secret) { diff --git a/packages/config-loader/src/lib/types.ts b/packages/config-loader/src/lib/types.ts index bde324a3c1..ba552537d0 100644 --- a/packages/config-loader/src/lib/types.ts +++ b/packages/config-loader/src/lib/types.ts @@ -14,10 +14,13 @@ * limitations under the License. */ +import { JsonObject } from '@backstage/config'; + export type ReadFileFunc = (path: string) => Promise; +export type ReadSecretFunc = (desc: JsonObject) => Promise; export type ReaderContext = { - shouldReadSecrets: boolean; - readFile: ReadFileFunc; env: { [name in string]?: string }; + readFile: ReadFileFunc; + readSecret: ReadSecretFunc; }; diff --git a/packages/config-loader/src/loader.ts b/packages/config-loader/src/loader.ts index 8f4ffdcecf..1b6c8f34da 100644 --- a/packages/config-loader/src/loader.ts +++ b/packages/config-loader/src/loader.ts @@ -16,8 +16,13 @@ import fs from 'fs-extra'; import { resolve as resolvePath, dirname } from 'path'; -import { AppConfig } from '@backstage/config'; -import { resolveStaticConfig, readConfigFile, readEnv } from './lib'; +import { AppConfig, JsonObject } from '@backstage/config'; +import { + resolveStaticConfig, + readConfigFile, + readEnv, + readSecret, +} from './lib'; export type LoadConfigOptions = { // Config path, defaults to app-config.yaml in project root @@ -27,6 +32,32 @@ export type LoadConfigOptions = { shouldReadSecrets?: boolean; }; +class Context { + constructor( + private readonly options: { + env: { [name in string]?: string }; + rootPath: string; + shouldReadSecrets: boolean; + }, + ) {} + + get env() { + return this.options.env; + } + + async readFile(path: string): Promise { + return fs.readFile(resolvePath(this.options.rootPath, path), 'utf8'); + } + + async readSecret(desc: JsonObject): Promise { + if (!this.options.shouldReadSecrets) { + return undefined; + } + + return readSecret(desc, this); + } +} + export async function loadConfig( options: LoadConfigOptions = {}, ): Promise { @@ -38,15 +69,14 @@ export async function loadConfig( try { for (const configPath of configPaths) { - const rootPath = dirname(configPath); - - const config = await readConfigFile(configPath, { - env: process.env, - shouldReadSecrets: Boolean(options.shouldReadSecrets), - readFile: (path: string) => { - return fs.readFile(resolvePath(rootPath, path), 'utf8'); - }, - }); + const config = await readConfigFile( + configPath, + new Context({ + env: process.env, + rootPath: dirname(configPath), + shouldReadSecrets: Boolean(options.shouldReadSecrets), + }), + ); configs.push(config); }