moto/tests/test_lakeformation/__init__.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

93 lines
2.9 KiB
Python
Raw Normal View History

import os
from functools import wraps
from uuid import uuid4
import boto3
2024-01-07 12:03:33 +00:00
from moto import mock_aws
def lakeformation_aws_verified(func):
"""
Function that is verified to work against AWS.
Can be run against AWS at any time by setting:
MOTO_TEST_ALLOW_AWS_REQUEST=true
2024-01-07 12:03:33 +00:00
If this environment variable is not set, the function runs in a `mock_aws` context.
Note that LakeFormation is not enabled by default - visit the AWS Console to permit access to the user who executes these tests.
"""
@wraps(func)
def pagination_wrapper():
bucket_name = str(uuid4())
allow_aws_request = (
os.environ.get("MOTO_TEST_ALLOW_AWS_REQUEST", "false").lower() == "true"
)
if allow_aws_request:
2024-01-07 12:03:33 +00:00
resp = create_glue_infra_and_test(bucket_name)
else:
2024-01-07 12:03:33 +00:00
with mock_aws():
resp = create_glue_infra_and_test(bucket_name)
return resp
2024-01-07 12:03:33 +00:00
def create_glue_infra_and_test(bucket_name):
glue = boto3.client("glue", region_name="eu-west-2")
lf = boto3.client("lakeformation", region_name="eu-west-2")
s3 = boto3.client("s3", region_name="us-east-1")
s3.create_bucket(Bucket=bucket_name)
s3.put_bucket_tagging(
Bucket=bucket_name,
Tagging={"TagSet": [{"Key": "environment", "Value": "moto_tests"}]},
)
lf.register_resource(
ResourceArn=f"arn:aws:s3:::{bucket_name}", UseServiceLinkedRole=True
)
db_name = str(uuid4())[0:6]
table_name = str(uuid4())[0:6]
column_name = str(uuid4())[0:6]
glue.create_database(
DatabaseInput={"Name": db_name}, Tags={"environment": "moto_tests"}
)
glue.create_table(
DatabaseName=db_name,
TableInput={
"Name": table_name,
"StorageDescriptor": {
"Columns": [{"Name": column_name, "Type": "string"}]
},
},
)
try:
resp = func(bucket_name, db_name, table_name, column_name)
finally:
### CLEANUP ###
glue.delete_table(DatabaseName=db_name, Name=table_name)
glue.delete_database(Name=db_name)
lf.deregister_resource(ResourceArn=f"arn:aws:s3:::{bucket_name}")
versions = s3.list_object_versions(Bucket=bucket_name).get("Versions", [])
for key in versions:
s3.delete_object(
Bucket=bucket_name, Key=key["Key"], VersionId=key.get("VersionId")
)
delete_markers = s3.list_object_versions(Bucket=bucket_name).get(
"DeleteMarkers", []
)
for key in delete_markers:
s3.delete_object(
Bucket=bucket_name, Key=key["Key"], VersionId=key.get("VersionId")
)
s3.delete_bucket(Bucket=bucket_name)
return resp
return pagination_wrapper