diff --git a/constants.js b/constants.js index 341bb70456..c908fccc04 100644 --- a/constants.js +++ b/constants.js @@ -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; diff --git a/lib/routes/routeBackbeat.js b/lib/routes/routeBackbeat.js index 3cbbca50c7..dda267747d 100644 --- a/lib/routes/routeBackbeat.js +++ b/lib/routes/routeBackbeat.js @@ -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; @@ -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, @@ -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, ); @@ -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, }; @@ -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, ); diff --git a/package.json b/package.json index d51f7651d5..477f45a2e4 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/tests/unit/routes/routeBackbeat.js b/tests/unit/routes/routeBackbeat.js index 2ecb23337f..c82a52513e 100644 --- a/tests/unit/routes/routeBackbeat.js +++ b/tests/unit/routes/routeBackbeat.js @@ -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(); @@ -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); + }); + }); +});