257 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			257 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | """Unit tests for lakeformation-supported APIs.""" | ||
|  | import boto3 | ||
|  | import pytest | ||
|  | 
 | ||
|  | from botocore.exceptions import ClientError | ||
|  | from moto import mock_lakeformation | ||
|  | from moto.core import DEFAULT_ACCOUNT_ID | ||
|  | 
 | ||
|  | # See our Development Tips on writing tests for hints on how to write good tests: | ||
|  | # http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_register_resource(): | ||
|  |     client = boto3.client("lakeformation", region_name="us-east-2") | ||
|  |     resp = client.register_resource( | ||
|  |         ResourceArn="some arn", | ||
|  |     ) | ||
|  | 
 | ||
|  |     del resp["ResponseMetadata"] | ||
|  |     assert resp == {} | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_describe_resource(): | ||
|  |     client = boto3.client("lakeformation", region_name="us-east-2") | ||
|  |     client.register_resource(ResourceArn="some arn", RoleArn="role arn") | ||
|  | 
 | ||
|  |     resp = client.describe_resource(ResourceArn="some arn") | ||
|  | 
 | ||
|  |     assert resp["ResourceInfo"] == {"ResourceArn": "some arn", "RoleArn": "role arn"} | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_deregister_resource(): | ||
|  |     client = boto3.client("lakeformation", region_name="us-east-2") | ||
|  |     client.register_resource(ResourceArn="some arn") | ||
|  |     client.deregister_resource(ResourceArn="some arn") | ||
|  | 
 | ||
|  |     with pytest.raises(ClientError) as exc: | ||
|  |         client.describe_resource(ResourceArn="some arn") | ||
|  |     err = exc.value.response["Error"] | ||
|  |     assert err["Code"] == "EntityNotFoundException" | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_list_resources(): | ||
|  |     client = boto3.client("lakeformation", region_name="us-east-2") | ||
|  | 
 | ||
|  |     resp = client.list_resources() | ||
|  |     assert resp["ResourceInfoList"] == [] | ||
|  | 
 | ||
|  |     client.register_resource(ResourceArn="some arn") | ||
|  |     client.register_resource(ResourceArn="another arn") | ||
|  | 
 | ||
|  |     resp = client.list_resources() | ||
|  |     assert len(resp["ResourceInfoList"]) == 2 | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_data_lake_settings(): | ||
|  |     client = boto3.client("lakeformation", region_name="us-east-2") | ||
|  |     resp = client.get_data_lake_settings() | ||
|  |     assert resp["DataLakeSettings"] == { | ||
|  |         "DataLakeAdmins": [], | ||
|  |         "CreateDatabaseDefaultPermissions": [ | ||
|  |             { | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, | ||
|  |                 "Permissions": ["ALL"], | ||
|  |             } | ||
|  |         ], | ||
|  |         "CreateTableDefaultPermissions": [ | ||
|  |             { | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, | ||
|  |                 "Permissions": ["ALL"], | ||
|  |             } | ||
|  |         ], | ||
|  |         "TrustedResourceOwners": [], | ||
|  |         "AllowExternalDataFiltering": False, | ||
|  |         "ExternalDataFilteringAllowList": [], | ||
|  |     } | ||
|  | 
 | ||
|  |     settings = {"DataLakeAdmins": [{"DataLakePrincipalIdentifier": "dlpi"}]} | ||
|  |     client.put_data_lake_settings(DataLakeSettings=settings) | ||
|  | 
 | ||
|  |     resp = client.get_data_lake_settings() | ||
|  |     assert resp["DataLakeSettings"] == settings | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_list_permissions(): | ||
|  |     client = boto3.client("lakeformation", region_name="eu-west-2") | ||
|  | 
 | ||
|  |     resp = client.grant_permissions( | ||
|  |         Principal={"DataLakePrincipalIdentifier": "asdf"}, | ||
|  |         Resource={"Database": {"Name": "db"}}, | ||
|  |         Permissions=["ALL"], | ||
|  |         PermissionsWithGrantOption=["SELECT"], | ||
|  |     ) | ||
|  | 
 | ||
|  |     del resp["ResponseMetadata"] | ||
|  |     assert resp == {} | ||
|  | 
 | ||
|  |     # list all | ||
|  |     resp = client.list_permissions() | ||
|  |     assert resp["PrincipalResourcePermissions"] == [ | ||
|  |         { | ||
|  |             "Principal": {"DataLakePrincipalIdentifier": "asdf"}, | ||
|  |             "Resource": {"Database": {"Name": "db"}}, | ||
|  |             "Permissions": ["ALL"], | ||
|  |             "PermissionsWithGrantOption": ["SELECT"], | ||
|  |         } | ||
|  |     ] | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_revoke_permissions(): | ||
|  |     client = boto3.client("lakeformation", region_name="eu-west-2") | ||
|  | 
 | ||
|  |     client.grant_permissions( | ||
|  |         Principal={"DataLakePrincipalIdentifier": "asdf"}, | ||
|  |         Resource={"Database": {"Name": "db"}}, | ||
|  |         Permissions=["SELECT", "ALTER", "DROP"], | ||
|  |         PermissionsWithGrantOption=["SELECT", "DROP"], | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp = client.revoke_permissions( | ||
|  |         Principal={"DataLakePrincipalIdentifier": "asdf"}, | ||
|  |         Resource={"Database": {"Name": "db"}}, | ||
|  |         Permissions=["DROP"], | ||
|  |     ) | ||
|  | 
 | ||
|  |     del resp["ResponseMetadata"] | ||
|  |     assert resp == {} | ||
|  | 
 | ||
|  |     # list all | ||
|  |     resp = client.list_permissions() | ||
|  |     assert resp["PrincipalResourcePermissions"] == [ | ||
|  |         { | ||
|  |             "Principal": {"DataLakePrincipalIdentifier": "asdf"}, | ||
|  |             "Resource": {"Database": {"Name": "db"}}, | ||
|  |             "Permissions": ["SELECT", "ALTER"], | ||
|  |             "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |         } | ||
|  |     ] | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_lf_tags(): | ||
|  |     client = boto3.client("lakeformation", region_name="eu-west-2") | ||
|  | 
 | ||
|  |     client.create_lf_tag(TagKey="tag1", TagValues=["1a", "1b"]) | ||
|  |     client.create_lf_tag(TagKey="tag2", TagValues=["2a", "2b"]) | ||
|  |     client.create_lf_tag(TagKey="tag3", TagValues=["3a", "3b"]) | ||
|  | 
 | ||
|  |     resp = client.get_lf_tag(TagKey="tag1") | ||
|  |     assert resp["CatalogId"] == DEFAULT_ACCOUNT_ID | ||
|  |     assert resp["TagKey"] == "tag1" | ||
|  |     assert resp["TagValues"] == ["1a", "1b"] | ||
|  | 
 | ||
|  |     resp = client.list_lf_tags() | ||
|  |     assert len(resp["LFTags"]) == 3 | ||
|  |     assert { | ||
|  |         "CatalogId": DEFAULT_ACCOUNT_ID, | ||
|  |         "TagKey": "tag1", | ||
|  |         "TagValues": ["1a", "1b"], | ||
|  |     } in resp["LFTags"] | ||
|  |     assert { | ||
|  |         "CatalogId": DEFAULT_ACCOUNT_ID, | ||
|  |         "TagKey": "tag2", | ||
|  |         "TagValues": ["2a", "2b"], | ||
|  |     } in resp["LFTags"] | ||
|  |     assert { | ||
|  |         "CatalogId": DEFAULT_ACCOUNT_ID, | ||
|  |         "TagKey": "tag3", | ||
|  |         "TagValues": ["3a", "3b"], | ||
|  |     } in resp["LFTags"] | ||
|  | 
 | ||
|  |     client.delete_lf_tag(TagKey="tag2") | ||
|  | 
 | ||
|  |     resp = client.list_lf_tags() | ||
|  |     assert len(resp["LFTags"]) == 2 | ||
|  |     assert { | ||
|  |         "CatalogId": DEFAULT_ACCOUNT_ID, | ||
|  |         "TagKey": "tag1", | ||
|  |         "TagValues": ["1a", "1b"], | ||
|  |     } in resp["LFTags"] | ||
|  |     assert { | ||
|  |         "CatalogId": DEFAULT_ACCOUNT_ID, | ||
|  |         "TagKey": "tag3", | ||
|  |         "TagValues": ["3a", "3b"], | ||
|  |     } in resp["LFTags"] | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_list_data_cells_filter(): | ||
|  |     client = boto3.client("lakeformation", region_name="eu-west-2") | ||
|  | 
 | ||
|  |     resp = client.list_data_cells_filter() | ||
|  |     assert resp["DataCellsFilters"] == [] | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_lakeformation | ||
|  | def test_batch_revoke_permissions(): | ||
|  |     client = boto3.client("lakeformation", region_name="eu-west-2") | ||
|  | 
 | ||
|  |     client.batch_grant_permissions( | ||
|  |         Entries=[ | ||
|  |             { | ||
|  |                 "Id": "id1", | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "id1"}, | ||
|  |                 "Resource": {"Database": {"Name": "db"}}, | ||
|  |                 "Permissions": ["SELECT", "ALTER", "DROP"], | ||
|  |                 "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |             }, | ||
|  |             { | ||
|  |                 "Id": "id2", | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "id2"}, | ||
|  |                 "Resource": {"Database": {"Name": "db"}}, | ||
|  |                 "Permissions": ["SELECT", "ALTER", "DROP"], | ||
|  |                 "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |             }, | ||
|  |             { | ||
|  |                 "Id": "id3", | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "id3"}, | ||
|  |                 "Resource": {"Database": {"Name": "db"}}, | ||
|  |                 "Permissions": ["SELECT", "ALTER", "DROP"], | ||
|  |                 "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |             }, | ||
|  |         ] | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp = client.list_permissions() | ||
|  |     assert len(resp["PrincipalResourcePermissions"]) == 3 | ||
|  | 
 | ||
|  |     client.batch_revoke_permissions( | ||
|  |         Entries=[ | ||
|  |             { | ||
|  |                 "Id": "id1", | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "id2"}, | ||
|  |                 "Resource": {"Database": {"Name": "db"}}, | ||
|  |                 "Permissions": ["SELECT", "ALTER", "DROP"], | ||
|  |                 "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |             }, | ||
|  |             { | ||
|  |                 "Id": "id2", | ||
|  |                 "Principal": {"DataLakePrincipalIdentifier": "id3"}, | ||
|  |                 "Resource": {"Database": {"Name": "db"}}, | ||
|  |                 "Permissions": ["SELECT", "ALTER", "DROP"], | ||
|  |                 "PermissionsWithGrantOption": ["SELECT", "DROP"], | ||
|  |             }, | ||
|  |         ] | ||
|  |     ) | ||
|  | 
 | ||
|  |     resp = client.list_permissions() | ||
|  |     assert len(resp["PrincipalResourcePermissions"]) == 1 |