Skip to content

Commit 0af8946

Browse files
refactor: use Joi schema to validate alarms schema
1 parent 6edf2c8 commit 0af8946

File tree

2 files changed

+51
-21
lines changed

2 files changed

+51
-21
lines changed

lib/deploy/stepFunctions/compileAlarms.js

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22
const _ = require('lodash');
33
const BbPromise = require('bluebird');
4+
const Joi = require('@hapi/joi');
5+
const schema = require('./compileAlarms.schema');
46

57
const cloudWatchMetricNames = {
68
executionsTimeOut: 'ExecutionsTimeOut',
@@ -85,29 +87,13 @@ function validateConfig(serverless, stateMachineName, alarmsObj) {
8587
return false;
8688
}
8789

88-
// metrics can be either short form (e.g. "executionsTimeOut") or
89-
// long form, which allows you to optionally specify treatMissingData override, e.g.
90-
// { "metric": "executionsTimeOut", "treatMissingData": "ignore" }
91-
const validateMetric = x =>
92-
_.isString(x) ||
93-
(_.isObject(x) && _.has(x, 'metric') && _.isString(x.metric));
90+
const { error } = Joi.validate(alarmsObj, schema, { allowUnknown: false });
9491

95-
if (!_.isObject(alarmsObj.topics) ||
96-
!_.isArray(alarmsObj.metrics) ||
97-
!_.every(alarmsObj.metrics, validateMetric)) {
92+
if (error) {
9893
serverless.cli.consoleLog(
99-
`state machine [${stateMachineName}] : alarms config is malformed. ` +
100-
'Please see https://github.com/horike37/serverless-step-functions for examples');
101-
return false;
102-
}
103-
104-
if (!_.has(alarmsObj.topics, 'ok') &&
105-
!_.has(alarmsObj.topics, 'alarm') &&
106-
!_.has(alarmsObj.topics, 'insufficientData')) {
107-
serverless.cli.consoleLog(
108-
`state machine [${stateMachineName}] : alarms config is malformed. ` +
109-
"alarms.topics must specify 'ok', 'alarms' or 'insufficientData'"
110-
);
94+
`State machine [${stateMachineName}] : alarms config is malformed. ` +
95+
'Please see https://github.com/horike37/serverless-step-functions for examples. ' +
96+
`${error}`);
11197
return false;
11298
}
11399

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const Joi = require('@hapi/joi');
2+
3+
const arn = Joi.alternatives().try(
4+
Joi.string(),
5+
Joi.object().keys({
6+
Ref: Joi.string(),
7+
}),
8+
Joi.object().keys({
9+
'Fn::GetAtt': Joi.array().items(Joi.string()),
10+
})
11+
);
12+
13+
const topics = Joi.object().keys({
14+
ok: arn,
15+
alarm: arn,
16+
insufficientData: arn,
17+
}).or('ok', 'alarm', 'insufficientData');
18+
19+
const treatMissingData = Joi.string()
20+
.allow('missing', 'ignore', 'breaching', 'notBreaching')
21+
.default('missing');
22+
23+
const simpleMetric = Joi.string()
24+
.allow('executionsTimeOut', 'executionsFailed', 'executionsAborted', 'executionThrottled');
25+
26+
const complexMetric = Joi.object().keys({
27+
metric: simpleMetric.required(),
28+
treatMissingData,
29+
});
30+
31+
const metric = Joi.alternatives().try(
32+
simpleMetric,
33+
complexMetric
34+
);
35+
36+
const metrics = Joi.array().items(metric).min(1);
37+
38+
const schema = Joi.object().keys({
39+
topics: topics.required(),
40+
metrics: metrics.required(),
41+
treatMissingData,
42+
});
43+
44+
module.exports = schema;

0 commit comments

Comments
 (0)