Added Lambda invoke capability.

This commit is contained in:
Mike Grima 2016-06-22 12:24:46 -07:00
commit bfa079ec4e
4 changed files with 70 additions and 0 deletions

View file

@ -3,6 +3,7 @@ from __future__ import unicode_literals
import base64
import datetime
import hashlib
import json
import boto.awslambda
from moto.core import BaseBackend
@ -92,6 +93,18 @@ class LambdaFunction(object):
"Configuration": self.get_configuration(),
}
def invoke(self, request, headers):
payload = dict()
# Get the invocation type:
if request.headers.get("x-amz-invocation-type") == "RequestResponse":
encoded = base64.b64encode("Some log file output...".encode('utf-8'))
headers["x-amz-log-result"] = encoded.decode('utf-8')
payload["result"] = "Good"
return json.dumps(payload, indent=4)
@classmethod
def create_from_cloudformation_json(cls, resource_name, cloudformation_json, region_name):
properties = cloudformation_json['Properties']

View file

@ -28,6 +28,25 @@ class LambdaResponse(BaseResponse):
else:
raise ValueError("Cannot handle request")
@classmethod
def invoke(cls, request, full_url, headers):
if request.method == 'POST':
return cls()._invoke(request, full_url, headers)
else:
raise ValueError("Cannot handle request")
def _invoke(self, request, full_url, headers):
lambda_backend = self.get_lambda_backend(full_url)
function_name = request.path.split('/')[-2]
if lambda_backend.has_function(function_name):
fn = lambda_backend.get_function(function_name)
payload = fn.invoke(request, headers)
return 200, headers, payload
else:
return 404, headers, "{}"
def _list_functions(self, request, full_url, headers):
lambda_backend = self.get_lambda_backend(full_url)
return 200, headers, json.dumps({

View file

@ -9,4 +9,5 @@ url_paths = {
# double curly braces because the `format()` method is called on the strings
'{0}/\d{{4}}-\d{{2}}-\d{{2}}/functions/?$': LambdaResponse.root,
'{0}/\d{{4}}-\d{{2}}-\d{{2}}/functions/(?P<function_name>[\w_-]+)/?$': LambdaResponse.function,
'{0}/\d{{4}}-\d{{2}}-\d{{2}}/functions/(?P<function_name>[\w_-]+)/invocations?$': LambdaResponse.invoke,
}