Skip to content

Commit e762c3f

Browse files
author
Kerkesni
committed
test ingestion of non versioned objets
Issue: ZENKO-4330
1 parent 6b1ac0b commit e762c3f

File tree

4 files changed

+115
-4
lines changed

4 files changed

+115
-4
lines changed

.github/workflows/end2end.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ env:
8181
RING_S3C_ENDPOINT: http://s3c.local:8000
8282
RING_S3C_BACKEND_SOURCE_LOCATION: rings3cbackendingestion
8383
RING_S3C_INGESTION_SRC_BUCKET_NAME: ingestion-test-src-bucket-${{ github.run_id }}
84+
RING_S3C_BACKEND_SOURCE_NON_VERSIONED_LOCATION: rings3cbackendingestionnonversioned
85+
RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME: ingestion-test-src-non-versioned-bucket-${{ github.run_id }}
86+
RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE: 2
8487
# CTST end2end tests
8588
NOTIF_DEST_NAME: "destination1"
8689
NOTIF_DEST_TOPIC: "destination-topic-1"

tests/zenko_tests/create_buckets.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from azure.core.credentials import AzureNamedKeyCredential
55
from azure.core.exceptions import ResourceExistsError
66
from azure.storage.queue import QueueServiceClient
7+
import math
78
import os
89
import 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+
2873
def 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

50116
def 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-
90155
def create_azure_queues():
91156
AZURE_BACKEND_QUEUE_ENDPOINT = get_env("AZURE_BACKEND_QUEUE_ENDPOINT")
92157
AZURE_ACCOUNT_NAME = get_env("AZURE_ACCOUNT_NAME")

tests/zenko_tests/e2e-config.yaml.template

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ locations:
4848
secretKey: "${RING_S3C_SECRET_KEY}"
4949
bucketMatch: yes
5050
repoId: []
51+
- name: "${RING_S3C_BACKEND_SOURCE_NON_VERSIONED_LOCATION}"
52+
locationType: "location-scality-ring-s3-v1"
53+
details:
54+
bucketName: "${RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME}"
55+
endpoint: "${RING_S3C_ENDPOINT}"
56+
accessKey: "${RING_S3C_ACCESS_KEY}"
57+
secretKey: "${RING_S3C_SECRET_KEY}"
58+
bucketMatch: yes
59+
repoId: []
5160
- name: "${GCP_BACKEND_DESTINATION_LOCATION}"
5261
locationType: "location-gcp-v1"
5362
details:

tests/zenko_tests/node_tests/backbeat/tests/ingestion/ingestionS3C.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ const scalityUtils = new IngestionUtility(scalityS3Client, ringS3Client);
99
const ringS3CUtils = new IngestionUtility(ringS3Client);
1010
const ingestionSrcBucket = process.env.RING_S3C_INGESTION_SRC_BUCKET_NAME;
1111
const srcLocation = process.env.RING_S3C_BACKEND_SOURCE_LOCATION;
12+
const ingestionNonVersionedSrcBucket = process.env.RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME;
13+
// Multiplying by 3 to account for the 3 types of objects: simple, zero-byte, and multipart
14+
const nonVersionedObjectCount = parseInt(process.RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE, 10) * 3;
15+
const srcNonVersionedLocation = process.env.RING_S3C_BACKEND_SOURCE_NON_VERSIONED_LOCATION;
1216
const location = srcLocation;
1317
let INGESTION_DEST_BUCKET;
1418
let KEY_PREFIX;
@@ -356,4 +360,34 @@ describe('Ingesting existing data from RING S3C bucket', () => {
356360
next,
357361
),
358362
], done));
363+
364+
// The source bucket used in this test has non versioned objects of 3 types: simple, zero-byte, and multipart
365+
// These non versioned objects were put before creating the location as the bucket has to be versioned
366+
// for the location to be created, and once it's versioned can't be set to non versioned again. This is
367+
// done to avoid having to create the location during the tests which might impact other tests running
368+
// in parallel.
369+
it('should ingest all non versioned objects', done => async.waterfall([
370+
next => scalityUtils.createIngestionBucket(
371+
INGESTION_DEST_BUCKET,
372+
srcNonVersionedLocation,
373+
next,
374+
),
375+
next => ringS3CUtils.s3.listObjectVersions({
376+
Bucket: ingestionNonVersionedSrcBucket,
377+
}, next),
378+
(data, next) => {
379+
assert.strictEqual(data.Versions.length, nonVersionedObjectCount);
380+
assert.strictEqual(data.DeleteMarkers.length, 0);
381+
async.forEach(data.Versions, (version, cb) => {
382+
scalityUtils.compareObjectsRINGS3C(
383+
ingestionNonVersionedSrcBucket,
384+
INGESTION_DEST_BUCKET,
385+
version.Key,
386+
'null',
387+
undefined,
388+
cb,
389+
);
390+
}, next);
391+
},
392+
], done));
359393
});

0 commit comments

Comments
 (0)