如何在Python中实现MinIO的Get Bucket Quota功能
Python实现MinIO配额查询(等效于
mc quota info)的解决方案 需求背景
需要用Python实现与以下mc CLI命令等效的功能:
mc quota info localhost-reporting-api/bucket-99
该命令输出:
Bucket
bucket-99has hard quota of 954 MiB
官方Python MinIO库未提供此功能,推测是出于AWS S3兼容性考量。通过查看MinIO的Go SDK源码(madmin-go/quota-commands.go),发现其实现逻辑:
// GetBucketQuota - get info on a user func (adm *AdminClient) GetBucketQuota(ctx context.Context, bucket string) (q BucketQuota, err error) { queryValues := url.Values{} queryValues.Set("bucket", bucket) reqData := requestData{ relPath: adminAPIPrefix + "/get-bucket-quota", queryValues: queryValues, } // 后续请求逻辑... }
其中adminAPIPrefix来自utils.go的定义:
// Admin API version prefix adminAPIPrefix = "/" + AdminAPIVersion
MinIO当前的AdminAPIVersion为minio/admin/v4,因此完整的API路径是/minio/admin/v4/get-bucket-quota。
现有代码问题
你当前的尝试代码错误地将bucket名称作为路径参数传入_execute方法,导致请求被识别为普通的bucket列表请求,返回ListBucketResult。Admin API的请求路径与普通S3 API不同,不需要将bucket名称放在路径中,而是通过查询参数传递。
修正后的实现代码
from minio import Minio from minio.error import S3Error from minio.helpers import check_bucket_name, DictType, cast import json class MinioQuota(Minio): def get_bucket_quota(self, bucket_name: str): check_bucket_name(bucket_name, s3_check=self._base_url.is_aws_host) query_params = {"bucket": bucket_name} try: # 调用Admin API:GET /minio/admin/v4/get-bucket-quota?bucket=xxx response = self._execute( "GET", "", # 空字符串表示不使用bucket路径前缀 query_params=cast(DictType, query_params), rel_path="/minio/admin/v4/get-bucket-quota" ) # 解析JSON响应,返回配额信息 return json.loads(response.data.decode()) except S3Error as exc: # 处理"无配额设置"的情况 if exc.code == "NoSuchBucketQuota": return None # 其他异常直接抛出 raise return None
使用示例
# 初始化客户端 client = MinioQuota( "localhost-reporting-api", access_key="your-access-key", secret_key="your-secret-key", secure=False ) # 查询配额 quota = client.get_bucket_quota("bucket-99") if quota: print(f"Bucket `bucket-99` has {quota['Type']} quota of {quota['Quota'] / (1024*1024)} MiB") else: print("Bucket has no quota set")
关键说明
- Admin API的请求路径是
/minio/admin/v4/get-bucket-quota,需通过rel_path参数指定,而非依赖bucket路径前缀。 - bucket名称通过查询参数
bucket传递,而非路径参数。 - 响应为JSON格式,包含
Type(配额类型:hard/soft)和Quota(配额大小,单位字节)两个字段。
内容的提问来源于stack exchange,提问作者VagrantPaladin
相关产品推荐
相关产品推荐

