44from azure .core .credentials import AzureNamedKeyCredential
55from azure .core .exceptions import ResourceExistsError
66from azure .storage .queue import QueueServiceClient
7+ import math
78import os
89import logging
910
@@ -25,13 +26,60 @@ def bucket_safe_create(bucket):
2526 _log .info ('Error creating bucket %s - %s' % (bucket .name , str (exp )))
2627 raise exp
2728
29+ def put_file (bucket , object_name , body ):
30+ """
31+ Put an object in a bucket
32+ """
33+ try :
34+ _log .info ('Putting object %s' % object_name )
35+ obj = bucket .Object (object_name )
36+ obj .put (Body = body )
37+ except Exception as exp : # pylint: disable=broad-except
38+ _log .info ('Error putting object %s - %s' % (bucket .name , object_name , str (exp )))
39+ raise exp
40+
41+ def put_singlepart_mpu (bucket , object_name , body ):
42+ """
43+ Put an object in a bucket using a single part multipart upload
44+ """
45+ try :
46+ _log .info ('Putting object %s using multipart upload' % object_name )
47+ mpu = bucket .meta .client .create_multipart_upload (
48+ Bucket = bucket .name ,
49+ Key = object_name
50+ )
51+ response = bucket .meta .client .upload_part (
52+ Body = body ,
53+ Bucket = bucket .name ,
54+ Key = object_name ,
55+ PartNumber = 1 ,
56+ UploadId = mpu ['UploadId' ]
57+ )
58+ bucket .meta .client .complete_multipart_upload (
59+ Bucket = bucket .name ,
60+ Key = object_name ,
61+ UploadId = mpu ['UploadId' ],
62+ MultipartUpload = {
63+ 'Parts' : [{
64+ 'PartNumber' : 1 ,
65+ 'ETag' : response ['ETag' ]
66+ }]
67+ }
68+ )
69+ except Exception as exp :
70+ _log .error ('Error in multipart upload for object %s - %s' % (object_name , str (exp )))
71+ raise exp
72+
2873def create_ring_buckets ():
2974 VERIFY_CERTIFICATES = get_env ('VERIFY_CERTIFICATES' , False )
3075 RING_S3C_ACCESS_KEY = get_env ('RING_S3C_ACCESS_KEY' )
3176 RING_S3C_SECRET_KEY = get_env ('RING_S3C_SECRET_KEY' )
32- RING_S3C_INGESTION_SRC_BUCKET_NAME = get_env ('RING_S3C_INGESTION_SRC_BUCKET_NAME' )
3377 RING_S3C_ENDPOINT = get_env ('RING_S3C_ENDPOINT' )
3478 ENABLE_RING_TESTS = get_env ('ENABLE_RING_TESTS' )
79+ ## test bucket names
80+ RING_S3C_INGESTION_SRC_BUCKET_NAME = get_env ('RING_S3C_INGESTION_SRC_BUCKET_NAME' )
81+ RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME = get_env ('RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME' )
82+ RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE = get_env ('RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE' )
3583
3684 # Disable if Ring is not enabled
3785 if ENABLE_RING_TESTS == "false" :
@@ -42,10 +90,28 @@ def create_ring_buckets():
4290 ring_s3c_client = s3c .resource ('s3' , endpoint_url = RING_S3C_ENDPOINT ,
4391 verify = VERIFY_CERTIFICATES )
4492
93+ versioned_bucket = ring_s3c_client .Bucket (RING_S3C_INGESTION_SRC_BUCKET_NAME )
94+ non_versioned_bucket = ring_s3c_client .Bucket (RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME )
95+
4596 ## Creating S3C buckets
4697 _log .info ('Creating S3C buckets...' )
47- bucket_safe_create (ring_s3c_client .Bucket (RING_S3C_INGESTION_SRC_BUCKET_NAME ))
48- ring_s3c_client .Bucket (RING_S3C_INGESTION_SRC_BUCKET_NAME ).Versioning ().enable ()
98+ bucket_safe_create (versioned_bucket )
99+ bucket_safe_create (non_versioned_bucket )
100+
101+ ## Adding non versioned objects before test execution to avoid
102+ ## having to create the location mid tests which might cause flakiness.
103+ ## A RING location can only be created if the bucket is versioned, and
104+ ## once versioning is enabled it cannot be disabled.
105+ _log .info ('Putting non versioned objects...' )
106+ for i in range (int (RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE )):
107+ put_file (non_versioned_bucket , 'simple-%d' % i , b'data' )
108+ put_file (non_versioned_bucket , 'zerobyte-%d' % i , b'' )
109+ put_singlepart_mpu (non_versioned_bucket , 'mpu-singlepart-%d' % i , b'mpudata' )
110+
111+ ## Enabling versioning
112+ _log .info ('Enabling versioning on buckets...' )
113+ versioned_bucket .Versioning ().enable ()
114+ non_versioned_bucket .Versioning ().enable ()
49115
50116def create_aws_buckets ():
51117 VERIFY_CERTIFICATES = get_env ('VERIFY_CERTIFICATES' , False )
@@ -86,7 +152,6 @@ def create_azure_containers():
86152 except ResourceExistsError :
87153 _log .info ('Container %s already exists!' % bucket_name )
88154
89-
90155def create_azure_queues ():
91156 AZURE_BACKEND_QUEUE_ENDPOINT = get_env ("AZURE_BACKEND_QUEUE_ENDPOINT" )
92157 AZURE_ACCOUNT_NAME = get_env ("AZURE_ACCOUNT_NAME" )
0 commit comments