From 13f196a4c44682908d9241d47e87e3cc48a8cfc4 Mon Sep 17 00:00:00 2001 From: Walery Strauch Date: Thu, 10 Aug 2023 00:58:42 +0200 Subject: [PATCH] Add ssm lookup as primary value to companyDomain block. --- README.md | 2 +- blocks/companyDomain.js | 16 ++++++++++++++-- test/companyDomain.spec.js | 26 ++++++++++++++++++-------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6f64a20..48df842 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,6 @@ Block | Resolution | Original source `${stencil(account):name}` | acme-playground | API(`Organizations describeAccount`)`.Account.Name` `${stencil(account):unit}` | playground | `${stencil(account):name}.split('-').slice(1).join('-')` `${stencil(account):companyName}` | acme | `${stencil(account):name}.split('-')[0]` -`${stencil(account):companyDomain}` | acme.cloud | `${stencil(account):companyName}`.`${stencil(account):companyTld}` +`${stencil(account):companyDomain}` | acme.cloud | `ssm(us-east-1):/stencil/aws/companyDomain` or `${stencil(account):companyName}`.`${stencil(account):companyTld}` if ssm value is not available `${stencil(account):domain}` | playground.acme.cloud | `${stencil(account):unit}`.`${stencil(account):companyDomain}` `${stencil(account):domainHostedZoneId}` | Z3XXYYAABBCCDD | API(`Route53 listHostedZonesByName`)`.Id` diff --git a/blocks/companyDomain.js b/blocks/companyDomain.js index 091556d..5d62bf4 100644 --- a/blocks/companyDomain.js +++ b/blocks/companyDomain.js @@ -5,7 +5,8 @@ module.exports.resolve = ({variableUtils}) => { return companyDomain; } - companyDomain = new Promise((resolve, reject) => { + const ssmCompanyDomain = variableUtils.resolveVariable('ssm(us-east-1):/stencil/aws/companyDomain'); + const compoundCompanyDomain = () => new Promise((resolve, reject) => { const companyName = variableUtils.resolveVariable('stencil(account):companyName'); const companyTld = variableUtils.resolveVariable('stencil(account):companyTld'); @@ -17,6 +18,17 @@ module.exports.resolve = ({variableUtils}) => { reject(error); }); }); + + companyDomain = new Promise((resolve, reject) => { + ssmCompanyDomain + .then(companyDomainValue => { + resolve(companyDomainValue); + }) + .catch(_ => { + compoundCompanyDomain() + .then(companyDomainValue => resolve(companyDomainValue)) + .catch(error => reject(error)); + }); + }); return companyDomain; }; - diff --git a/test/companyDomain.spec.js b/test/companyDomain.spec.js index 7b5f480..64faccf 100644 --- a/test/companyDomain.spec.js +++ b/test/companyDomain.spec.js @@ -1,12 +1,17 @@ const test = require('ava'); -test.serial('should resolve companyDomain if stencil:companyName and stencil:companyTld provides default values', async t => { - const actual = await resolveCompanyDomain(); +test.serial('should resolve compound companyDomain if ssm:companyDomain is not resolvable and stencil:companyName and stencil:companyTld provides default values', async t => { + const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, + }; + + const actual = await resolveCompanyDomain(mockOverwrites); t.is(actual, 'acme.bar'); }); -test.serial('should resolve companyDomain if stencil:companyName and stencil:companyTld are overwritten', async t => { +test.serial('should resolve compound companyDomain if ssm:companyDomain is not resolvable and stencil:companyName and stencil:companyTld are overwritten', async t => { const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, 'stencil(account):companyName': Promise.resolve('inc'), 'stencil(account):companyTld': Promise.resolve('com'), }; @@ -15,8 +20,9 @@ test.serial('should resolve companyDomain if stencil:companyName and stencil:com t.is(actual, 'inc.com'); }); -test.serial('should reject if stencil:companyTld is not resolvable', async t => { +test.serial('should reject if ssm:companyDomain and stencil:companyTld is not resolvable', async t => { const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, 'stencil(account):companyTld': undefined, }; @@ -27,8 +33,9 @@ test.serial('should reject if stencil:companyTld is not resolvable', async t => t.is(actual.message, 'Unknown variable expression \'stencil(account):companyTld\'.'); }); -test.serial('should reject if stencil:companyName is not resolvable', async t => { +test.serial('should reject if ssm:companyDomain and stencil:companyName is not resolvable', async t => { const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, 'stencil(account):companyName': undefined, }; @@ -39,8 +46,9 @@ test.serial('should reject if stencil:companyName is not resolvable', async t => t.is(actual.message, 'Unknown variable expression \'stencil(account):companyName\'.'); }); -test.serial('should reject if stencil:companyName and stencil:companyTld is not resolvable', async t => { +test.serial('should reject if ssm:companyDomain and stencil:companyName and stencil:companyTld is not resolvable', async t => { const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, 'stencil(account):companyName': undefined, 'stencil(account):companyTld': undefined, }; @@ -57,16 +65,17 @@ test.serial('should return cached result if resolution happens more than once', const actual = await underTest.resolve({ variableUtils: createVariableUtilsMock(), }); - t.is(actual, 'acme.bar'); + t.is(actual, 'ssm.foo'); const mockOverwrites = { + 'ssm(us-east-1):/stencil/aws/companyDomain': undefined, 'stencil(account):companyName': undefined, }; const actualCached = await underTest.resolve({ variableUtils: createVariableUtilsMock(mockOverwrites), }); - t.is(actualCached, 'acme.bar'); + t.is(actualCached, 'ssm.foo'); }); const resolveCompanyDomain = (overwrites = {}) => { @@ -83,6 +92,7 @@ const createUncachedInstance = () => { const createVariableUtilsMock = overwrites => { const resolveVariableValues = { + 'ssm(us-east-1):/stencil/aws/companyDomain': Promise.resolve('ssm.foo'), 'stencil(account):companyName': Promise.resolve('acme'), 'stencil(account):companyTld': Promise.resolve('bar'), };