Skip to content

Commit

Permalink
Fix to set array when same bucket (#423)
Browse files Browse the repository at this point in the history
In the case of the same bucket, it is necessary to set it as an array in
`LambdaFunctionConfigurations` and make it one request.
  • Loading branch information
abetomo authored and DeviaVir committed Apr 13, 2018
1 parent 683fed5 commit 41c2281
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 45 deletions.
7 changes: 1 addition & 6 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -710,12 +710,7 @@ they may not work as expected in the Lambda environment.
const paramsList = s3EventsList.map(s3event =>
Object.assign(s3event, { FunctionArn: functionArn }))

// series
return paramsList.map(params => {
return s3Events.add(params)
}).reduce((a, b) => {
return a.then(b)
}, Promise.resolve()).then(() => {
return s3Events.add(paramsList).then(() => {
// Since it is similar to _updateScheduleEvents, it returns meaningful values
return paramsList
})
Expand Down
48 changes: 36 additions & 12 deletions lib/s3_events.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class S3Events {
})
}

_putBucketNotificationConfigurationParams (params) {
_lambdaFunctionConfiguration (params) {
const lambdaFunctionConfiguration = {
Events: params.Events,
LambdaFunctionArn: params.FunctionArn
Expand All @@ -52,29 +52,53 @@ class S3Events {
lambdaFunctionConfiguration.Filter = params.Filter
}

return {
Bucket: params.Bucket,
NotificationConfiguration: {
LambdaFunctionConfigurations: [
lambdaFunctionConfiguration
return lambdaFunctionConfiguration
}

_paramsListToBucketNotificationConfigurations (paramsList) {
const lambdaFunctionConfigurations = {}
for (const params of paramsList) {
if (lambdaFunctionConfigurations[params.Bucket] == null) {
lambdaFunctionConfigurations[params.Bucket] = [
this._lambdaFunctionConfiguration(params)
]
continue
}
lambdaFunctionConfigurations[params.Bucket].push(
this._lambdaFunctionConfiguration(params)
)
}
return Object.keys(lambdaFunctionConfigurations).map((bucket) => {
return {
Bucket: bucket,
NotificationConfiguration: {
LambdaFunctionConfigurations:
lambdaFunctionConfigurations[bucket]
}
}
})
}

_putBucketNotificationConfiguration (params) {
_putBucketNotificationConfiguration (putBucketNotificationConfigurationParams) {
return new Promise((resolve, reject) => {
const _params = this._putBucketNotificationConfigurationParams(params)
this.s3.putBucketNotificationConfiguration(_params, (err, data) => {
this.s3.putBucketNotificationConfiguration(putBucketNotificationConfigurationParams, (err, data) => {
if (err) reject(err)
resolve(data)
})
})
}

add (params) {
return this._addPermission(params).then(() => {
return this._putBucketNotificationConfiguration(params)
add (paramsList) {
return paramsList.map(params => {
return this._addPermission(params)
}).reduce((a, b) => {
return a.then(b)
}, Promise.resolve()).then(() => {
return this._paramsListToBucketNotificationConfigurations(paramsList).map(putBucketNotificationConfigurationParams => {
return this._putBucketNotificationConfiguration(putBucketNotificationConfigurationParams)
}).reduce((a, b) => {
return a.then(b)
})
})
}
}
Expand Down
123 changes: 96 additions & 27 deletions test/s3_events.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,39 +70,29 @@ describe('lib/s3_events', () => {
})
})

describe('_putBucketNotificationConfigurationParams', () => {
it('Return parameters for s3.putBucketNotificationConfiguration(). No Filter', () => {
describe('_lambdaFunctionConfiguration', () => {
it('Return parameters for s3._lambdaFunctionConfiguration(). No Filter', () => {
const expected = {
Bucket: 'node-lambda-test-bucket',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}]
}
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}
assert.deepEqual(
s3Events._putBucketNotificationConfigurationParams(params),
s3Events._lambdaFunctionConfiguration(params),
expected
)
})

it('Return parameters for s3.putBucketNotificationConfiguration(). Use Filter', () => {
const expected = {
Bucket: 'node-lambda-test-bucket',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function',
Filter: {
Key: {
FilterRules: [{
Name: 'prefix',
Value: 'test-prefix'
}]
}
}
}]
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function',
Filter: {
Key: {
FilterRules: [{
Name: 'prefix',
Value: 'test-prefix'
}]
}
}
}
const _params = Object.assign({}, params)
Expand All @@ -115,12 +105,89 @@ describe('lib/s3_events', () => {
}
}
assert.deepEqual(
s3Events._putBucketNotificationConfigurationParams(_params),
s3Events._lambdaFunctionConfiguration(_params),
expected
)
})
})

describe('_paramsListToBucketNotificationConfigurations', () => {
describe('The number of elements of paramsList is 1', () => {
it('Return parameter list of putBucketNotificationConfiguration', () => {
const expected = [{
Bucket: 'node-lambda-test-bucket',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}]
}
}]
assert.deepEqual(
s3Events._paramsListToBucketNotificationConfigurations([params]),
expected
)
})
})
describe('The number of elements of paramsList is 2. Same bucket', () => {
it('Return parameter list of putBucketNotificationConfiguration', () => {
const expected = [{
Bucket: 'node-lambda-test-bucket',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}, {
Events: ['s3:ObjectDelete:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}]
}
}]

const paramsDeleteEvent = Object.assign({}, params)
paramsDeleteEvent.Events = ['s3:ObjectDelete:*']
assert.deepEqual(
s3Events._paramsListToBucketNotificationConfigurations([
params,
paramsDeleteEvent
]),
expected
)
})
})
describe('The number of elements of paramsList is 2. Different bucket', () => {
it('Return parameter list of putBucketNotificationConfiguration', () => {
const expected = [{
Bucket: 'node-lambda-test-bucket',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}]
}
}, {
Bucket: 'node-lambda-test-bucket2',
NotificationConfiguration: {
LambdaFunctionConfigurations: [{
Events: ['s3:ObjectCreated:*'],
LambdaFunctionArn: 'arn:aws:lambda:us-west-2:XXX:function:node-lambda-test-function'
}]
}
}]

const paramsDifferentBucket = Object.assign({}, params)
paramsDifferentBucket.Bucket = 'node-lambda-test-bucket2'
assert.deepEqual(
s3Events._paramsListToBucketNotificationConfigurations([
params,
paramsDifferentBucket
]),
expected
)
})
})
})

describe('_addPermission', () => {
it('using mock', () => {
return s3Events._addPermission(params).then(data => {
Expand All @@ -131,15 +198,17 @@ describe('lib/s3_events', () => {

describe('_putBucketNotificationConfiguration', () => {
it('using mock', () => {
return s3Events._putBucketNotificationConfiguration(params).then(data => {
const putBucketNotificationConfigurationParams =
s3Events._paramsListToBucketNotificationConfigurations([params])[0]
return s3Events._putBucketNotificationConfiguration(putBucketNotificationConfigurationParams).then(data => {
assert.deepEqual(data, mockResponse.putBucketNotificationConfiguration)
})
})
})

describe('add', () => {
it('using mock', () => {
return s3Events.add(params).then(data => {
return s3Events.add([params]).then(data => {
assert.deepEqual(data, mockResponse.putBucketNotificationConfiguration)
})
})
Expand Down

0 comments on commit 41c2281

Please sign in to comment.