chrislu
3 years ago
3 changed files with 100 additions and 0 deletions
@ -0,0 +1,93 @@ |
|||||
|
package shell |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
"io" |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
Commands = append(Commands, &commandS3BucketQuota{}) |
||||
|
} |
||||
|
|
||||
|
type commandS3BucketQuota struct { |
||||
|
} |
||||
|
|
||||
|
func (c *commandS3BucketQuota) Name() string { |
||||
|
return "s3.bucket.quota" |
||||
|
} |
||||
|
|
||||
|
func (c *commandS3BucketQuota) Help() string { |
||||
|
return `set/remove/enable/disable quota for a bucket |
||||
|
|
||||
|
Example: |
||||
|
s3.bucket.quota -name=<bucket_name> -operation=set -sizeMB=1024 |
||||
|
` |
||||
|
} |
||||
|
|
||||
|
func (c *commandS3BucketQuota) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { |
||||
|
|
||||
|
bucketCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) |
||||
|
bucketName := bucketCommand.String("name", "", "bucket name") |
||||
|
operationName := bucketCommand.String("op", "set", "operation name [set|remove|enable|disable]") |
||||
|
sizeMB := bucketCommand.Int64("sizeMB", 0, "bucket quota size in MiB") |
||||
|
if err = bucketCommand.Parse(args); err != nil { |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
if *bucketName == "" { |
||||
|
return fmt.Errorf("empty bucket name") |
||||
|
} |
||||
|
|
||||
|
err = commandEnv.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { |
||||
|
|
||||
|
ctx := context.Background() |
||||
|
|
||||
|
resp, err := client.GetFilerConfiguration(ctx, &filer_pb.GetFilerConfigurationRequest{}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("get filer configuration: %v", err) |
||||
|
} |
||||
|
filerBucketsPath := resp.DirBuckets |
||||
|
|
||||
|
lookupResp, err := client.LookupDirectoryEntry(ctx, &filer_pb.LookupDirectoryEntryRequest{ |
||||
|
Directory: filerBucketsPath, |
||||
|
Name: *bucketName, |
||||
|
}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("did not find bucket %s: %v", *bucketName, err) |
||||
|
} |
||||
|
bucketEntry := lookupResp.Entry |
||||
|
|
||||
|
switch *operationName { |
||||
|
case "set": |
||||
|
bucketEntry.Quota = *sizeMB * 1024 * 1024 |
||||
|
case "remove": |
||||
|
bucketEntry.Quota = 0 |
||||
|
case "enable": |
||||
|
if bucketEntry.Quota < 0 { |
||||
|
bucketEntry.Quota = -bucketEntry.Quota |
||||
|
} |
||||
|
case "disable": |
||||
|
if bucketEntry.Quota > 0 { |
||||
|
bucketEntry.Quota = -bucketEntry.Quota |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if err := filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{ |
||||
|
Directory: filerBucketsPath, |
||||
|
Entry: bucketEntry, |
||||
|
}); err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
println("updated quota for bucket", *bucketName) |
||||
|
|
||||
|
return nil |
||||
|
|
||||
|
}) |
||||
|
|
||||
|
return err |
||||
|
|
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue