From fe508668a8ad8c749b8ce21e9a6476159da5221e Mon Sep 17 00:00:00 2001 From: "daniel.radl" Date: Mon, 14 Jul 2025 18:19:34 +0200 Subject: [PATCH] refactored to be more robust and better error handling --- tests/_create_bucket.py | 76 ++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/tests/_create_bucket.py b/tests/_create_bucket.py index e0b55cbf..f2d2d68f 100644 --- a/tests/_create_bucket.py +++ b/tests/_create_bucket.py @@ -1,19 +1,69 @@ import os - -import boto3 - +import time +import sys def main() -> int: - resource = boto3.resource( - service_name="s3", - endpoint_url="http://minio:9000", - region_name="us-east-1", - aws_access_key_id=os.getenv("S3_ACCESS_KEY"), - aws_secret_access_key=os.getenv("S3_SECRET_KEY"), - ) - resource.create_bucket(Bucket="frappe") - return 0 + # Import boto3 with error handling + try: + import boto3 + from botocore.exceptions import ClientError, EndpointConnectionError + except ImportError as e: + print(f"ERROR: boto3 not available: {e}", file=sys.stderr) + return 1 + + # Get environment variables + access_key = os.getenv("S3_ACCESS_KEY") + secret_key = os.getenv("S3_SECRET_KEY") + + if not access_key or not secret_key: + print("ERROR: S3_ACCESS_KEY or S3_SECRET_KEY not set", file=sys.stderr) + return 1 + + print(f"Connecting to MinIO with access key: {access_key[:10]}...") + + # Create S3 resource with retry logic + for attempt in range(10): # Try up to 10 times + try: + resource = boto3.resource( + service_name="s3", + endpoint_url="http://minio:9000", + region_name="us-east-1", + aws_access_key_id=access_key, + aws_secret_access_key=secret_key, + ) + + # Test connection by listing buckets + list(resource.buckets.all()) + print("Connected to MinIO successfully") + break + + except EndpointConnectionError: + print(f"Attempt {attempt + 1}: MinIO not ready yet, waiting...") + time.sleep(2) + except Exception as e: + print(f"Attempt {attempt + 1}: Connection failed: {e}") + if attempt == 9: # Last attempt + print("Failed to connect to MinIO after 10 attempts", file=sys.stderr) + return 1 + time.sleep(2) + + # Create bucket + try: + resource.create_bucket(Bucket="frappe") + print("Bucket 'frappe' created successfully") + return 0 + except ClientError as e: + error_code = e.response['Error']['Code'] + if error_code == 'BucketAlreadyExists': + print("Bucket 'frappe' already exists") + return 0 + else: + print(f"ERROR creating bucket: {e}", file=sys.stderr) + return 1 + except Exception as e: + print(f"ERROR creating bucket: {e}", file=sys.stderr) + return 1 if __name__ == "__main__": - raise SystemExit(main()) + raise SystemExit(main()) \ No newline at end of file