From e660ab91831dd420d0233086fd48a50460088e9a Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Mon, 14 Nov 2016 15:42:00 -0500 Subject: [PATCH 01/12] Change test to work in any locale --- test/unit/date_facade_test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/date_facade_test.js b/test/unit/date_facade_test.js index 45e710d..886adef 100644 --- a/test/unit/date_facade_test.js +++ b/test/unit/date_facade_test.js @@ -40,7 +40,8 @@ dateFacadeTest.testGetFormattedTimestamp = function(test) { dateFacadeTest.testGetHumanReadableTimestamp = function(test) { var fixedDate = new Date(2016, 2, 13, 14, 38, 13); - test.ok(dateFacade.getHumanReadableTimestamp(fixedDate).indexOf('Sun Mar 13 2016 14:38:13') > -1); + var expectedValue = fixedDate.toLocaleString(); + test.ok(dateFacade.getHumanReadableTimestamp(fixedDate)===expectedValue); test.done(); }; module.exports = dateFacadeTest; From fd38c6d0857dfdcea96bc60fc75057b4b9513a45 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Mon, 14 Nov 2016 15:56:05 -0500 Subject: [PATCH 02/12] Support "invokedFunctionArn" property within client context --- test/unit/invoke_task_test.js | 27 ++++++++++++++++++++++++++- utils/invoke_task.js | 4 +++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/test/unit/invoke_task_test.js b/test/unit/invoke_task_test.js index e116477..2b574cb 100644 --- a/test/unit/invoke_task_test.js +++ b/test/unit/invoke_task_test.js @@ -422,6 +422,31 @@ invokeTaskTests.testNoClientContext = function(test) { gruntMock.execute(invokeTask.getHandler, harnessParams); }; +invokeTaskTests.testNoInvokedFunctionArn = function(test) { + test.expect(5); + + setLambdaFunction(function(event, context) { + var defaultArn = 'arn:aws:lambda:_aws_region_:_aws_account_id_:function:_lambda_function_name_'; + test.equal(context.invokedFunctionArn, defaultArn); + context.done(null, 'My Message'); + }); + + var invokeTask = require('../../utils/invoke_task'); + + var harnessParams = { + options: { + }, + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 5); + test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[4], 'My Message'); + test.done(); + } + }; + gruntMock.execute(invokeTask.getHandler, harnessParams); +}; + invokeTaskTests.testNoIdentity = function(test) { test.expect(5); @@ -537,4 +562,4 @@ invokeTaskTests.testCallbackError = function(test) { }; -module.exports = invokeTaskTests; \ No newline at end of file +module.exports = invokeTaskTests; diff --git a/utils/invoke_task.js b/utils/invoke_task.js index a9db0b9..d14ef7a 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -27,6 +27,7 @@ invokeTask.getHandler = function (grunt) { 'file_name': 'index.js', 'event': 'event.json', 'client_context': 'client_context.json', + 'invokedFunctionArn': 'arn:aws:lambda:_aws_region_:_aws_account_id_:function:_lambda_function_name_', 'identity': 'identity.json' }); @@ -94,6 +95,7 @@ invokeTask.getHandler = function (grunt) { awsRequestId: 'LAMBDA_INVOKE', logStreamName: 'LAMBDA_INVOKE', clientContext: clientContext, + invokedFunctionArn: options.invokedFunctionArn, identity: identity }; @@ -107,4 +109,4 @@ invokeTask.getHandler = function (grunt) { }; }; -module.exports = invokeTask; \ No newline at end of file +module.exports = invokeTask; From 7c16c22a19cc2d947619976b5058d2d6c1e7518c Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Mon, 14 Nov 2016 16:04:37 -0500 Subject: [PATCH 03/12] Support "functionName" property within client context --- test/unit/invoke_task_test.js | 25 +++++++++++++++++++++++++ utils/invoke_task.js | 4 +++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/test/unit/invoke_task_test.js b/test/unit/invoke_task_test.js index 2b574cb..f9f1cb1 100644 --- a/test/unit/invoke_task_test.js +++ b/test/unit/invoke_task_test.js @@ -422,6 +422,31 @@ invokeTaskTests.testNoClientContext = function(test) { gruntMock.execute(invokeTask.getHandler, harnessParams); }; +invokeTaskTests.testNoFunctionName = function(test) { + test.expect(5); + + setLambdaFunction(function(event, context) { + var defaultFunctionName = '_function_name_'; + test.equal(context.functionName, defaultFunctionName); + context.done(null, 'My Message'); + }); + + var invokeTask = require('../../utils/invoke_task'); + + var harnessParams = { + options: { + }, + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 5); + test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[4], 'My Message'); + test.done(); + } + }; + gruntMock.execute(invokeTask.getHandler, harnessParams); +}; + invokeTaskTests.testNoInvokedFunctionArn = function(test) { test.expect(5); diff --git a/utils/invoke_task.js b/utils/invoke_task.js index d14ef7a..91e13f4 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -28,6 +28,7 @@ invokeTask.getHandler = function (grunt) { 'event': 'event.json', 'client_context': 'client_context.json', 'invokedFunctionArn': 'arn:aws:lambda:_aws_region_:_aws_account_id_:function:_lambda_function_name_', + 'functionName': '_function_name_', 'identity': 'identity.json' }); @@ -94,8 +95,9 @@ invokeTask.getHandler = function (grunt) { }, awsRequestId: 'LAMBDA_INVOKE', logStreamName: 'LAMBDA_INVOKE', - clientContext: clientContext, invokedFunctionArn: options.invokedFunctionArn, + functionName: options.functionName, + clientContext: clientContext, identity: identity }; From 311f7d96f6e3caf374a5efaf7b77afa572320bd6 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Mon, 14 Nov 2016 16:08:34 -0500 Subject: [PATCH 04/12] Support "functionVersion" property within client context --- test/unit/invoke_task_test.js | 25 +++++++++++++++++++++++++ utils/invoke_task.js | 2 ++ 2 files changed, 27 insertions(+) diff --git a/test/unit/invoke_task_test.js b/test/unit/invoke_task_test.js index f9f1cb1..e404c6e 100644 --- a/test/unit/invoke_task_test.js +++ b/test/unit/invoke_task_test.js @@ -447,6 +447,31 @@ invokeTaskTests.testNoFunctionName = function(test) { gruntMock.execute(invokeTask.getHandler, harnessParams); }; +invokeTaskTests.testNoFunctionVersion = function(test) { + test.expect(5); + + setLambdaFunction(function(event, context) { + var defaultFunctionVersion = 1; + test.equal(context.functionVersion, defaultFunctionVersion); + context.done(null, 'My Message'); + }); + + var invokeTask = require('../../utils/invoke_task'); + + var harnessParams = { + options: { + }, + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 5); + test.equal(harness.output[2], 'Success! Message:'); + test.equal(harness.output[4], 'My Message'); + test.done(); + } + }; + gruntMock.execute(invokeTask.getHandler, harnessParams); +}; + invokeTaskTests.testNoInvokedFunctionArn = function(test) { test.expect(5); diff --git a/utils/invoke_task.js b/utils/invoke_task.js index 91e13f4..014b74d 100644 --- a/utils/invoke_task.js +++ b/utils/invoke_task.js @@ -29,6 +29,7 @@ invokeTask.getHandler = function (grunt) { 'client_context': 'client_context.json', 'invokedFunctionArn': 'arn:aws:lambda:_aws_region_:_aws_account_id_:function:_lambda_function_name_', 'functionName': '_function_name_', + 'functionVersion': 1, 'identity': 'identity.json' }); @@ -97,6 +98,7 @@ invokeTask.getHandler = function (grunt) { logStreamName: 'LAMBDA_INVOKE', invokedFunctionArn: options.invokedFunctionArn, functionName: options.functionName, + functionVersion: options.functionVersion, clientContext: clientContext, identity: identity }; From 7922ccf3aaf53edcb895e9e69bc977f517023c6a Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 09:33:55 -0400 Subject: [PATCH 05/12] Support deployment of packages previously uploaded to AWS S3 --- test/unit/deploy_task_test.js | 75 +++++++++++++++++++++++++++++++++++ utils/deploy_task.js | 66 +++++++++++++++++++++--------- 2 files changed, 122 insertions(+), 19 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index d584f18..3a1089f 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -188,6 +188,81 @@ deployTaskTest.testDeployWithoutProxy = function(test) { gruntMock.execute(deployTask.getHandler, harnessParams); }; +deployTaskTest.testDeployS3 = function(test) { + test.expect(9); + + var deployTask = require('../../utils/deploy_task'); + var expectedS3Bucket = 'my-s3-bucket'; + var expectedS3Key = 'my-s3-key'; + var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: LATEST)`; + + var harnessParams = { + options: { }, + config: Object.assign(defaultGruntConfig, { + 'lambda_deploy.fake-target.package': undefined, + 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, + 'lambda_deploy.fake-target.s3_key': expectedS3Key + }), + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 3); + test.equal(harness.output[0], progressMessage); + test.equal(harness.output[1], 'Package deployed.'); + test.equal(harness.output[2], 'No config updates to make.'); + + test.ok(awsSDKMock.config.update.calledWith({region: 'us-east-1'})); + test.ok(lambdaAPIMock.getFunction.calledWith({FunctionName: 'some-function'})); + test.ok(lambdaAPIMock.updateFunctionCode.calledWith({ + FunctionName: 'some-function', + S3Bucket: expectedS3Bucket, + S3Key: expectedS3Key + })); + test.ok(!lambdaAPIMock.updateFunctionConfiguration.called); + test.done(); + } + }; + gruntMock.execute(deployTask.getHandler, harnessParams); +}; + +deployTaskTest.testDeployS3WithVersion = function(test) { + test.expect(9); + + var deployTask = require('../../utils/deploy_task'); + var expectedS3Bucket = 'my-s3-bucket'; + var expectedS3Key = 'my-s3-key'; + var expectedS3Version = 'my-version'; + var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: ${expectedS3Version})`; + + var harnessParams = { + options: { }, + config: Object.assign(defaultGruntConfig, { + 'lambda_deploy.fake-target.package': undefined, + 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, + 'lambda_deploy.fake-target.s3_key': expectedS3Key, + 'lambda_deploy.fake-target.s3_version': expectedS3Version + }), + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 3); + test.equal(harness.output[0], progressMessage); + test.equal(harness.output[1], 'Package deployed.'); + test.equal(harness.output[2], 'No config updates to make.'); + + test.ok(awsSDKMock.config.update.calledWith({region: 'us-east-1'})); + test.ok(lambdaAPIMock.getFunction.calledWith({FunctionName: 'some-function'})); + test.ok(lambdaAPIMock.updateFunctionCode.calledWith({ + FunctionName: 'some-function', + S3Bucket: expectedS3Bucket, + S3Key: expectedS3Key, + S3ObjectVersion: expectedS3Version + })); + test.ok(!lambdaAPIMock.updateFunctionConfiguration.called); + test.done(); + } + }; + gruntMock.execute(deployTask.getHandler, harnessParams); +}; + deployTaskTest.testProfile = function(test) { test.expect(3); diff --git a/utils/deploy_task.js b/utils/deploy_task.js index fd6c675..b241ac0 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -80,6 +80,9 @@ deployTask.getHandler = function (grunt) { var deploy_function = grunt.config.get('lambda_deploy.' + this.target + '.function'); var deploy_arn = grunt.config.get('lambda_deploy.' + this.target + '.arn'); var deploy_package = grunt.config.get('lambda_deploy.' + this.target + '.package'); + var s3_bucket = grunt.config.get('lambda_deploy.' + this.target + '.s3_bucket'); + var s3_key = grunt.config.get('lambda_deploy.' + this.target + '.s3_key'); + var s3_version = grunt.config.get('lambda_deploy.' + this.target + '.s3_version'); var package_version = grunt.config.get('lambda_deploy.' + this.target + '.version'); var package_name = grunt.config.get('lambda_deploy.' + this.target + '.package_name'); var archive_name = grunt.config.get('lambda_deploy.' + this.target + '.archive_name'); @@ -248,36 +251,61 @@ deployTask.getHandler = function (grunt) { } }; - grunt.log.writeln('Uploading...'); - fs.readFile(deploy_package, function (err, data) { - if (err) { - grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + - 'location is correct, and that you have already created the package using lambda_package.'); - } + const updateLambdaConfig = function(functionName, configParams) { + updateConfig(functionName, configParams) + .then(function () {return createVersion(functionName);}) + .then(function () {return setAliases(functionName);}) + .then(function () {return setPackageVersionAlias(functionName);}) + .then(function () { + done(true); + }).catch(function (err) { + grunt.fail.warn('Uncaught exception: ' + err.message); + }); + } + if(!s3_bucket) { + grunt.log.writeln('Uploading...'); + fs.readFile(deploy_package, function (err, data) { + if (err) { + grunt.fail.warn('Could not read package file (' + deploy_package + '), verify the lambda package ' + + 'location is correct, and that you have already created the package using lambda_package.'); + } + + var codeParams = { + FunctionName: deploy_function, + ZipFile: data + }; + + lambda.updateFunctionCode(codeParams, function (err, data) { + if (err) { + grunt.fail.warn('Package upload failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); + } + + grunt.log.writeln('Package deployed.'); + updateLambdaConfig(deploy_function, configParams); + }); + }); + } else { + grunt.log.writeln([ 'Using code deployed to S3 at [', s3_bucket, '/', s3_key, '] (version: ', s3_version || 'LATEST', ')' ].join('')); var codeParams = { FunctionName: deploy_function, - ZipFile: data + S3Bucket: s3_bucket, + S3Key: s3_key }; + if(s3_version) { + codeParams.S3ObjectVersion = s3_version; + } + lambda.updateFunctionCode(codeParams, function (err, data) { if (err) { - grunt.fail.warn('Package upload failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); + grunt.fail.warn('Package deployment failed, check you have lambda:UpdateFunctionCode permissions and that your package is not too big to upload.'); } - grunt.log.writeln('Package deployed.'); - updateConfig(deploy_function, configParams) - .then(function () {return createVersion(deploy_function);}) - .then(function () {return setAliases(deploy_function);}) - .then(function () {return setPackageVersionAlias(deploy_function);}) - .then(function () { - done(true); - }).catch(function (err) { - grunt.fail.warn('Uncaught exception: ' + err.message); - }); + updateLambdaConfig(deploy_function, configParams); }); - }); + } }); }; }; From bf2b536b6f7122d5d25b2de11a9c4ab8aaadc1b2 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 10:46:28 -0400 Subject: [PATCH 06/12] Use package name to identify the package in S3, make s3 path optional --- test/unit/deploy_task_test.js | 54 +++++++++++++++++++++++++++++++---- utils/deploy_task.js | 11 +++++-- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index 3a1089f..9a0d70d 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -192,16 +192,56 @@ deployTaskTest.testDeployS3 = function(test) { test.expect(9); var deployTask = require('../../utils/deploy_task'); + var expectedPackage = 'my-package.zip'; var expectedS3Bucket = 'my-s3-bucket'; - var expectedS3Key = 'my-s3-key'; + var expectedS3Path = 'my-s3-path'; + var expectedS3Key = `${expectedS3Path}/${expectedPackage}`; var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: LATEST)`; var harnessParams = { options: { }, config: Object.assign(defaultGruntConfig, { - 'lambda_deploy.fake-target.package': undefined, + 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, - 'lambda_deploy.fake-target.s3_key': expectedS3Key + 'lambda_deploy.fake-target.s3_path': expectedS3Path + }), + callback: function(harness) { + test.equal(harness.status, true); + test.equal(harness.output.length, 3); + test.equal(harness.output[0], progressMessage); + test.equal(harness.output[1], 'Package deployed.'); + test.equal(harness.output[2], 'No config updates to make.'); + + test.ok(awsSDKMock.config.update.calledWith({region: 'us-east-1'})); + test.ok(lambdaAPIMock.getFunction.calledWith({FunctionName: 'some-function'})); + test.ok(lambdaAPIMock.updateFunctionCode.calledWith({ + FunctionName: 'some-function', + S3Bucket: expectedS3Bucket, + S3Key: expectedS3Key + })); + test.ok(!lambdaAPIMock.updateFunctionConfiguration.called); + test.done(); + } + }; + gruntMock.execute(deployTask.getHandler, harnessParams); +}; + +deployTaskTest.testDeployS3WithoutPath = function(test) { + test.expect(9); + + var deployTask = require('../../utils/deploy_task'); + var expectedPackage = 'my-package.zip'; + var expectedS3Bucket = 'my-s3-bucket'; + var expectedS3Path = ''; + var expectedS3Key = expectedPackage; + var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedPackage}] (version: LATEST)`; + + var harnessParams = { + options: { }, + config: Object.assign(defaultGruntConfig, { + 'lambda_deploy.fake-target.package': expectedPackage, + 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, + 'lambda_deploy.fake-target.s3_path': expectedS3Path }), callback: function(harness) { test.equal(harness.status, true); @@ -228,17 +268,19 @@ deployTaskTest.testDeployS3WithVersion = function(test) { test.expect(9); var deployTask = require('../../utils/deploy_task'); + var expectedPackage = 'my-package.zip'; var expectedS3Bucket = 'my-s3-bucket'; - var expectedS3Key = 'my-s3-key'; + var expectedS3Path = 'my-s3-path'; var expectedS3Version = 'my-version'; + var expectedS3Key = `${expectedS3Path}/${expectedPackage}`; var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: ${expectedS3Version})`; var harnessParams = { options: { }, config: Object.assign(defaultGruntConfig, { - 'lambda_deploy.fake-target.package': undefined, + 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, - 'lambda_deploy.fake-target.s3_key': expectedS3Key, + 'lambda_deploy.fake-target.s3_path': expectedS3Path, 'lambda_deploy.fake-target.s3_version': expectedS3Version }), callback: function(harness) { diff --git a/utils/deploy_task.js b/utils/deploy_task.js index b241ac0..3f3c443 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -81,7 +81,7 @@ deployTask.getHandler = function (grunt) { var deploy_arn = grunt.config.get('lambda_deploy.' + this.target + '.arn'); var deploy_package = grunt.config.get('lambda_deploy.' + this.target + '.package'); var s3_bucket = grunt.config.get('lambda_deploy.' + this.target + '.s3_bucket'); - var s3_key = grunt.config.get('lambda_deploy.' + this.target + '.s3_key'); + var s3_path = grunt.config.get('lambda_deploy.' + this.target + '.s3_path'); var s3_version = grunt.config.get('lambda_deploy.' + this.target + '.s3_version'); var package_version = grunt.config.get('lambda_deploy.' + this.target + '.version'); var package_name = grunt.config.get('lambda_deploy.' + this.target + '.package_name'); @@ -286,7 +286,14 @@ deployTask.getHandler = function (grunt) { }); }); } else { - grunt.log.writeln([ 'Using code deployed to S3 at [', s3_bucket, '/', s3_key, '] (version: ', s3_version || 'LATEST', ')' ].join('')); + var s3_key = !s3_path? deploy_package:s3_path + '/' + deploy_package; + grunt.log.writeln([ + 'Using code deployed to S3 at [', + s3_bucket, '/', s3_key, + '] (version: ', + s3_version || 'LATEST', + ')' ].join('')); + var codeParams = { FunctionName: deploy_function, S3Bucket: s3_bucket, From 2e20fdfc4e3058004deb26019f0e991d0c86c5af Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 10:51:06 -0400 Subject: [PATCH 07/12] Replace "const" with "var" --- utils/deploy_task.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/deploy_task.js b/utils/deploy_task.js index 3f3c443..978a3c8 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -251,7 +251,7 @@ deployTask.getHandler = function (grunt) { } }; - const updateLambdaConfig = function(functionName, configParams) { + var updateLambdaConfig = function(functionName, configParams) { updateConfig(functionName, configParams) .then(function () {return createVersion(functionName);}) .then(function () {return setAliases(functionName);}) From 7d5a892bd89f63c8decd3b6d9379bcf4e8f65adf Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 10:54:26 -0400 Subject: [PATCH 08/12] Replace string interpolation syntax with older string concat syntax --- test/unit/deploy_task_test.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index 9a0d70d..6aaec97 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -195,8 +195,12 @@ deployTaskTest.testDeployS3 = function(test) { var expectedPackage = 'my-package.zip'; var expectedS3Bucket = 'my-s3-bucket'; var expectedS3Path = 'my-s3-path'; - var expectedS3Key = `${expectedS3Path}/${expectedPackage}`; - var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: LATEST)`; + var expectedS3Key = expectedS3Path + '/' + expectedPackage; + var progressMessage = [ + 'Using code deployed to S3 at [', + expectedS3Bucket, '/', expectedS3Key, + '] (version: LATEST)' + ].join(''); var harnessParams = { options: { }, @@ -234,7 +238,11 @@ deployTaskTest.testDeployS3WithoutPath = function(test) { var expectedS3Bucket = 'my-s3-bucket'; var expectedS3Path = ''; var expectedS3Key = expectedPackage; - var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedPackage}] (version: LATEST)`; + var progressMessage = [ + 'Using code deployed to S3 at [', + expectedS3Bucket, '/', expectedPackage, + '] (version: LATEST)' + ].join(''); var harnessParams = { options: { }, @@ -272,8 +280,14 @@ deployTaskTest.testDeployS3WithVersion = function(test) { var expectedS3Bucket = 'my-s3-bucket'; var expectedS3Path = 'my-s3-path'; var expectedS3Version = 'my-version'; - var expectedS3Key = `${expectedS3Path}/${expectedPackage}`; - var progressMessage = `Using code deployed to S3 at [${expectedS3Bucket}/${expectedS3Key}] (version: ${expectedS3Version})`; + var expectedS3Key = expectedS3Path + '/' + expectedPackage; + var progressMessage = [ + 'Using code deployed to S3 at [', + expectedS3Bucket, '/', expectedS3Key, + '] (version: ', + expectedS3Version, + 'LATEST)' + ].join(''); var harnessParams = { options: { }, From 26f47ea4e274c99bd2b3b319cec63777a6827f87 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 11:01:16 -0400 Subject: [PATCH 09/12] Fix linting/test errors --- test/unit/deploy_task_test.js | 2 +- utils/deploy_task.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index 6aaec97..ae89322 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -286,7 +286,7 @@ deployTaskTest.testDeployS3WithVersion = function(test) { expectedS3Bucket, '/', expectedS3Key, '] (version: ', expectedS3Version, - 'LATEST)' + ')' ].join(''); var harnessParams = { diff --git a/utils/deploy_task.js b/utils/deploy_task.js index 978a3c8..ce0269c 100644 --- a/utils/deploy_task.js +++ b/utils/deploy_task.js @@ -261,7 +261,7 @@ deployTask.getHandler = function (grunt) { }).catch(function (err) { grunt.fail.warn('Uncaught exception: ' + err.message); }); - } + }; if(!s3_bucket) { grunt.log.writeln('Uploading...'); From 53aee3dc5b421453b4e1661b141b1a210d551922 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 11:06:33 -0400 Subject: [PATCH 10/12] Remove Object.assign() call, replace with manual object construction --- test/unit/deploy_task_test.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index ae89322..3deaf3e 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -204,11 +204,12 @@ deployTaskTest.testDeployS3 = function(test) { var harnessParams = { options: { }, - config: Object.assign(defaultGruntConfig, { + config: { + 'lambda_deploy.fake-target.function': 'my-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path - }), + }, callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 3); @@ -246,11 +247,12 @@ deployTaskTest.testDeployS3WithoutPath = function(test) { var harnessParams = { options: { }, - config: Object.assign(defaultGruntConfig, { + config: { + 'lambda_deploy.fake-target.function': 'my-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path - }), + }, callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 3); @@ -291,12 +293,13 @@ deployTaskTest.testDeployS3WithVersion = function(test) { var harnessParams = { options: { }, - config: Object.assign(defaultGruntConfig, { + config: { + 'lambda_deploy.fake-target.function': 'my-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path, 'lambda_deploy.fake-target.s3_version': expectedS3Version - }), + }, callback: function(harness) { test.equal(harness.status, true); test.equal(harness.output.length, 3); From d63e065f3d827cd635dfea3c658a5caf15ebb0f2 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 11:14:57 -0400 Subject: [PATCH 11/12] Update README file with deploy from s3 options --- README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cec1a5b..95c1dd6 100644 --- a/README.md +++ b/README.md @@ -435,6 +435,32 @@ A list of one or more security groups IDs in your VPC. If your Lambda function accesses resources in a VPC you must provide at least one security group and one subnet ID. These must belong to the same VPC +##### options.s3_bucket +Type: `String` +Default value: `undefined` + +An optional S3 bucket that contains a pre uploaded package for deployment. + +If this property is specified, the task will attempt to load the package from the specified S3 bucket, instead of uploading it from the file system. + +The `package` property is used to determine the name of the file within the bucket. + +##### options.s3_path +Type: `String` +Default value: `undefined` + +An optional S3 path that points to the "directory" within S3 that contains the package. If omitted, the task assumes that the package has been deployed at the root of the S3 bucket. + +The `package` property is used to determine the name of the file within the bucket. + +##### options.s3_version +Type: `String` +Default value: `undefined` + +An optional S3 version id string that can be used to specifiy a specific version of the package file on s3. If omitted, the latest version of the package will be used. + +The `package` property is used to determine the name of the file within the bucket. + #### Usage Examples ##### Default Options @@ -643,4 +669,4 @@ Adding more warnings for various failure cases * Added support for Node 4.3 runtime callback function - [pull request by bobhigs](https://github.com/Tim-B/grunt-aws-lambda/pull/76) * Added VPC support - [pull request by beeva-arturomartinez](https://github.com/Tim-B/grunt-aws-lambda/pull/71) -* Added local proxy support - [pull request by alekstr](https://github.com/Tim-B/grunt-aws-lambda/pull/66) \ No newline at end of file +* Added local proxy support - [pull request by alekstr](https://github.com/Tim-B/grunt-aws-lambda/pull/66) From d36db40071e4e007c892bd608f5cd7fc7cff7182 Mon Sep 17 00:00:00 2001 From: Vamshi K Ponnapalli Date: Thu, 13 Apr 2017 11:16:07 -0400 Subject: [PATCH 12/12] Fix breaking unit tests --- test/unit/deploy_task_test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/unit/deploy_task_test.js b/test/unit/deploy_task_test.js index 3deaf3e..52eb08f 100644 --- a/test/unit/deploy_task_test.js +++ b/test/unit/deploy_task_test.js @@ -205,7 +205,7 @@ deployTaskTest.testDeployS3 = function(test) { var harnessParams = { options: { }, config: { - 'lambda_deploy.fake-target.function': 'my-function', + 'lambda_deploy.fake-target.function': 'some-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path @@ -248,7 +248,7 @@ deployTaskTest.testDeployS3WithoutPath = function(test) { var harnessParams = { options: { }, config: { - 'lambda_deploy.fake-target.function': 'my-function', + 'lambda_deploy.fake-target.function': 'some-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path @@ -294,7 +294,7 @@ deployTaskTest.testDeployS3WithVersion = function(test) { var harnessParams = { options: { }, config: { - 'lambda_deploy.fake-target.function': 'my-function', + 'lambda_deploy.fake-target.function': 'some-function', 'lambda_deploy.fake-target.package': expectedPackage, 'lambda_deploy.fake-target.s3_bucket': expectedS3Bucket, 'lambda_deploy.fake-target.s3_path': expectedS3Path,