3 changed files with 246 additions and 0 deletions
-
90weed/shell/command_bucket_create.go
-
73weed/shell/command_bucket_delete.go
-
83weed/shell/command_bucket_list.go
@ -0,0 +1,90 @@ |
|||||
|
package shell |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"os" |
||||
|
"time" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
Commands = append(Commands, &commandBucketCreate{}) |
||||
|
} |
||||
|
|
||||
|
type commandBucketCreate struct { |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketCreate) Name() string { |
||||
|
return "bucket.create" |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketCreate) Help() string { |
||||
|
return `create a bucket with a given name |
||||
|
|
||||
|
Example: |
||||
|
bucket.create -name <bucket_name> -replication 001 |
||||
|
` |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketCreate) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { |
||||
|
|
||||
|
bucketCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) |
||||
|
bucketName := bucketCommand.String("name", "", "bucket name") |
||||
|
replication := bucketCommand.String("replication", "", "replication setting for the bucket") |
||||
|
if err = bucketCommand.Parse(args); err != nil { |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
if *bucketName == "" { |
||||
|
return fmt.Errorf("empty bucket name") |
||||
|
} |
||||
|
|
||||
|
filerServer, filerPort, _, parseErr := commandEnv.parseUrl(findInputDirectory(bucketCommand.Args())) |
||||
|
if parseErr != nil { |
||||
|
return parseErr |
||||
|
} |
||||
|
|
||||
|
ctx := context.Background() |
||||
|
|
||||
|
err = commandEnv.withFilerClient(ctx, filerServer, filerPort, func(ctx context.Context, client filer_pb.SeaweedFilerClient) error { |
||||
|
|
||||
|
resp, err := client.GetFilerConfiguration(ctx, &filer_pb.GetFilerConfigurationRequest{}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("get filer %s:%d configuration: %v", filerServer, filerPort, err) |
||||
|
} |
||||
|
filerBucketsPath := resp.DirBuckets |
||||
|
|
||||
|
println("create bucket under", filerBucketsPath) |
||||
|
|
||||
|
entry := &filer_pb.Entry{ |
||||
|
Name: *bucketName, |
||||
|
IsDirectory: true, |
||||
|
Attributes: &filer_pb.FuseAttributes{ |
||||
|
Mtime: time.Now().Unix(), |
||||
|
Crtime: time.Now().Unix(), |
||||
|
FileMode: uint32(0777 | os.ModeDir), |
||||
|
Collection: *bucketName, |
||||
|
Replication: *replication, |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
if err := filer_pb.CreateEntry(ctx, client, &filer_pb.CreateEntryRequest{ |
||||
|
Directory: filerBucketsPath, |
||||
|
Entry: entry, |
||||
|
}); err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
println("created bucket", *bucketName) |
||||
|
|
||||
|
return nil |
||||
|
|
||||
|
}) |
||||
|
|
||||
|
return err |
||||
|
|
||||
|
} |
@ -0,0 +1,73 @@ |
|||||
|
package shell |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
Commands = append(Commands, &commandBucketDelete{}) |
||||
|
} |
||||
|
|
||||
|
type commandBucketDelete struct { |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketDelete) Name() string { |
||||
|
return "bucket.delete" |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketDelete) Help() string { |
||||
|
return `delete a bucket by a given name |
||||
|
|
||||
|
bucket.delete -name <bucket_name> |
||||
|
` |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketDelete) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { |
||||
|
|
||||
|
bucketCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) |
||||
|
bucketName := bucketCommand.String("name", "", "bucket name") |
||||
|
if err = bucketCommand.Parse(args); err != nil { |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
if *bucketName == "" { |
||||
|
return fmt.Errorf("empty bucket name") |
||||
|
} |
||||
|
|
||||
|
filerServer, filerPort, _, parseErr := commandEnv.parseUrl(findInputDirectory(bucketCommand.Args())) |
||||
|
if parseErr != nil { |
||||
|
return parseErr |
||||
|
} |
||||
|
|
||||
|
ctx := context.Background() |
||||
|
|
||||
|
err = commandEnv.withFilerClient(ctx, filerServer, filerPort, func(ctx context.Context, client filer_pb.SeaweedFilerClient) error { |
||||
|
|
||||
|
resp, err := client.GetFilerConfiguration(ctx, &filer_pb.GetFilerConfigurationRequest{}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("get filer %s:%d configuration: %v", filerServer, filerPort, err) |
||||
|
} |
||||
|
filerBucketsPath := resp.DirBuckets |
||||
|
|
||||
|
if _, err := client.DeleteEntry(ctx, &filer_pb.DeleteEntryRequest{ |
||||
|
Directory: filerBucketsPath, |
||||
|
Name: *bucketName, |
||||
|
IsDeleteData: false, |
||||
|
IsRecursive: true, |
||||
|
IgnoreRecursiveError: true, |
||||
|
}); err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
|
||||
|
}) |
||||
|
|
||||
|
return err |
||||
|
|
||||
|
} |
@ -0,0 +1,83 @@ |
|||||
|
package shell |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"math" |
||||
|
|
||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb" |
||||
|
) |
||||
|
|
||||
|
func init() { |
||||
|
Commands = append(Commands, &commandBucketList{}) |
||||
|
} |
||||
|
|
||||
|
type commandBucketList struct { |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketList) Name() string { |
||||
|
return "bucket.list" |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketList) Help() string { |
||||
|
return `list all buckets |
||||
|
|
||||
|
` |
||||
|
} |
||||
|
|
||||
|
func (c *commandBucketList) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { |
||||
|
|
||||
|
bucketCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError) |
||||
|
if err = bucketCommand.Parse(args); err != nil { |
||||
|
return nil |
||||
|
} |
||||
|
|
||||
|
filerServer, filerPort, _, parseErr := commandEnv.parseUrl(findInputDirectory(bucketCommand.Args())) |
||||
|
if parseErr != nil { |
||||
|
return parseErr |
||||
|
} |
||||
|
|
||||
|
ctx := context.Background() |
||||
|
|
||||
|
err = commandEnv.withFilerClient(ctx, filerServer, filerPort, func(ctx context.Context, client filer_pb.SeaweedFilerClient) error { |
||||
|
|
||||
|
resp, err := client.GetFilerConfiguration(ctx, &filer_pb.GetFilerConfigurationRequest{}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("get filer %s:%d configuration: %v", filerServer, filerPort, err) |
||||
|
} |
||||
|
filerBucketsPath := resp.DirBuckets |
||||
|
|
||||
|
stream, err := client.ListEntries(ctx, &filer_pb.ListEntriesRequest{ |
||||
|
Directory: filerBucketsPath, |
||||
|
Limit: math.MaxUint32, |
||||
|
}) |
||||
|
if err != nil { |
||||
|
return fmt.Errorf("list buckets under %v: %v", filerBucketsPath, err) |
||||
|
} |
||||
|
|
||||
|
for { |
||||
|
resp, recvErr := stream.Recv() |
||||
|
if recvErr != nil { |
||||
|
if recvErr == io.EOF { |
||||
|
break |
||||
|
} else { |
||||
|
return recvErr |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if resp.Entry.Attributes.Replication == "" { |
||||
|
fmt.Fprintf(writer, " %s\n", resp.Entry.Name) |
||||
|
} else { |
||||
|
fmt.Fprintf(writer, " %s\t\t\treplication: %s\n", resp.Entry.Name, resp.Entry.Attributes.Replication) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
|
||||
|
}) |
||||
|
|
||||
|
return err |
||||
|
|
||||
|
} |
Reference in new issue
xxxxxxxxxx