Skip to content

Commit

Permalink
fix: add Error message to macro response
Browse files Browse the repository at this point in the history
  • Loading branch information
eoinsha committed Nov 4, 2023
1 parent 84bd817 commit 32d2e06
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 19 deletions.
2 changes: 1 addition & 1 deletion cdk-test-project/source/general-stack.ts
Expand Up @@ -41,7 +41,7 @@ export class CdkTestGeneralStack extends cdk.Stack {

const topic = new sns.Topic(this, 'MyTopic')
this.templateOptions.metadata.slicWatch.alarmActionsConfig = {
alarmActions: topic.topicArn
alarmActions: [topic.topicArn]
}

const helloFunction = new lambda.Function(this, 'HelloHandler',
Expand Down
36 changes: 24 additions & 12 deletions cf-macro/index.ts
Expand Up @@ -4,49 +4,61 @@ import pino from 'pino'
import { addAlarms, addDashboard, getResourcesByType } from '../core/index'
import { setLogger } from 'slic-watch-core/logging'
import { type SlicWatchConfig, resolveSlicWatchConfig } from 'slic-watch-core/inputs/general-config'
import { type Template } from 'cloudform-types'

const logger = pino({ name: 'macroHandler' })
setLogger(logger)

interface Event {
requestId?
status?: string
fragment
requestId: string
fragment: Template
}

// macro requires handler to be async
export async function handler (event: Event) {
interface MacroResponse {
requestId: string
status: string
errorMessage?: string
fragment?: Template
}

/**
* CloudFormation Macro implementation. Accepts the CloudFormation fragment to be transformed
* and generates the transformed teamplte with alarms and dashboard
*/
export async function handler (event: Event): Promise<MacroResponse> {
let status = 'success'
let errorMessage: string | undefined

logger.info({ event })
const outputFragment = event.fragment
const transformedTemplate = event.fragment
let outputFragment: Template | undefined
try {
const slicWatchConfig: SlicWatchConfig = outputFragment.Metadata?.slicWatch ?? {}
const slicWatchConfig: SlicWatchConfig = transformedTemplate.Metadata?.slicWatch ?? {}

const config = resolveSlicWatchConfig(slicWatchConfig)

const functionAlarmConfigs = {}
const functionDashboardConfigs = {}

const lambdaResources = getResourcesByType('AWS::Lambda::Function', outputFragment)
const lambdaResources = getResourcesByType('AWS::Lambda::Function', transformedTemplate)

for (const [funcResourceName, funcResource] of Object.entries(lambdaResources)) {
const funcConfig = funcResource.Metadata?.slicWatch ?? {}
functionAlarmConfigs[funcResourceName] = funcConfig.alarms ?? {}
functionDashboardConfigs[funcResourceName] = funcConfig.dashboard
}

_.merge(outputFragment)
addAlarms(config.alarms, functionAlarmConfigs, config.alarmActionsConfig, outputFragment)
addDashboard(config.dashboard, functionDashboardConfigs, outputFragment)
_.merge(transformedTemplate)
addAlarms(config.alarms, functionAlarmConfigs, config.alarmActionsConfig, transformedTemplate)
addDashboard(config.dashboard, functionDashboardConfigs, transformedTemplate)
outputFragment = transformedTemplate
} catch (err) {
logger.error(err)
errorMessage = (err as Error).message
status = 'fail'
}

logger.info({ outputFragment })
logger.info({ outputFragment: transformedTemplate })

return {
status,
Expand Down
2 changes: 1 addition & 1 deletion cf-macro/tests/index.test.ts
Expand Up @@ -64,7 +64,7 @@ test('Macro adds dashboard and alarms if no function configuration is provided',
}
}
}
const compiledTemplate = await (await handler(testEvent)).fragment
const compiledTemplate = (await handler(testEvent)).fragment
t.same(compiledTemplate.Resources.Properties, template.Resources?.Properties)
t.end()
})
Expand Down
4 changes: 2 additions & 2 deletions core/alarms/tests/sqs.test.ts
@@ -1,5 +1,5 @@
import { test } from 'tap'

import type { AlarmProperties } from 'cloudform-types/types/cloudWatch/alarm'
import createSQSAlarms from '../sqs'
import { getResourcesByType } from '../../cf-template'
import type { ResourceType } from '../../cf-template'
Expand Down Expand Up @@ -48,7 +48,7 @@ test('SQS alarms are created', (t) => {
function getAlarmsByType (): AlarmsByType {
const alarmsByType = {}
for (const alarmResource of Object.values(alarmResources)) {
const al = alarmResource.Properties
const al = alarmResource.Properties as AlarmProperties
assertCommonAlarmProperties(t, al)
const alarmType = alarmNameToType(al?.AlarmName)
alarmsByType[alarmType] = alarmsByType[alarmType] ?? new Set()
Expand Down
9 changes: 6 additions & 3 deletions core/tests/testing-utils.ts
@@ -1,5 +1,6 @@
import _ from 'lodash'
import type Template from 'cloudform-types/types/template'
import type { AlarmProperties } from 'cloudform-types/types/cloudWatch/alarm'

import { cascade } from '../inputs/cascading-config'
import _defaultCfTemplate from '../cf-resources/cloudformation-template-stack.json'
Expand All @@ -10,13 +11,15 @@ const defaultCfTemplate = _defaultCfTemplate as Template
const albCfTemplate = _albCfTemplate as Template
const appSyncCfTemplate = _appSyncCfTemplate as unknown as Template

const testAlarmActionsConfig: AlarmActionsConfig = { alarmActions: ['dummy-arn'], actionsEnabled: true }
const testAlarmActionsConfig: AlarmActionsConfig = { alarmActions: ['dummy-arn'], okActions: ['dummy-arn-2'], actionsEnabled: true }

function assertCommonAlarmProperties (t, al) {
function assertCommonAlarmProperties (t, al: AlarmProperties) {
t.ok(al.AlarmDescription)
t.ok(al.ActionsEnabled)
t.equal(al.AlarmActions.length, 1)
t.ok(al.AlarmActions)
t.equal((al.AlarmActions as string[]).length, 1)
t.ok(al.OKActions)
t.equal((al.OKActions as string[]).length, 1)
t.ok(al.ComparisonOperator)
}

Expand Down

0 comments on commit 32d2e06

Please sign in to comment.