Skip to content

Commit db8ed58

Browse files
bf: CLDSRV-647 crash in getReplicationInfo with no replication endpoint
Fix an exception in getReplicationInfo when: - no StorageClass is provided - no replication endpoint is configured Instead, return `undefined` so the object is not set to PENDING state for replication, even if the bucket already has a replication configuration enabled.
1 parent 7f04f13 commit db8ed58

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

lib/api/apiUtils/object/getReplicationInfo.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ function _getStorageClasses(s3config, rule) {
2525
replicationEndpoints.find(endpoint => endpoint.default);
2626
return [endPoint.site];
2727
}
28+
if (replicationEndpoints.length === 0) {
29+
return [];
30+
}
2831
return [replicationEndpoints[0].site];
2932
}
3033

@@ -33,6 +36,9 @@ function _getReplicationInfo(s3config, rule, replicationConfig, content, operati
3336
const storageTypes = [];
3437
const backends = [];
3538
const storageClasses = _getStorageClasses(s3config, rule);
39+
if (storageClasses.length === 0) {
40+
return undefined;
41+
}
3642
storageClasses.forEach(storageClass => {
3743
const location = s3config.locationConstraints[storageClass];
3844
if (location && ['aws_s3', 'azure'].includes(location.type)) {

tests/unit/api/apiUtils/getReplicationInfo.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,78 @@ describe('getReplicationInfo helper', () => {
157157

158158
assert.deepStrictEqual(replicationInfo, undefined);
159159
});
160+
161+
it('should get replication info with default StorageClass when rules are enabled', () => {
162+
const replicationConfig = {
163+
role: 'arn:aws:iam::root:role/s3-replication-role-1,arn:aws:iam::root:role/s3-replication-role-2',
164+
rules: [{
165+
prefix: '',
166+
enabled: true,
167+
}],
168+
destination: 'tosomewhere',
169+
};
170+
const replicationInfo = _getObjectReplicationInfo(TEST_CONFIG, replicationConfig);
171+
assert.deepStrictEqual(replicationInfo, {
172+
status: 'PENDING',
173+
backends: [{
174+
site: 'zenko',
175+
status: 'PENDING',
176+
dataStoreVersionId: '',
177+
}],
178+
content: ['METADATA'],
179+
destination: 'tosomewhere',
180+
storageClass: 'zenko',
181+
role: 'arn:aws:iam::root:role/s3-replication-role-1,arn:aws:iam::root:role/s3-replication-role-2',
182+
storageType: '',
183+
});
184+
});
185+
186+
it('should return undefined with specified StorageClass mode if no replication endpoint is configured', () => {
187+
const replicationConfig = {
188+
role: 'arn:aws:iam::root:role/s3-replication-role',
189+
rules: [{
190+
prefix: '',
191+
enabled: true,
192+
storageClass: 'awsbackend',
193+
}],
194+
destination: 'tosomewhere',
195+
};
196+
const configWithNoReplicationEndpoint = {
197+
locationConstraints: TEST_CONFIG.locationConstraints,
198+
replicationEndpoints: [],
199+
};
200+
const replicationInfo = _getObjectReplicationInfo(configWithNoReplicationEndpoint,
201+
replicationConfig);
202+
assert.deepStrictEqual(replicationInfo, {
203+
status: 'PENDING',
204+
backends: [{
205+
site: 'awsbackend',
206+
status: 'PENDING',
207+
dataStoreVersionId: '',
208+
}],
209+
content: ['METADATA'],
210+
destination: 'tosomewhere',
211+
storageClass: 'awsbackend',
212+
role: 'arn:aws:iam::root:role/s3-replication-role',
213+
storageType: 'aws_s3',
214+
});
215+
});
216+
217+
it('should return undefined with default StorageClass if no replication endpoint is configured', () => {
218+
const replicationConfig = {
219+
role: 'arn:aws:iam::root:role/s3-replication-role-1,arn:aws:iam::root:role/s3-replication-role-2',
220+
rules: [{
221+
prefix: '',
222+
enabled: true,
223+
}],
224+
destination: 'tosomewhere',
225+
};
226+
const configWithNoReplicationEndpoint = {
227+
locationConstraints: TEST_CONFIG.locationConstraints,
228+
replicationEndpoints: [],
229+
};
230+
const replicationInfo = _getObjectReplicationInfo(configWithNoReplicationEndpoint,
231+
replicationConfig);
232+
assert.deepStrictEqual(replicationInfo, undefined);
233+
});
160234
});

0 commit comments

Comments
 (0)