From 05f696ced14d8693dfc2c05449140ce57d72483f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 23 Jan 2021 17:14:56 +0100 Subject: [PATCH] config-loader: remove deprecated $data secret support --- .../config-loader/src/lib/secrets.test.ts | 43 ++--------------- packages/config-loader/src/lib/secrets.ts | 48 +------------------ 2 files changed, 6 insertions(+), 85 deletions(-) diff --git a/packages/config-loader/src/lib/secrets.test.ts b/packages/config-loader/src/lib/secrets.test.ts index 189834f3aa..5dd06a9680 100644 --- a/packages/config-loader/src/lib/secrets.test.ts +++ b/packages/config-loader/src/lib/secrets.test.ts @@ -55,36 +55,6 @@ describe('readSecret', () => { ); }); - it('should read data secrets', async () => { - // Deprecated object form - await expect( - readSecret({ data: 'my-data.json', path: 'a.b.c' }, ctx), - ).resolves.toBe('42'); - await expect( - readSecret({ data: 'my-data.yaml', path: 'some.yaml.key' }, ctx), - ).resolves.toBe('7'); - await expect( - readSecret({ data: 'my-data.yml', path: 'different.key' }, ctx), - ).resolves.toBe('hello'); - await expect( - readSecret({ data: 'no-data.yml', path: 'different.key' }, ctx), - ).rejects.toThrow('File not found!'); - - // New format with path in fragment - await expect(readSecret({ data: 'my-data.json#a.b.c' }, ctx)).resolves.toBe( - '42', - ); - await expect( - readSecret({ data: 'my-data.yaml#some.yaml.key' }, ctx), - ).resolves.toBe('7'); - await expect( - readSecret({ data: 'my-data.yml#different.key' }, ctx), - ).resolves.toBe('hello'); - await expect( - readSecret({ data: 'no-data.yml#different.key' }, ctx), - ).rejects.toThrow('File not found!'); - }); - it('should include extra files', async () => { // New format with path in fragment await expect( @@ -125,19 +95,16 @@ describe('readSecret', () => { 'secret must be a `object` type, but the final value was: `"hello"`.', ); await expect(readSecret({}, ctx)).rejects.toThrow( - "Secret must contain one of 'file', 'env', 'data'", + "Secret must contain one of 'file', 'env', 'include'", ); await expect(readSecret({ unknown: 'derp' }, ctx)).rejects.toThrow( - "Secret must contain one of 'file', 'env', 'data'", + "Secret must contain one of 'file', 'env', 'include'", ); - await expect(readSecret({ data: 'no-data.yml' }, ctx)).rejects.toThrow( - "Invalid format for data secret value, must be of the form #, got 'no-data.yml'", + await expect(readSecret({ include: 'no-parser.js' }, ctx)).rejects.toThrow( + 'No data secret parser available for extension .js', ); await expect( - readSecret({ data: 'no-parser.js', path: '.' }, ctx), - ).rejects.toThrow('No data secret parser available for extension .js'); - await expect( - readSecret({ data: 'my-data.yaml', path: 'some.wrong.yaml.key' }, ctx), + readSecret({ include: 'my-data.yaml#some.wrong.yaml.key' }, ctx), ).rejects.toThrow('Value is not an object at some.wrong in my-data.yaml'); }); diff --git a/packages/config-loader/src/lib/secrets.ts b/packages/config-loader/src/lib/secrets.ts index b0e0a0dd7b..4ce87c6ace 100644 --- a/packages/config-loader/src/lib/secrets.ts +++ b/packages/config-loader/src/lib/secrets.ts @@ -33,21 +33,12 @@ type EnvSecret = { env: string; }; -// Reads a secret from a json-like file and extracts a value at a path. -// The supported extensions are define in dataSecretParser below. -type DataSecret = { - // Path to the data secret file, relative to the config file. - data: string; - // The path to the value inside the data file, each element separated by '.'. - path?: string; -}; - // TODO(Rugvip): Move this out of secret reading when we remove the deprecated DataSecret and $secret format type IncludeSecret = { include: string; }; -type Secret = FileSecret | EnvSecret | DataSecret | IncludeSecret; +type Secret = FileSecret | EnvSecret | IncludeSecret; // Schema for each type of secret description const secretLoaderSchemas = { @@ -57,9 +48,6 @@ const secretLoaderSchemas = { env: yup.object({ env: yup.string().required(), }), - data: yup.object({ - data: yup.string().required(), - }), include: yup.object({ include: yup.string().required(), }), @@ -111,40 +99,6 @@ export async function readSecret( if ('env' in secret) { return ctx.env[secret.env]; } - if ('data' in secret) { - console.warn( - `Configuration uses deprecated $data key, use $include instead.`, - ); - const url = - 'path' in secret ? `${secret.data}#${secret.path}` : secret.data; - const [filePath, dataPath] = url.split(/#(.*)/); - if (!dataPath) { - throw new Error( - `Invalid format for data secret value, must be of the form #, got '${url}'`, - ); - } - - const ext = extname(filePath); - const parser = dataSecretParser[ext]; - if (!parser) { - throw new Error(`No data secret parser available for extension ${ext}`); - } - - const content = await ctx.readFile(filePath); - - const parts = dataPath.split('.'); - - let value: JsonValue | undefined = await parser(content); - for (const [index, part] of parts.entries()) { - if (!isObject(value)) { - const errPath = parts.slice(0, index).join('.'); - throw new Error(`Value is not an object at ${errPath} in ${filePath}`); - } - value = value[part]; - } - - return String(value); - } if ('include' in secret) { const [filePath, dataPath] = secret.include.split(/#(.*)/);