Skip to content
Merged
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
8 changes: 8 additions & 0 deletions constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,14 @@ const constants = {
crrCascadeBlockedLocationTypes: ['location-scality-ring-s3-v1', 'location-scality-artesca-s3-v1'],
// Supported attributes for the GetObjectAttributes 'x-amz-optional-attributes' header.
supportedGetObjectAttributes: new Set(['StorageClass', 'ObjectSize', 'ObjectParts', 'Checksum', 'ETag']),
// Error names returned in CRR conflict responses of backbeat routes. They must
// match the exception names of @scality/cloudserverclient, which is kept out of
// runtime dependencies.
crrConflictErrors: {
VersionIdCollision: 'VersionIdCollisionException',
StaleMicroVersionId: 'StaleMicroVersionIdException',
MicroVersionIdAlreadyStored: 'MicroVersionIdAlreadyStoredException',
},
};

module.exports = constants;
14 changes: 5 additions & 9 deletions lib/routes/routeBackbeat.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ const backbeatProxy = httpProxy.createProxyServer({
});
const { auth, errors, errorInstances, s3middleware, s3routes, models, storage, versioning } = require('arsenal');
const { decode, encode } = versioning.VersionID;
const {
VersionIdCollisionException,
StaleMicroVersionIdException,
MicroVersionIdAlreadyStoredException,
} = require('@scality/cloudserverclient');

const { responseJSONBody } = s3routes.routesUtils;
const { getSubPartIds } = s3middleware.azureHelper.mpuUtils;
Expand Down Expand Up @@ -53,6 +48,7 @@ metadata.getObjectMDPromised = promisify(metadata.getObjectMD);
metadata.getBucketAndObjectMDPromised = promisify(metadata.getBucketAndObjectMD);

const { CURRENT_TYPE, NON_CURRENT_TYPE, ORPHAN_DM_TYPE } = constants.lifecycleListing;
const { crrConflictErrors } = constants;

const lifecycleTypeCalls = {
[CURRENT_TYPE]: listLifecycleCurrents,
Expand Down Expand Up @@ -448,7 +444,7 @@ function putData(request, response, bucketInfo, objMd, log, callback) {
response,
log,
callback,
VersionIdCollisionException.name,
crrConflictErrors.VersionIdCollision,
'version id already at destination',
objMd.microVersionId,
);
Expand Down Expand Up @@ -605,12 +601,12 @@ function putMetadata(request, response, bucketInfo, objMd, log, callback) {
let conflictErr = null;
if (incomingMicroVersionId === objectMicroVersionId) {
conflictErr = {
err: MicroVersionIdAlreadyStoredException.name,
err: crrConflictErrors.MicroVersionIdAlreadyStored,
message: 'incoming microVersionId already at destination',
};
} else if (isIncomingOlderThanCurrent(incomingMicroVersionId, objectMicroVersionId)) {
conflictErr = {
err: StaleMicroVersionIdException.name,
err: crrConflictErrors.StaleMicroVersionId,
message: 'incoming revision is older than destination',
mvId: objMd?.microVersionId,
};
Expand Down Expand Up @@ -1051,7 +1047,7 @@ function putMetadata(request, response, bucketInfo, objMd, log, callback) {
response,
log,
callback,
StaleMicroVersionIdException.name,
crrConflictErrors.StaleMicroVersionId,
'incoming revision is not newer than stored',
objMd?.microVersionId,
);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@
"vaultclient": "scality/vaultclient#8.5.8",
"werelogs": "scality/werelogs#semver:^8.2.4",
"ws": "^8.18.0",
"@scality/cloudserverclient": "1.0.12",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@eslint/compat": "^1.2.2",
"@scality/cloudserverclient": "1.0.12",
"@scality/eslint-config-scality": "scality/Guidelines#8.3.1",
"eslint": "^9.14.0",
"eslint-plugin-import": "^2.31.0",
Expand Down
14 changes: 14 additions & 0 deletions tests/unit/routes/routeBackbeat.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ const bucketPutVersioning = require('../../../lib/api/bucketPutVersioning');
const objectPut = require('../../../lib/api/objectPut');
const { objectDelete } = require('../../../lib/api/objectDelete');
const bucketPutPolicy = require('../../../lib/api/bucketPutPolicy');
const cloudserverClient = require('@scality/cloudserverclient');
const { crrConflictErrors } = require('../../../constants');

const log = new DummyRequestLogger();

Expand Down Expand Up @@ -1654,3 +1656,15 @@ describe('routeBackbeat index add payload validation', () => {
assert.strictEqual(metadata.putBucketIndexes.called, false);
});
});

describe('routeBackbeat CRR conflict error names', () => {
[
['VersionIdCollision', 'VersionIdCollisionException'],
['StaleMicroVersionId', 'StaleMicroVersionIdException'],
['MicroVersionIdAlreadyStored', 'MicroVersionIdAlreadyStoredException'],
].forEach(([key, exception]) => {
it(`should match cloudserverclient ${exception} name`, () => {
assert.strictEqual(crrConflictErrors[key], cloudserverClient[exception].name);
});
});
});
Loading