Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 40 additions & 34 deletions tests/functional/aws-node-sdk/lib/utility/versioning-util.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
const async = require('async');
const assert = require('assert');
const { S3 } = require('aws-sdk');
const { S3Client,
ListObjectVersionsCommand,
GetObjectCommand,
DeleteObjectsCommand,
PutBucketVersioningCommand,
PutObjectCommand,
DeleteObjectCommand } = require('@aws-sdk/client-s3');

const getConfig = require('../../test/support/config');
const config = getConfig('default', { signatureVersion: 'v4' });
const s3 = new S3(config);
const config = getConfig('default');
const s3Client = new S3Client(config);

const versioningEnabled = { Status: 'Enabled' };
const versioningSuspended = { Status: 'Suspended' };
Expand All @@ -19,28 +25,25 @@ function _deleteVersionList(versionList, bucket, callback) {
Key: version.Key, VersionId: version.VersionId });
});

return s3.deleteObjects(params, callback);
return s3Client.send(new DeleteObjectsCommand(params)).then(() => callback()).catch(err => callback(err));
}

function checkOneVersion(s3, bucket, versionId, callback) {
return s3.listObjectVersions({ Bucket: bucket },
(err, data) => {
if (err) {
callback(err);
}
return s3Client.send(new ListObjectVersionsCommand({ Bucket: bucket })).then(data => {
assert.strictEqual(data.Versions.length, 1);
if (versionId) {
assert.strictEqual(data.Versions[0].VersionId, versionId);
}
assert.strictEqual(data.DeleteMarkers.length, 0);
callback();
});
}).catch(err => callback(err));
}

function removeAllVersions(params, callback) {
const bucket = params.Bucket;
async.waterfall([
cb => s3.listObjectVersions(params, cb),
cb => s3Client.send(new ListObjectVersionsCommand(params)).then(data =>
cb(null, data)).catch(err => cb(err)),
(data, cb) => _deleteVersionList(data.DeleteMarkers, bucket,
err => cb(err, data)),
(data, cb) => _deleteVersionList(data.Versions, bucket,
Expand All @@ -60,25 +63,26 @@ function removeAllVersions(params, callback) {
}

function suspendVersioning(bucket, callback) {
s3.putBucketVersioning({
s3Client.send(new PutBucketVersioningCommand({
Bucket: bucket,
VersioningConfiguration: versioningSuspended,
}, callback);
})).then(() => callback()).catch(err => callback(err));
}

function enableVersioning(bucket, callback) {
s3.putBucketVersioning({
s3Client.send(new PutBucketVersioningCommand({
Bucket: bucket,
VersioningConfiguration: versioningEnabled,
}, callback);
})).then(() => callback()).catch(err => callback(err));
}

function enableVersioningThenPutObject(bucket, object, callback) {
enableVersioning(bucket, err => {
if (err) {
callback(err);
}
s3.putObject({ Bucket: bucket, Key: object }, callback);
s3Client.send(new PutObjectCommand({ Bucket: bucket, Key: object })).then(() =>
callback()).catch(err => callback(err));
});
}

Expand All @@ -102,33 +106,35 @@ function enableVersioningThenPutObject(bucket, object, callback) {
function createDualNullVersion(s3, bucketName, keyName, cb) {
async.waterfall([
// put null version
next => s3.putObject({ Bucket: bucketName, Key: keyName },
err => next(err)),
next => s3Client.send(new PutObjectCommand({ Bucket: bucketName, Key: keyName, Body: null })).then(() =>
next()).catch(err => next(err)),
next => enableVersioning(bucketName, err => next(err)),
// should store null version as separate version before
// putting new version
next => s3.putObject({ Bucket: bucketName, Key: keyName },
(err, data) => {
assert.strictEqual(err, null,
'Unexpected err putting new version');
assert(data.VersionId);
next(null, data.VersionId);
}),
next => s3Client.send(new PutObjectCommand({ Bucket: bucketName, Key: keyName })).then(data => {
assert(data.VersionId);
next(null, data.VersionId);
}).catch(err => {
assert.strictEqual(err, null,
'Unexpected err putting new version');
next(err);
}),
// delete version we just created, master version should be updated
// with value of next most recent version: null version previously put
(versionId, next) => s3.deleteObject({
(versionId, next) => s3Client.send(new DeleteObjectCommand({
Bucket: bucketName,
Key: keyName,
VersionId: versionId,
}, err => next(err)),
})).then(() => next()).catch(err => next(err)),
// getting object should return null version now
next => s3.getObject({ Bucket: bucketName, Key: keyName },
(err, data) => {
assert.strictEqual(err, null,
'Unexpected err getting latest version');
assert.strictEqual(data.VersionId, 'null');
next();
}),
next => s3Client.send(new GetObjectCommand({ Bucket: bucketName, Key: keyName })).then(data => {
assert.strictEqual(data.VersionId, 'null');
next();
}).catch(err => {
assert.strictEqual(err, null,
'Unexpected err getting latest version');
next(err);
}),
], err => cb(err));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
const assert = require('assert');
const async = require('async');
const {
CreateBucketCommand,
PutObjectCommand,
GetObjectAclCommand,
PutObjectAclCommand,
} = require('@aws-sdk/client-s3');

const withV4 = require('../../support/withV4');
const BucketUtility = require('../../../lib/utility/bucket-util');
const constants = require('../../../../../../constants');
Expand Down Expand Up @@ -56,27 +63,45 @@ const testAcp = new _AccessControlPolicy(ownerParams);
testAcp.addGrantee('Group', constants.publicId, 'READ');

function putObjectAcl(s3, key, versionId, acp, cb) {
s3.putObjectAcl({ Bucket: bucket, Key: key, AccessControlPolicy: acp,
VersionId: versionId }, err => {
assert.strictEqual(err, null, 'Expected success ' +
`putting object acl, got error ${err}`);
cb();
});
const params = {
Bucket: bucket,
Key: key,
AccessControlPolicy: acp,
};
if (versionId) {
params.VersionId = versionId;
}

const command = new PutObjectAclCommand(params);
s3.send(command)
.then(() => cb())
.catch(err => {
assert.strictEqual(err, null, 'Expected success ' +
`putting object acl, got error ${err}`);
});
}

function putObjectAndAcl(s3, key, body, acp, cb) {
s3.putObject({ Bucket: bucket, Key: key, Body: body },
(err, putData) => {
assert.strictEqual(err, null, 'Expected success ' +
`putting object, got error ${err}`);
putObjectAcl(s3, key, putData.VersionId, acp, () =>
cb(null, putData.VersionId));
const command = new PutObjectCommand({
Bucket: bucket,
Key: key,
Body: body,
});

s3.send(command)
.then(putData => {
putObjectAcl(s3, key, putData.VersionId, acp, () =>
cb(null, putData.VersionId));
})
.catch(err => {
assert.strictEqual(err, null, 'Expected success ' +
`putting object, got error ${err}`);
});
}

/** putVersionsWithAclToAws - enable versioning and put multiple versions
* followed by putting object acl
* @param {AWS.S3} s3 - aws node sdk s3 instance
* @param {S3Client} s3 - aws sdk v3 s3 client instance
* @param {string} key - string
* @param {(string[]|Buffer[])} data - array of data to put as objects
* @param {_AccessControlPolicy[]} acps - array of _AccessControlPolicy instance
Expand All @@ -103,19 +128,30 @@ function getObjectAndAssertAcl(s3, params, cb) {
= params;
getAndAssertResult(s3, { bucket, key, versionId, expectedVersionId, body },
() => {
s3.getObjectAcl({ Bucket: bucket, Key: key, VersionId: versionId },
(err, data) => {
assert.strictEqual(err, null, 'Expected success ' +
`getting object acl, got error ${err}`);
const aclParams = {
Bucket: bucket,
Key: key,
};
if (versionId) {
aclParams.VersionId = versionId;
}

const command = new GetObjectAclCommand(aclParams);
s3.send(command)
.then(data => {
assert.deepEqual(data, expectedResult);
cb();
})
.catch(err => {
assert.strictEqual(err, null, 'Expected success ' +
`getting object acl, got error ${err}`);
});
});
}

/** getObjectsAndAssertAcls - enable versioning and put multiple versions
* followed by putting object acl
* @param {AWS.S3} s3 - aws node sdk s3 instance
* @param {S3Client} s3 - aws sdk v3 s3 client instance
* @param {string} key - string
* @param {string[]} versionIds - array of versionIds to use to get objs & acl
* @param {(string[]|Buffer[])} expectedData - array of data expected from gets
Expand Down Expand Up @@ -150,15 +186,19 @@ function testSuite() {
process.stdout.write('Creating bucket');
bucketUtil = new BucketUtility('default', sigCfg);
s3 = bucketUtil.s3;
return s3.createBucket({ Bucket: bucket,

const command = new CreateBucketCommand({
Bucket: bucket,
CreateBucketConfiguration: {
LocationConstraint: awsLocation,
},
}).promise()
.catch(err => {
process.stdout.write(`Error creating bucket: ${err}\n`);
throw err;
});

return s3.send(command)
.catch(err => {
process.stdout.write(`Error creating bucket: ${err}\n`);
throw err;
});
});

afterEach(() => {
Expand Down
Loading
Loading