Buckets Guide
The buckets module manages RGW buckets at the admin level:
- list all buckets or per-user
- get detailed bucket metadata
- delete buckets
- transfer/remove bucket ownership
- verify and repair bucket indexes
API reference: Bucket types and methods
Prerequisites
import { RadosGWAdminClient } from 'radosgw-admin';
const rgw = new RadosGWAdminClient({
host: 'https://ceph-rgw.example.com',
accessKey: process.env.RGW_ADMIN_ACCESS_KEY!,
secretKey: process.env.RGW_ADMIN_SECRET_KEY!,
});
1) List All Buckets
const all = await rgw.buckets.list();
console.log(`Cluster has ${all.length} buckets`);
2) List Buckets by User
const userBuckets = await rgw.buckets.listByUser('alice');
console.log(`alice has ${userBuckets.length} buckets`);
3) Get Bucket Info
const info = await rgw.buckets.getInfo('my-bucket');
console.log('Owner:', info.owner);
console.log('Objects:', info.usage.rgwMain.numObjects);
console.log('Size:', (info.usage.rgwMain.sizeKb / 1024).toFixed(2), 'MB');
4) Delete a Bucket
Safe delete (fails if bucket has objects):
await rgw.buckets.delete({ bucket: 'my-bucket' });
Force delete with object purge:
await rgw.buckets.delete({ bucket: 'my-bucket', purgeObjects: true });
warning
purgeObjects: true permanently deletes all objects in the bucket. This cannot be undone.
5) Transfer Ownership
Move a bucket from one user to another:
const info = await rgw.buckets.getInfo('my-bucket');
await rgw.buckets.transferOwnership({
bucket: 'my-bucket',
bucketId: info.id,
uid: 'bob',
});
info
You need the bucket's internal id (from getInfo()), not just the bucket name.
6) Remove Ownership
Detach a bucket from its owner without deleting it:
await rgw.buckets.removeOwnership({
bucket: 'my-bucket',
uid: 'alice',
});
warning
This leaves the bucket orphaned — it can't be accessed via S3 until ownership is reassigned with transferOwnership().
7) Verify Bucket Index
Check for index inconsistencies (read-only):
const result = await rgw.buckets.verifyIndex({
bucket: 'my-bucket',
checkObjects: true,
fix: false,
});
console.log('Invalid entries:', result.invalidMultipartEntries);
Repair detected issues:
await rgw.buckets.verifyIndex({
bucket: 'my-bucket',
fix: true,
});
Error Handling
import {
RGWValidationError,
RGWNotFoundError,
} from 'radosgw-admin';
try {
await rgw.buckets.delete({ bucket: 'my-bucket' });
} catch (error) {
if (error instanceof RGWNotFoundError) {
// bucket does not exist
} else if (error instanceof RGWValidationError) {
// bucket name is empty
} else {
throw error;
}
}
Production Notes
- Always use
getInfo()beforetransferOwnership()to get the correctbucketId. - Avoid
purgeObjects: truein automated loops — add a manual confirmation step. - Run
verifyIndex({ fix: false })first to assess damage before repairing. - The
list()method fetches up to 100,000 entries. For very large clusters, check that the returned count matches expectations. - Bucket ownership transfers don't move objects — they update metadata only.