2021-09-21 15:19:49 +00:00
|
|
|
import io
|
|
|
|
import time
|
|
|
|
import zipfile
|
2023-11-30 15:55:51 +00:00
|
|
|
from uuid import uuid4
|
2021-09-21 15:19:49 +00:00
|
|
|
|
2023-11-30 15:55:51 +00:00
|
|
|
import boto3
|
|
|
|
import pytest
|
2021-09-21 15:19:49 +00:00
|
|
|
from botocore.exceptions import ClientError
|
2023-11-30 15:55:51 +00:00
|
|
|
|
|
|
|
from moto import mock_iam, settings
|
2021-09-21 15:19:49 +00:00
|
|
|
|
|
|
|
_lambda_region = "us-west-2"
|
|
|
|
|
|
|
|
|
|
|
|
def _process_lambda(func_str):
|
|
|
|
zip_output = io.BytesIO()
|
|
|
|
zip_file = zipfile.ZipFile(zip_output, "w", zipfile.ZIP_DEFLATED)
|
|
|
|
zip_file.writestr("lambda_function.py", func_str)
|
|
|
|
zip_file.close()
|
|
|
|
zip_output.seek(0)
|
|
|
|
return zip_output.read()
|
|
|
|
|
|
|
|
|
|
|
|
def get_test_zip_file1():
|
|
|
|
pfunc = """
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
print("custom log event")
|
|
|
|
return event
|
|
|
|
"""
|
|
|
|
return _process_lambda(pfunc)
|
|
|
|
|
|
|
|
|
|
|
|
def get_test_zip_file2():
|
2022-11-17 22:41:08 +00:00
|
|
|
base_url = (
|
|
|
|
"motoserver:5000"
|
|
|
|
if settings.TEST_SERVER_MODE
|
|
|
|
else "ec2.us-west-2.amazonaws.com"
|
|
|
|
)
|
|
|
|
func_str = f"""
|
2021-09-21 15:19:49 +00:00
|
|
|
import boto3
|
|
|
|
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
ec2 = boto3.resource('ec2', region_name='us-west-2', endpoint_url='http://{base_url}')
|
|
|
|
|
|
|
|
volume_id = event.get('volume_id')
|
|
|
|
vol = ec2.Volume(volume_id)
|
|
|
|
|
|
|
|
return {{'id': vol.id, 'state': vol.state, 'size': vol.size}}
|
2022-11-17 22:41:08 +00:00
|
|
|
"""
|
2021-09-21 15:19:49 +00:00
|
|
|
return _process_lambda(func_str)
|
|
|
|
|
|
|
|
|
2022-01-27 12:04:03 +00:00
|
|
|
def get_lambda_using_environment_port():
|
|
|
|
func_str = """
|
|
|
|
import boto3
|
|
|
|
import os
|
|
|
|
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
base_url = os.environ.get("MOTO_HOST")
|
|
|
|
port = os.environ.get("MOTO_PORT")
|
|
|
|
url = base_url + ":" + port
|
|
|
|
conn = boto3.client('lambda', region_name='us-west-2', endpoint_url=url)
|
|
|
|
|
|
|
|
full_url = os.environ["MOTO_HTTP_ENDPOINT"]
|
|
|
|
|
|
|
|
functions = conn.list_functions()["Functions"]
|
|
|
|
|
|
|
|
return {'functions': functions, 'host': full_url}
|
|
|
|
"""
|
|
|
|
return _process_lambda(func_str)
|
|
|
|
|
|
|
|
|
|
|
|
def get_lambda_using_network_mode():
|
|
|
|
func_str = """
|
|
|
|
import boto3
|
|
|
|
import os
|
|
|
|
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
port = os.environ.get("MOTO_PORT")
|
|
|
|
url = "http://localhost:" + port
|
|
|
|
conn = boto3.client('lambda', region_name='us-west-2', endpoint_url=url)
|
|
|
|
|
|
|
|
functions = conn.list_functions()["Functions"]
|
|
|
|
return {'response': functions}
|
|
|
|
"""
|
|
|
|
return _process_lambda(func_str)
|
|
|
|
|
|
|
|
|
2023-09-27 18:34:30 +00:00
|
|
|
def get_proxy_zip_file():
|
|
|
|
func_str = """
|
|
|
|
import boto3
|
|
|
|
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
ec2 = boto3.resource('ec2', region_name='us-west-2')
|
|
|
|
|
|
|
|
volume_id = event.get('volume_id')
|
|
|
|
vol = ec2.Volume(volume_id)
|
|
|
|
|
|
|
|
return {'id': vol.id, 'state': vol.state, 'size': vol.size}
|
|
|
|
"""
|
|
|
|
return _process_lambda(func_str)
|
|
|
|
|
|
|
|
|
2021-09-21 15:19:49 +00:00
|
|
|
def get_test_zip_file3():
|
|
|
|
pfunc = """
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
print("Nr_of_records("+str(len(event['Records']))+")")
|
|
|
|
print("get_test_zip_file3 success")
|
|
|
|
return event
|
|
|
|
"""
|
|
|
|
return _process_lambda(pfunc)
|
|
|
|
|
|
|
|
|
|
|
|
def get_test_zip_file_error():
|
|
|
|
pfunc = """
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
raise Exception('I failed!')
|
|
|
|
"""
|
|
|
|
return _process_lambda(pfunc)
|
|
|
|
|
|
|
|
|
2022-01-14 23:23:09 +00:00
|
|
|
def get_test_zip_largeresponse():
|
|
|
|
pfunc = """
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
x = ["xxx" for x in range(10 ** 6)]
|
|
|
|
return {"statusCode": 200, "body": x}
|
|
|
|
"""
|
|
|
|
return _process_lambda(pfunc)
|
|
|
|
|
|
|
|
|
2021-09-21 15:19:49 +00:00
|
|
|
def get_zip_with_multiple_files():
|
|
|
|
pfunc = """
|
|
|
|
from utilities import util_function
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
x = util_function()
|
|
|
|
event["msg"] = event["msg"] + x
|
|
|
|
return event
|
|
|
|
"""
|
|
|
|
ufunc = """
|
|
|
|
def util_function():
|
|
|
|
return "stuff"
|
|
|
|
"""
|
|
|
|
zip_output = io.BytesIO()
|
|
|
|
zip_file = zipfile.ZipFile(zip_output, "a", zipfile.ZIP_DEFLATED)
|
|
|
|
zip_file.writestr("lambda_function.py", pfunc)
|
|
|
|
zip_file.close()
|
|
|
|
zip_file = zipfile.ZipFile(zip_output, "a", zipfile.ZIP_DEFLATED)
|
|
|
|
zip_file.writestr("utilities.py", ufunc)
|
|
|
|
zip_file.close()
|
|
|
|
zip_output.seek(0)
|
|
|
|
return zip_output.read()
|
|
|
|
|
|
|
|
|
2022-04-06 21:10:32 +00:00
|
|
|
def get_test_zip_file_print_event():
|
|
|
|
pfunc = """
|
|
|
|
def lambda_handler(event, context):
|
|
|
|
print(event)
|
|
|
|
print("FINISHED_PRINTING_EVENT")
|
|
|
|
return event
|
|
|
|
"""
|
|
|
|
return _process_lambda(pfunc)
|
|
|
|
|
|
|
|
|
2021-09-21 15:19:49 +00:00
|
|
|
def create_invalid_lambda(role):
|
|
|
|
conn = boto3.client("lambda", _lambda_region)
|
|
|
|
zip_content = get_test_zip_file1()
|
|
|
|
function_name = str(uuid4())[0:6]
|
|
|
|
with pytest.raises(ClientError) as err:
|
|
|
|
conn.create_function(
|
|
|
|
FunctionName=function_name,
|
2023-08-31 06:47:49 +00:00
|
|
|
Runtime="python3.11",
|
2021-09-21 15:19:49 +00:00
|
|
|
Role=role,
|
|
|
|
Handler="lambda_function.handler",
|
|
|
|
Code={"ZipFile": zip_content},
|
|
|
|
Description="test lambda function",
|
|
|
|
Timeout=3,
|
|
|
|
MemorySize=128,
|
|
|
|
Publish=True,
|
|
|
|
)
|
|
|
|
return err
|
|
|
|
|
|
|
|
|
|
|
|
def get_role_name():
|
|
|
|
with mock_iam():
|
|
|
|
iam = boto3.client("iam", region_name=_lambda_region)
|
2022-11-07 20:03:07 +00:00
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
return iam.get_role(RoleName="my-role")["Role"]["Arn"]
|
|
|
|
except ClientError:
|
|
|
|
try:
|
|
|
|
return iam.create_role(
|
|
|
|
RoleName="my-role",
|
|
|
|
AssumeRolePolicyDocument="some policy",
|
|
|
|
Path="/my-path/",
|
|
|
|
)["Role"]["Arn"]
|
|
|
|
except ClientError:
|
|
|
|
pass
|
2021-09-21 15:19:49 +00:00
|
|
|
|
|
|
|
|
2022-04-06 21:10:32 +00:00
|
|
|
def wait_for_log_msg(expected_msg, log_group, wait_time=30):
|
2021-09-21 15:19:49 +00:00
|
|
|
logs_conn = boto3.client("logs", region_name="us-east-1")
|
|
|
|
received_messages = []
|
|
|
|
start = time.time()
|
2022-04-06 21:10:32 +00:00
|
|
|
while (time.time() - start) < wait_time:
|
2021-11-03 21:00:42 +00:00
|
|
|
try:
|
|
|
|
result = logs_conn.describe_log_streams(logGroupName=log_group)
|
|
|
|
log_streams = result.get("logStreams")
|
|
|
|
except ClientError:
|
|
|
|
log_streams = None # LogGroupName does not yet exist
|
2021-09-21 15:19:49 +00:00
|
|
|
if not log_streams:
|
|
|
|
time.sleep(1)
|
|
|
|
continue
|
|
|
|
|
|
|
|
for log_stream in log_streams:
|
|
|
|
result = logs_conn.get_log_events(
|
2022-03-10 14:39:59 +00:00
|
|
|
logGroupName=log_group, logStreamName=log_stream["logStreamName"]
|
2021-09-21 15:19:49 +00:00
|
|
|
)
|
|
|
|
received_messages.extend(
|
|
|
|
[event["message"] for event in result.get("events")]
|
|
|
|
)
|
2021-11-03 21:00:42 +00:00
|
|
|
for line in received_messages:
|
|
|
|
if expected_msg in line:
|
|
|
|
return True, set(received_messages)
|
2021-09-21 15:19:49 +00:00
|
|
|
time.sleep(1)
|
2021-11-03 21:00:42 +00:00
|
|
|
return False, set(received_messages)
|