aboutsummaryrefslogtreecommitdiff
path: root/weed/admin/dash/admin_server.go
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2025-07-01 19:59:45 -0700
committerchrislu <chris.lu@gmail.com>2025-07-01 19:59:45 -0700
commitae1d0a82cee1aac474b832c27556b76f55dd7adc (patch)
tree158d99bef96438c109d446e1f9e3bc87c5c29141 /weed/admin/dash/admin_server.go
parent5c2b2e551376b3955c1bfb91d5b889c1ba506c65 (diff)
downloadseaweedfs-ae1d0a82cee1aac474b832c27556b76f55dd7adc.tar.xz
seaweedfs-ae1d0a82cee1aac474b832c27556b76f55dd7adc.zip
add bucket quota
Diffstat (limited to 'weed/admin/dash/admin_server.go')
-rw-r--r--weed/admin/dash/admin_server.go69
1 files changed, 14 insertions, 55 deletions
diff --git a/weed/admin/dash/admin_server.go b/weed/admin/dash/admin_server.go
index ccfcab6d6..79bce365b 100644
--- a/weed/admin/dash/admin_server.go
+++ b/weed/admin/dash/admin_server.go
@@ -4,9 +4,7 @@ import (
"context"
"fmt"
"net/http"
- "os"
"sort"
- "strings"
"time"
"github.com/seaweedfs/seaweedfs/weed/cluster"
@@ -83,6 +81,8 @@ type S3Bucket struct {
ObjectCount int64 `json:"object_count"`
LastModified time.Time `json:"last_modified"`
Status string `json:"status"`
+ Quota int64 `json:"quota"` // Quota in bytes, 0 means no quota
+ QuotaEnabled bool `json:"quota_enabled"` // Whether quota is enabled
}
type S3Object struct {
@@ -499,6 +499,15 @@ func (s *AdminServer) GetS3Buckets() ([]S3Bucket, error) {
objectCount = collectionData.FileCount
}
+ // Get quota information from entry
+ quota := resp.Entry.Quota
+ quotaEnabled := quota > 0
+ if quota < 0 {
+ // Negative quota means disabled
+ quota = -quota
+ quotaEnabled = false
+ }
+
bucket := S3Bucket{
Name: bucketName,
CreatedAt: time.Unix(resp.Entry.Attributes.Crtime, 0),
@@ -506,6 +515,8 @@ func (s *AdminServer) GetS3Buckets() ([]S3Bucket, error) {
ObjectCount: objectCount,
LastModified: time.Unix(resp.Entry.Attributes.Mtime, 0),
Status: "active",
+ Quota: quota,
+ QuotaEnabled: quotaEnabled,
}
buckets = append(buckets, bucket)
}
@@ -620,59 +631,7 @@ func (s *AdminServer) listBucketObjects(client filer_pb.SeaweedFilerClient, dire
// CreateS3Bucket creates a new S3 bucket
func (s *AdminServer) CreateS3Bucket(bucketName string) error {
- return s.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
- // First ensure /buckets directory exists
- _, err := client.CreateEntry(context.Background(), &filer_pb.CreateEntryRequest{
- Directory: "/",
- Entry: &filer_pb.Entry{
- Name: "buckets",
- IsDirectory: true,
- Attributes: &filer_pb.FuseAttributes{
- FileMode: uint32(0755 | os.ModeDir), // Directory mode
- Uid: uint32(1000),
- Gid: uint32(1000),
- Crtime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TtlSec: 0,
- },
- },
- })
- // Ignore error if directory already exists
- if err != nil && !strings.Contains(err.Error(), "already exists") && !strings.Contains(err.Error(), "existing entry") {
- return fmt.Errorf("failed to create /buckets directory: %v", err)
- }
-
- // Check if bucket already exists
- _, err = client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{
- Directory: "/buckets",
- Name: bucketName,
- })
- if err == nil {
- return fmt.Errorf("bucket %s already exists", bucketName)
- }
-
- // Create bucket directory under /buckets
- _, err = client.CreateEntry(context.Background(), &filer_pb.CreateEntryRequest{
- Directory: "/buckets",
- Entry: &filer_pb.Entry{
- Name: bucketName,
- IsDirectory: true,
- Attributes: &filer_pb.FuseAttributes{
- FileMode: uint32(0755 | os.ModeDir), // Directory mode
- Uid: uint32(1000),
- Gid: uint32(1000),
- Crtime: time.Now().Unix(),
- Mtime: time.Now().Unix(),
- TtlSec: 0,
- },
- },
- })
- if err != nil {
- return fmt.Errorf("failed to create bucket directory: %v", err)
- }
-
- return nil
- })
+ return s.CreateS3BucketWithQuota(bucketName, 0, false)
}
// DeleteS3Bucket deletes an S3 bucket and all its contents