|
23 | 23 |
|
24 | 24 | logger = logging.getLogger(__name__) |
25 | 25 |
|
| 26 | + |
| 27 | +def skip_on_aws_403(call_fn, action_description: str): |
| 28 | + try: |
| 29 | + return call_fn() |
| 30 | + except ClientError as e: |
| 31 | + code = e.response["Error"]["Code"] |
| 32 | + if code in ("AccessDenied", "AccessDeniedException", "403"): |
| 33 | + pytest.skip( |
| 34 | + f"Insufficient permissions to execute " |
| 35 | + f"{action_description}, skipping test." |
| 36 | + ) |
| 37 | + else: |
| 38 | + raise |
| 39 | + |
| 40 | + |
26 | 41 | # Configuration |
27 | 42 | AWS_REGION = os.getenv("AWS_REGION", "eu-west-1") |
28 | 43 | DYNAMODB_TABLE = os.getenv( |
@@ -61,45 +76,56 @@ def aws_resources(): |
61 | 76 |
|
62 | 77 | # Create DynamoDB table if not exists |
63 | 78 | try: |
64 | | - dynamodb.describe_table(TableName=DYNAMODB_TABLE) |
| 79 | + skip_on_aws_403( |
| 80 | + lambda: dynamodb.describe_table(TableName=DYNAMODB_TABLE), |
| 81 | + f"DynamoDB DescribeTable on {DYNAMODB_TABLE}", |
| 82 | + ) |
65 | 83 | logger.info(f"DynamoDB table '{DYNAMODB_TABLE}' already exists") |
66 | 84 | except ClientError as e: |
67 | 85 | if e.response["Error"]["Code"] == "ResourceNotFoundException": |
68 | 86 | logger.info(f"Creating DynamoDB table '{DYNAMODB_TABLE}'...") |
69 | | - dynamodb.create_table( |
70 | | - TableName=DYNAMODB_TABLE, |
71 | | - KeySchema=[ |
72 | | - {"AttributeName": "PK", "KeyType": "HASH"}, |
73 | | - {"AttributeName": "SK", "KeyType": "RANGE"}, |
74 | | - ], |
75 | | - AttributeDefinitions=[ |
76 | | - {"AttributeName": "PK", "AttributeType": "S"}, |
77 | | - {"AttributeName": "SK", "AttributeType": "S"}, |
78 | | - ], |
79 | | - BillingMode="PAY_PER_REQUEST", |
| 87 | + skip_on_aws_403( |
| 88 | + lambda: dynamodb.create_table( |
| 89 | + TableName=DYNAMODB_TABLE, |
| 90 | + KeySchema=[ |
| 91 | + {"AttributeName": "PK", "KeyType": "HASH"}, |
| 92 | + {"AttributeName": "SK", "KeyType": "RANGE"}, |
| 93 | + ], |
| 94 | + AttributeDefinitions=[ |
| 95 | + {"AttributeName": "PK", "AttributeType": "S"}, |
| 96 | + {"AttributeName": "SK", "AttributeType": "S"}, |
| 97 | + ], |
| 98 | + BillingMode="PAY_PER_REQUEST", |
| 99 | + ), |
| 100 | + "DynamoDB CreateTable", |
80 | 101 | ) |
81 | | - # Wait for table to be active |
82 | 102 | waiter = dynamodb.get_waiter("table_exists") |
83 | | - waiter.wait(TableName=DYNAMODB_TABLE) |
| 103 | + skip_on_aws_403( |
| 104 | + lambda: waiter.wait(TableName=DYNAMODB_TABLE), "DynamoDB GetWaiter" |
| 105 | + ) |
84 | 106 | logger.info(f"DynamoDB table '{DYNAMODB_TABLE}' created successfully") |
85 | 107 | else: |
86 | 108 | raise |
87 | 109 |
|
88 | 110 | # Create S3 bucket if not exists |
89 | 111 | try: |
90 | | - s3.head_bucket(Bucket=S3_BUCKET) |
| 112 | + skip_on_aws_403(lambda: s3.head_bucket(Bucket=S3_BUCKET), "S3 HeadBucket") |
91 | 113 | logger.info(f"S3 bucket '{S3_BUCKET}' already exists") |
92 | 114 | except ClientError as e: |
93 | 115 | error_code = e.response["Error"]["Code"] |
94 | 116 | if error_code == "404": |
95 | 117 | logger.info(f"Creating S3 bucket '{S3_BUCKET}'...") |
96 | | - if AWS_REGION == "us-east-1": |
97 | | - s3.create_bucket(Bucket=S3_BUCKET) |
98 | | - else: |
99 | | - s3.create_bucket( |
100 | | - Bucket=S3_BUCKET, |
101 | | - CreateBucketConfiguration={"LocationConstraint": AWS_REGION}, |
102 | | - ) |
| 118 | + |
| 119 | + def create_bucket(): |
| 120 | + if AWS_REGION == "us-east-1": |
| 121 | + s3.create_bucket(Bucket=S3_BUCKET) |
| 122 | + else: |
| 123 | + s3.create_bucket( |
| 124 | + Bucket=S3_BUCKET, |
| 125 | + CreateBucketConfiguration={"LocationConstraint": AWS_REGION}, |
| 126 | + ) |
| 127 | + |
| 128 | + skip_on_aws_403(create_bucket, "S3 CreateBucket") |
103 | 129 | logger.info(f"S3 bucket '{S3_BUCKET}' created successfully") |
104 | 130 | else: |
105 | 131 | raise |
|
0 commit comments