MCPcopy
hub / github.com/scality/cloudserver / deleteBucket

Function deleteBucket

lib/api/apiUtils/bucket/bucketDeletion.js:58–156  ·  view source on GitHub ↗

* deleteBucket - Delete bucket from namespace * @param {object} authInfo - authentication info * @param {object} bucketMD - bucket attributes/metadata * @param {string} bucketName - bucket in which objectMetadata is stored * @param {string} canonicalID - account canonicalID of requester * @para

(authInfo, bucketMD, bucketName, canonicalID, request, log, cb)

Source from the content-addressed store, hash-verified

56 * @return {undefined}
57 */
58function deleteBucket(authInfo, bucketMD, bucketName, canonicalID, request, log, cb) {
59 log.trace('deleting bucket from metadata');
60 assert.strictEqual(typeof bucketName, 'string');
61 assert.strictEqual(typeof canonicalID, 'string');
62
63 return async.waterfall([
64 function checkForObjectsStep(next) {
65 const params = { maxKeys: 1, listingType: 'DelimiterVersions' };
66 // We list all the versions as we want to return BucketNotEmpty
67 // error if there are any versions or delete markers in the bucket.
68 // Works for non-versioned buckets as well since listing versions
69 // includes null (non-versioned) objects in the result.
70 return metadata.listObject(bucketName, params, log,
71 (err, list) => {
72 if (err) {
73 log.error('error from metadata', { error: err });
74 return next(err);
75 }
76 const length = (list.Versions ? list.Versions.length : 0) +
77 (list.DeleteMarkers ? list.DeleteMarkers.length : 0);
78 log.debug('listing result', { length });
79 if (length) {
80 log.debug('bucket delete failed',
81 { error: errors.BucketNotEmpty });
82 return next(errors.BucketNotEmpty);
83 }
84 return next();
85 });
86 },
87
88 function deleteMPUbucketStep(next) {
89 const MPUBucketName = `${mpuBucketPrefix}${bucketName}`;
90 // check to see if there are any mpu overview objects (so ignore
91 // any orphaned part objects)
92 return metadata.listObject(MPUBucketName, { prefix: 'overview' },
93 log, (err, objectsListRes) => {
94 // If no shadow bucket ever created, no ongoing MPU's, so
95 // continue with deletion
96 if (err?.is?.NoSuchBucket) {
97 return next();
98 }
99 if (err) {
100 log.error('error from metadata', { error: err });
101 return next(err);
102 }
103 if (objectsListRes.Contents.length) {
104 return _deleteOngoingMPUs(authInfo, bucketName,
105 bucketMD, objectsListRes.Contents, request, log, err => {
106 if (err) {
107 return next(err);
108 }
109 log.trace('deleting shadow MPU bucket');
110 return _deleteMPUbucket(bucketName, log, next);
111 });
112 }
113 log.trace('deleting shadow MPU bucket');
114 return _deleteMPUbucket(bucketName, log, next);
115 });

Callers 1

bucketDeleteFunction · 0.50

Calls 8

_deleteOngoingMPUsFunction · 0.85
_deleteMPUbucketFunction · 0.85
deleteUserBucketEntryFunction · 0.85
traceMethod · 0.80
errorMethod · 0.80
debugMethod · 0.80
deleteBucketMethod · 0.80
destroyBucketKeyMethod · 0.80

Tested by

no test coverage detected