Skip to content

Commit 4738e0d

Browse files
committed
Merge branch 'improvement/CLDSRV-742' into q/9.1
2 parents a48d66b + 36af4db commit 4738e0d

File tree

4 files changed

+81
-5
lines changed

4 files changed

+81
-5
lines changed

lib/api/apiUtils/object/objectRestore.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const async = require('async');
2-
const { errors, s3middleware } = require('arsenal');
2+
const { errors, errorInstances, s3middleware } = require('arsenal');
33

44
const { allowedRestoreObjectRequestTierValues } = require('../../../../constants');
55
const coldStorage = require('./coldStorage');
@@ -87,9 +87,9 @@ function objectRestore(metadata, mdUtils, userInfo, request, log, callback) {
8787
// If object metadata is delete marker,
8888
// call back NoSuchKey or MethodNotAllowed depending on specifying versionId
8989
if (objectMD.isDeleteMarker) {
90-
let err = errors.NoSuchKey;
90+
let err = errorInstances.NoSuchKey;
9191
if (decodedVidResult) {
92-
err = errors.MethodNotAllowed;
92+
err = errorInstances.MethodNotAllowed;
9393
}
9494
log.trace('version is a delete marker', { method: METHOD, error: err });
9595
return next(err, bucketMD, objectMD);

lib/api/objectPut.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ const { config } = require('../Config');
2525
const versionIdUtils = versioning.VersionID;
2626
const { updateEncryption } = require('./apiUtils/bucket/updateEncryption');
2727

28+
const invalidSSEError = errorInstances.InvalidArgument.customizeDescription(
29+
'The encryption method specified is not supported');
30+
2831
/**
2932
* PUT Object in the requested bucket. Steps include:
3033
* validating metadata for authorization, bucket and object existence etc.
@@ -97,8 +100,6 @@ function objectPut(authInfo, request, streamingV4Params, log, callback) {
97100
return callback(errors.EntityTooLarge);
98101
}
99102

100-
const invalidSSEError = errorInstances.InvalidArgument.customizeDescription(
101-
'The encryption method specified is not supported');
102103
const requestType = request.apiMethods || 'objectPut';
103104
const valParams = { authInfo, bucketName, objectKey, versionId,
104105
requestType, request, withVersionId: isPutVersion };

tests/unit/api/objectRestore.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const assert = require('assert');
2+
const sinon = require('sinon');
23

34
const { bucketPut } = require('../../../lib/api/bucketPut');
45
const objectPut = require('../../../lib/api/objectPut');
@@ -7,6 +8,7 @@ const { cleanup, DummyRequestLogger, makeAuthInfo } = require('../helpers');
78
const mdColdHelper = require('./utils/metadataMockColdStorage');
89
const DummyRequest = require('../DummyRequest');
910
const metadata = require('../metadataswitch');
11+
const metadataUtils = require('../../../lib/metadata/metadataUtils');
1012

1113
const log = new DummyRequestLogger();
1214
const authInfo = makeAuthInfo('accessKey1');
@@ -157,4 +159,57 @@ describe('restoreObject API', () => {
157159
});
158160
});
159161
});
162+
163+
it('should return NoSuchKey error when object is delete marker without versionId', done => {
164+
const requestWithoutVersionId = objectRestoreRequest(objectRestoreXml);
165+
const mockBucket = {
166+
getName: () => bucketName,
167+
getOwner: () => 'testCanonicalId',
168+
};
169+
const mockDeleteMarkerMD = mdColdHelper.getDeleteMarkerObjectMD();
170+
const stub = sinon.stub(metadataUtils, 'standardMetadataValidateBucketAndObj');
171+
stub.callsFake((params, denies, log, callback) => {
172+
callback(null, mockBucket, mockDeleteMarkerMD);
173+
});
174+
objectRestore(authInfo, requestWithoutVersionId, log, err => {
175+
stub.restore();
176+
try {
177+
assert(err, 'Expected an error');
178+
assert.strictEqual(err.is.NoSuchKey, true);
179+
assert.strictEqual(typeof err.customizeDescription, 'function',
180+
'Error should be from errorInstances which has customizeDescription method');
181+
done();
182+
} catch (assertionError) {
183+
done(assertionError);
184+
}
185+
});
186+
});
187+
188+
it('should return MethodNotAllowed error when object is delete marker with versionId', done => {
189+
const requestWithVersionId = {
190+
...objectRestoreRequest(objectRestoreXml),
191+
query: { versionId: 'null' },
192+
};
193+
const mockBucket = {
194+
getName: () => bucketName,
195+
getOwner: () => 'testCanonicalId',
196+
};
197+
const mockDeleteMarkerMD = mdColdHelper.getDeleteMarkerObjectMD();
198+
const stub = sinon.stub(metadataUtils, 'standardMetadataValidateBucketAndObj');
199+
stub.callsFake((params, denies, log, callback) => {
200+
callback(null, mockBucket, mockDeleteMarkerMD);
201+
});
202+
objectRestore(authInfo, requestWithVersionId, log, err => {
203+
stub.restore();
204+
try {
205+
assert(err, 'Expected an error');
206+
assert.strictEqual(err.is.MethodNotAllowed, true);
207+
assert.strictEqual(typeof err.customizeDescription, 'function',
208+
'Error should be from errorInstances which has customizeDescription method');
209+
done();
210+
} catch (assertionError) {
211+
done(assertionError);
212+
}
213+
});
214+
});
160215
});

tests/unit/api/utils/metadataMockColdStorage.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,32 @@ function getExpiredObjectMD() {
182182
return getRestoredObjectMD(Date.now() - 10000);
183183
}
184184

185+
/**
186+
* Creates the object MD for a delete marker
187+
* @param {string} [versionId] - optional version ID to set
188+
* @returns {ObjectMD} the MD object
189+
*/
190+
function getDeleteMarkerObjectMD(versionId) {
191+
const objectMD = new ObjectMD()
192+
.setOwnerId(defaultOwnerId)
193+
.setOwnerDisplayName('accessKey1displayName')
194+
.setContentLength(0)
195+
.setContentMd5('')
196+
.setKey('objectName')
197+
.setVersionId(versionId || 'deleteMarkerVersionId')
198+
.setDataStoreName('mem');
199+
200+
objectMD.isDeleteMarker = true;
201+
return objectMD;
202+
}
203+
185204
module.exports = {
186205
putObjectMock,
187206
getArchivedObjectMD,
188207
getRestoringObjectMD,
189208
getRestoredObjectMD,
190209
getExpiredObjectMD,
210+
getDeleteMarkerObjectMD,
191211
getTransitionInProgressObjectMD,
192212
putBucketMock,
193213
defaultLocation,

0 commit comments

Comments
 (0)