Skip to content

Commit 87bf472

Browse files
lopburnylopburny
lopburny
authored andcommitted
feat: support v3 new log api
1 parent d76d3b1 commit 87bf472

11 files changed

+602
-385
lines changed

lib/deploy/stepFunctions/compileAlarms.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const BbPromise = require('bluebird');
55
const Joi = require('@hapi/joi');
66
const schema = require('./compileAlarms.schema');
77

8+
let log;
9+
810
const cloudWatchMetricNames = {
911
executionsTimedOut: 'ExecutionsTimedOut',
1012
executionsFailed: 'ExecutionsFailed',
@@ -39,7 +41,7 @@ function getCloudWatchAlarms(
3941
);
4042

4143
if (!_.isEmpty(invalid)) {
42-
serverless.cli.consoleLog(
44+
log(
4345
`state machine [${stateMachineName}] : alarms.metrics has invalid metrics `,
4446
`[${invalid.join(',')}]. `
4547
+ 'No CloudWatch Alarms would be created for these. '
@@ -96,7 +98,7 @@ function validateConfig(serverless, stateMachineName, alarmsObj) {
9698
const { error } = Joi.validate(alarmsObj, schema, { allowUnknown: false });
9799

98100
if (error) {
99-
serverless.cli.consoleLog(
101+
log(
100102
`State machine [${stateMachineName}] : alarms config is malformed. `
101103
+ 'Please see https://github.com/horike37/serverless-step-functions for examples. '
102104
+ `${error}`,
@@ -109,6 +111,7 @@ function validateConfig(serverless, stateMachineName, alarmsObj) {
109111

110112
module.exports = {
111113
compileAlarms() {
114+
log = this.log;
112115
const cloudWatchAlarms = _.flatMap(this.getAllStateMachines(), (name) => {
113116
const stateMachineObj = this.getStateMachine(name);
114117
const stateMachineLogicalId = this.getStateMachineLogicalId(name, stateMachineObj);

lib/deploy/stepFunctions/compileIamRole.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const path = require('path');
66
const { isIntrinsic, translateLocalFunctionNames, trimAliasFromLambdaArn } = require('../../utils/aws');
77
const { getArnPartition } = require('../../utils/arn');
88

9+
let log;
10+
911
function getTaskStates(states) {
1012
return _.flatMap(states, (state) => {
1113
switch (state.Type) {
@@ -49,7 +51,7 @@ function sqsQueueUrlToArn(serverless, queueUrl) {
4951
// we need to use "*" as ARN
5052
return '*';
5153
}
52-
serverless.cli.consoleLog(`Unable to parse SQS queue url [${queueUrl}]`);
54+
log(`Unable to parse SQS queue url [${queueUrl}]`);
5355
return [];
5456
}
5557

@@ -62,7 +64,7 @@ function getSqsPermissions(serverless, state) {
6264
: sqsQueueUrlToArn(serverless, state.Parameters.QueueUrl);
6365
return [{ action: 'sqs:SendMessage', resource: queueArn }];
6466
}
65-
serverless.cli.consoleLog('SQS task missing Parameters.QueueUrl or Parameters.QueueUrl.$');
67+
log('SQS task missing Parameters.QueueUrl or Parameters.QueueUrl.$');
6668
return [];
6769
}
6870

@@ -73,7 +75,7 @@ function getSnsPermissions(serverless, state) {
7375
const topicArn = state.Parameters['TopicArn.$'] ? '*' : state.Parameters.TopicArn;
7476
return [{ action: 'sns:Publish', resource: topicArn }];
7577
}
76-
serverless.cli.consoleLog('SNS task missing Parameters.TopicArn or Parameters.TopicArn.$');
78+
log('SNS task missing Parameters.TopicArn or Parameters.TopicArn.$');
7779
return [];
7880
}
7981

@@ -478,7 +480,7 @@ function getIamPermissions(taskStates) {
478480
],
479481
}];
480482
}
481-
this.serverless.cli.consoleLog('Cannot generate IAM policy statement for Task state', state);
483+
this.log('Cannot generate IAM policy statement for Task state', state);
482484
return [];
483485
}
484486
});
@@ -505,6 +507,7 @@ function getIamStatements(iamPermissions) {
505507

506508
module.exports = {
507509
compileIamRole() {
510+
log = this.log;
508511
this.getAllStateMachines().forEach((stateMachineName) => {
509512
const stateMachineObj = this.getStateMachine(stateMachineName);
510513
if (stateMachineObj.role) {

lib/deploy/stepFunctions/compileNotifications.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const crypto = require('crypto');
66
const BbPromise = require('bluebird');
77
const schema = require('./compileNotifications.schema');
88

9+
let log;
10+
911
const executionStatuses = [
1012
'ABORTED', 'FAILED', 'RUNNING', 'SUCCEEDED', 'TIMED_OUT',
1113
];
@@ -318,7 +320,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
318320
}
319321

320322
if (stateMachineObj.type === 'EXPRESS') {
321-
serverless.cli.consoleLog(
323+
log(
322324
`State machine [${stateMachineName}] : notifications are not supported on Express Workflows. `
323325
+ 'Please see https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html for difference between Step Functions Standard and Express Workflow.',
324326
);
@@ -330,7 +332,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
330332
);
331333

332334
if (error) {
333-
serverless.cli.consoleLog(
335+
log(
334336
`State machine [${stateMachineName}] : notifications config is malformed. `
335337
+ 'Please see https://github.com/horike37/serverless-step-functions for examples. '
336338
+ `${error}`,
@@ -343,6 +345,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
343345

344346
module.exports = {
345347
compileNotifications() {
348+
log = this.log;
346349
const newResourcePairs = _.flatMap(this.getAllStateMachines(), (name) => {
347350
const stateMachineObj = this.getStateMachine(name);
348351
const stateMachineLogicalId = this.getStateMachineLogicalId(name, stateMachineObj);

lib/deploy/stepFunctions/compileStateMachines.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ module.exports = {
119119
if (this.serverless.service.stepFunctions.validate) {
120120
const { isValid, errorsText } = aslValidator(stateMachineObj.definition);
121121
if (isValid) {
122-
this.serverless.cli.consoleLog(`✓ State machine "${stateMachineName}" definition is valid`);
122+
this.log(`✓ State machine "${stateMachineName}" definition is valid`);
123123
} else {
124124
const errorMessage = [
125125
`✕ State machine "${stateMachineName}" definition is invalid:`,

lib/deploy/stepFunctions/compileStateMachines.test.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const _ = require('lodash');
44
const expect = require('chai').expect;
55
const Serverless = require('serverless/lib/Serverless');
6+
const CLI = require('serverless/lib/classes/CLI');
67
const AwsProvider = require('serverless/lib/plugins/aws/provider');
78
const ServerlessStepFunctions = require('./../../index');
89

@@ -12,9 +13,7 @@ describe('#compileStateMachines', () => {
1213

1314
beforeEach(() => {
1415
serverless = new Serverless();
15-
serverless.cli = {
16-
consoleLog: () => {},
17-
};
16+
serverless.cli = new CLI(serverless);
1817
serverless.configSchemaHandler = {
1918
// eslint-disable-next-line no-unused-vars
2019
defineTopLevelProperty: (propertyName, propertySchema) => {},

lib/index.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ const invoke = require('./invoke/invoke');
2929
const yamlParser = require('./yamlParser');
3030
const naming = require('./naming');
3131

32+
const Logger = require('./utils/logger');
33+
3234
class ServerlessStepFunctions {
33-
constructor(serverless, options) {
35+
constructor(serverless, options, v3Api) {
3436
this.serverless = serverless;
3537
this.options = options || {};
3638
this.provider = this.serverless.getProvider('aws');
3739
this.service = this.serverless.service.service;
3840
this.region = this.provider.getRegion();
3941
this.stage = this.provider.getStage();
42+
this.log = new Logger(serverless, v3Api).log;
4043
Object.assign(
4144
this,
4245
compileStateMachines,
@@ -171,17 +174,17 @@ class ServerlessStepFunctions {
171174
.then(this.startExecution)
172175
.then(this.describeExecution)
173176
.then((result) => {
174-
this.serverless.cli.consoleLog('');
177+
this.log('');
175178
if (result.status === 'FAILED') {
176179
return this.getExecutionHistory()
177180
.then((error) => {
178-
this.serverless.cli.consoleLog(_.merge(result, error.events[error.events.length - 1]
181+
this.log(_.merge(result, error.events[error.events.length - 1]
179182
.executionFailedEventDetails));
180183
process.exitCode = 1;
181184
});
182185
}
183186

184-
this.serverless.cli.consoleLog(result);
187+
this.log(result);
185188
return BbPromise.resolve();
186189
});
187190
}
@@ -225,7 +228,7 @@ class ServerlessStepFunctions {
225228
message += stateMachineMessages;
226229
message += '\n';
227230

228-
this.serverless.cli.consoleLog(message);
231+
this.log(message);
229232

230233
return message;
231234
}

lib/index.test.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -287,22 +287,23 @@ describe('#index', () => {
287287
});
288288

289289
describe('#deploy()', () => {
290-
let consoleLogStub;
290+
let logStub;
291291

292292
beforeEach(() => {
293-
consoleLogStub = sinon.stub(serverless.cli, 'consoleLog').returns();
293+
logStub = sinon.stub();
294294
serverlessStepFunctions.endpointInfo = 'https://example.com';
295+
serverlessStepFunctions.log = logStub;
295296
});
296297

297298
afterEach(() => {
298-
serverlessStepFunctions.serverless.cli.consoleLog.restore();
299+
serverlessStepFunctions.log = null;
299300
});
300301

301302
it('should not display endpoints if http event not given', () => {
302303
serverlessStepFunctions.serverless.service.stepFunctions = {};
303304
const expectedMessage = '';
304305
const message = serverlessStepFunctions.display();
305-
expect(consoleLogStub.calledOnce).to.equal(false);
306+
expect(logStub.calledOnce).to.equal(false);
306307
expect(message).to.equal(expectedMessage);
307308
});
308309

@@ -328,7 +329,7 @@ describe('#index', () => {
328329
expectedMessage += '\n POST - https://example.com/foo/bar';
329330
expectedMessage += '\n';
330331
const message = serverlessStepFunctions.display();
331-
expect(consoleLogStub.calledOnce).to.equal(true);
332+
expect(logStub.calledOnce).to.equal(true);
332333
expect(message).to.equal(expectedMessage);
333334
});
334335

@@ -351,7 +352,7 @@ describe('#index', () => {
351352
expectedMessage += '\n POST - https://example.com/foo/bar';
352353
expectedMessage += '\n';
353354
const message = serverlessStepFunctions.display();
354-
expect(consoleLogStub.calledOnce).to.equal(true);
355+
expect(logStub.calledOnce).to.equal(true);
355356
expect(message).to.equal(expectedMessage);
356357
});
357358

@@ -374,7 +375,7 @@ describe('#index', () => {
374375
expectedMessage += '\n POST - https://example.com';
375376
expectedMessage += '\n';
376377
const message = serverlessStepFunctions.display();
377-
expect(consoleLogStub.calledOnce).to.equal(true);
378+
expect(logStub.calledOnce).to.equal(true);
378379
expect(message).to.equal(expectedMessage);
379380
});
380381

@@ -389,7 +390,7 @@ describe('#index', () => {
389390
};
390391
const expectedMessage = '';
391392
const message = serverlessStepFunctions.display();
392-
expect(consoleLogStub.calledOnce).to.equal(false);
393+
expect(logStub.calledOnce).to.equal(false);
393394
expect(message).to.equal(expectedMessage);
394395
});
395396

@@ -408,7 +409,7 @@ describe('#index', () => {
408409
};
409410
const expectedMessage = '';
410411
const message = serverlessStepFunctions.display();
411-
expect(consoleLogStub.calledOnce).to.equal(false);
412+
expect(logStub.calledOnce).to.equal(false);
412413
expect(message).to.equal(expectedMessage);
413414
});
414415
});

lib/utils/logger.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
'use strict';
2+
3+
class Logger {
4+
constructor(serverless, v3Api) {
5+
if (v3Api) {
6+
this.log = v3Api.log;
7+
} else {
8+
this.log = serverless.cli && serverless.cli.consoleLog;
9+
}
10+
}
11+
}
12+
13+
module.exports = Logger;

lib/utils/logger.test.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'use strict';
2+
3+
const expect = require('chai').expect;
4+
const sinon = require('sinon');
5+
const Serverless = require('serverless/lib/Serverless');
6+
const Logger = require('../utils/logger');
7+
8+
describe('logger', () => {
9+
let serverless;
10+
let v3LogSpy;
11+
12+
beforeEach(() => {
13+
serverless = new Serverless();
14+
serverless.cli = { consoleLog: sinon.spy() };
15+
16+
v3LogSpy = sinon.spy();
17+
});
18+
19+
afterEach(() => {
20+
serverless.cli = null;
21+
v3LogSpy = null;
22+
});
23+
24+
it('should be assigned legacy logger (serverless.cli.consoleLog) if v3 log api is not supplied', () => {
25+
const log = new Logger(serverless).log;
26+
log('Testing purpose');
27+
28+
expect(serverless.cli.consoleLog.callCount).to.equal(1);
29+
expect(v3LogSpy.callCount).to.equal(0);
30+
});
31+
32+
it('should be assigned new log API if new log api is supplied', () => {
33+
const log = new Logger(serverless, { log: v3LogSpy }).log;
34+
log('Testing purpose');
35+
36+
expect(serverless.cli.consoleLog.callCount).to.equal(0);
37+
expect(v3LogSpy.callCount).to.equal(1);
38+
});
39+
});

0 commit comments

Comments
 (0)