add bucket creation and deletion

1. option for "weed s3 -filer.dir.buckets" to choose a folder for buckets
2. create a bucket
3. delete a bucket, recursively delete all metadata on filer
This commit is contained in:
Chris Lu 2018-07-19 01:21:44 -07:00
parent 702fbdf731
commit c7228fefa7
9 changed files with 241 additions and 131 deletions

View file

@ -16,16 +16,18 @@ var (
)
type S3Options struct {
filer *string
filerGrpcPort *int
port *int
domainName *string
filer *string
filerGrpcPort *int
filerBucketsPath *string
port *int
domainName *string
}
func init() {
cmdS3.Run = runS3 // break init cycle
s3options.filer = cmdS3.Flag.String("filer", "localhost:8888", "filer server address")
s3options.filerGrpcPort = cmdS3.Flag.Int("filer.grpcPort", 0, "filer server grpc port, default to filer http port plus 10000")
s3options.filerBucketsPath = cmdS3.Flag.String("filer.dir.buckets", "/s3buckets", "folder on filer to store all buckets")
s3options.port = cmdS3.Flag.Int("port", 8333, "s3options server http listen port")
s3options.domainName = cmdS3.Flag.String("domainName", "", "suffix of the host name, {bucket}.{domainName}")
}
@ -52,6 +54,7 @@ func runS3(cmd *Command, args []string) bool {
Filer: *s3options.filer,
FilerGrpcAddress: filerGrpcAddress,
DomainName: *s3options.domainName,
BucketsPath: *s3options.filerBucketsPath,
})
if s3ApiServer_err != nil {
glog.Fatalf("S3 API Server startup error: %v", s3ApiServer_err)

View file

@ -125,7 +125,7 @@ func (f *Filer) FindEntry(p FullPath) (entry *Entry, err error) {
return f.store.FindEntry(p)
}
func (f *Filer) DeleteEntryMetaAndData(p FullPath, shouldDeleteChunks bool) (err error) {
func (f *Filer) DeleteEntryMetaAndData(p FullPath, isRecursive bool, shouldDeleteChunks bool) (err error) {
entry, err := f.FindEntry(p)
if err != nil {
return err
@ -136,8 +136,14 @@ func (f *Filer) DeleteEntryMetaAndData(p FullPath, shouldDeleteChunks bool) (err
if err != nil {
return fmt.Errorf("list folder %s: %v", p, err)
}
if len(entries) > 0 {
return fmt.Errorf("folder %s is not empty", p)
if isRecursive {
for _, sub := range entries {
f.DeleteEntryMetaAndData(sub.FullPath, isRecursive, shouldDeleteChunks)
}
} else {
if len(entries) > 0 {
return fmt.Errorf("folder %s is not empty", p)
}
}
f.cacheDelDirectory(string(p))
}
@ -158,7 +164,7 @@ func (f *Filer) ListDirectoryEntries(p FullPath, startFileName string, inclusive
func (f *Filer) cacheDelDirectory(dirpath string) {
if f.directoryCache == nil {
return
return
}
f.directoryCache.Delete(dirpath)
return

View file

@ -117,6 +117,7 @@ message DeleteEntryRequest {
string name = 2;
bool is_directory = 3;
bool is_delete_data = 4;
bool is_recursive = 5;
}
message DeleteEntryResponse {

View file

@ -452,6 +452,7 @@ type DeleteEntryRequest struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
IsDirectory bool `protobuf:"varint,3,opt,name=is_directory,json=isDirectory" json:"is_directory,omitempty"`
IsDeleteData bool `protobuf:"varint,4,opt,name=is_delete_data,json=isDeleteData" json:"is_delete_data,omitempty"`
IsRecursive bool `protobuf:"varint,5,opt,name=is_recursive,json=isRecursive" json:"is_recursive,omitempty"`
}
func (m *DeleteEntryRequest) Reset() { *m = DeleteEntryRequest{} }
@ -487,6 +488,13 @@ func (m *DeleteEntryRequest) GetIsDeleteData() bool {
return false
}
func (m *DeleteEntryRequest) GetIsRecursive() bool {
if m != nil {
return m.IsRecursive
}
return false
}
type DeleteEntryResponse struct {
}
@ -987,67 +995,68 @@ var _SeaweedFiler_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("filer.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 990 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x56, 0xdd, 0x6e, 0xdc, 0x44,
0x14, 0x8e, 0xd7, 0xbb, 0x9b, 0xf5, 0xd9, 0x4d, 0x81, 0xd9, 0xb4, 0x98, 0x6d, 0x52, 0x96, 0xa1,
0x45, 0xa9, 0x90, 0xa2, 0x28, 0x70, 0x51, 0x81, 0x90, 0xa8, 0x92, 0x52, 0x55, 0x4a, 0x55, 0xc9,
0x21, 0x48, 0x5c, 0xad, 0x1c, 0xfb, 0x64, 0x19, 0xc5, 0x6b, 0x2f, 0x9e, 0x71, 0x50, 0xb8, 0xe5,
0x92, 0x0b, 0x9e, 0x02, 0xf1, 0x02, 0xbc, 0x01, 0x2f, 0x86, 0xe6, 0xc7, 0xde, 0xf1, 0xda, 0xdb,
0x9f, 0x8b, 0xde, 0xcd, 0x9c, 0x9f, 0xef, 0x7c, 0xc7, 0x3e, 0xe7, 0xb3, 0x61, 0x78, 0xc5, 0x12,
0xcc, 0x0f, 0x97, 0x79, 0x26, 0x32, 0x32, 0x50, 0x97, 0xd9, 0xf2, 0x92, 0xbe, 0x82, 0xfb, 0x67,
0x59, 0x76, 0x5d, 0x2c, 0x4f, 0x59, 0x8e, 0x91, 0xc8, 0xf2, 0xdb, 0x67, 0xa9, 0xc8, 0x6f, 0x03,
0xfc, 0xb5, 0x40, 0x2e, 0xc8, 0x1e, 0x78, 0x71, 0xe9, 0xf0, 0x9d, 0xa9, 0x73, 0xe0, 0x05, 0x2b,
0x03, 0x21, 0xd0, 0x4d, 0xc3, 0x05, 0xfa, 0x1d, 0xe5, 0x50, 0x67, 0xfa, 0x0c, 0xf6, 0xda, 0x01,
0xf9, 0x32, 0x4b, 0x39, 0x92, 0x47, 0xd0, 0x43, 0x69, 0x50, 0x68, 0xc3, 0xe3, 0x0f, 0x0e, 0x4b,
0x2a, 0x87, 0x3a, 0x4e, 0x7b, 0xe9, 0x31, 0x90, 0x33, 0xc6, 0x85, 0xb4, 0x31, 0xe4, 0x6f, 0x45,
0x87, 0x7e, 0x0f, 0xe3, 0x5a, 0x8e, 0xa9, 0xf8, 0x18, 0xb6, 0x51, 0x9b, 0x7c, 0x67, 0xea, 0xb6,
0xd5, 0x2c, 0xfd, 0xf4, 0x6f, 0x07, 0x7a, 0xca, 0x54, 0xb5, 0xe6, 0xac, 0x5a, 0x23, 0x9f, 0xc1,
0x88, 0xf1, 0xd9, 0x8a, 0x80, 0x6c, 0x7b, 0x10, 0x0c, 0x19, 0xaf, 0x5a, 0x25, 0x5f, 0x42, 0x3f,
0xfa, 0xa5, 0x48, 0xaf, 0xb9, 0xef, 0xaa, 0x52, 0xe3, 0x55, 0xa9, 0x1f, 0x58, 0x82, 0x27, 0xd2,
0x17, 0x98, 0x10, 0xf2, 0x04, 0x20, 0x14, 0x22, 0x67, 0x97, 0x85, 0x40, 0xee, 0x77, 0xd5, 0xf3,
0xf0, 0xad, 0x84, 0x82, 0xe3, 0xd3, 0xca, 0x1f, 0x58, 0xb1, 0xf4, 0x0a, 0xbc, 0x0a, 0x8e, 0x7c,
0x0c, 0xdb, 0x32, 0x67, 0xc6, 0x62, 0xc3, 0xb6, 0x2f, 0xaf, 0x2f, 0x62, 0x72, 0x0f, 0xfa, 0xd9,
0xd5, 0x15, 0x47, 0xa1, 0x98, 0xba, 0x81, 0xb9, 0xc9, 0xde, 0x38, 0xfb, 0x1d, 0x7d, 0x77, 0xea,
0x1c, 0x74, 0x03, 0x75, 0x26, 0xbb, 0xd0, 0x5b, 0x08, 0xb6, 0x40, 0x45, 0xc3, 0x0d, 0xf4, 0x85,
0xfe, 0xd9, 0x81, 0x3b, 0x75, 0x1a, 0xe4, 0x3e, 0x78, 0xaa, 0x9a, 0x42, 0x70, 0x14, 0x82, 0x9a,
0xa6, 0xf3, 0x1a, 0x4a, 0xc7, 0x42, 0xa9, 0x52, 0x16, 0x59, 0xac, 0x8b, 0xee, 0xe8, 0x94, 0x97,
0x59, 0x8c, 0xe4, 0x43, 0x70, 0x0b, 0x16, 0xab, 0xb2, 0x3b, 0x81, 0x3c, 0x4a, 0xcb, 0x9c, 0xc5,
0x7e, 0x4f, 0x5b, 0xe6, 0x4c, 0x35, 0x12, 0xe5, 0x0a, 0xb7, 0xaf, 0x1b, 0xd1, 0x37, 0xd9, 0xc8,
0x42, 0x5a, 0xb7, 0xf5, 0x4b, 0x92, 0x67, 0x32, 0x85, 0x61, 0x8e, 0xcb, 0x84, 0x45, 0xa1, 0x60,
0x59, 0xea, 0x0f, 0x94, 0xcb, 0x36, 0x91, 0x07, 0x00, 0x51, 0x96, 0x24, 0x18, 0xa9, 0x00, 0x4f,
0x05, 0x58, 0x16, 0xf9, 0x3c, 0x85, 0x48, 0x66, 0x1c, 0x23, 0x1f, 0xa6, 0xce, 0x41, 0x2f, 0xe8,
0x0b, 0x91, 0x9c, 0x63, 0x44, 0xe7, 0xf0, 0xc9, 0x73, 0x54, 0xe3, 0x75, 0x6b, 0xbd, 0x17, 0x33,
0x9a, 0x6d, 0x03, 0xb3, 0x0f, 0xb0, 0x0c, 0x73, 0x4c, 0x85, 0x1c, 0x1a, 0xb3, 0x25, 0x9e, 0xb6,
0x9c, 0xb2, 0xdc, 0x7e, 0x71, 0xae, 0xfd, 0xe2, 0xe8, 0x1f, 0x0e, 0x4c, 0xda, 0x2a, 0x99, 0x81,
0xae, 0xcf, 0x8d, 0xf3, 0xf6, 0x73, 0x63, 0x8d, 0x67, 0xe7, 0x8d, 0xe3, 0x49, 0x8f, 0xe0, 0xee,
0x73, 0x14, 0xca, 0x9e, 0xa5, 0x02, 0x53, 0x51, 0xb6, 0xba, 0x69, 0xe0, 0xe8, 0x31, 0xdc, 0x5b,
0xcf, 0x30, 0x94, 0x7d, 0xd8, 0x8e, 0xb4, 0x49, 0xa5, 0x8c, 0x82, 0xf2, 0x4a, 0x7f, 0x06, 0x72,
0x92, 0x63, 0x28, 0xf0, 0x1d, 0x74, 0xa7, 0xd2, 0x90, 0xce, 0x6b, 0x35, 0xe4, 0x2e, 0x8c, 0x6b,
0xd0, 0x9a, 0x8b, 0xac, 0x78, 0xb1, 0x8c, 0xdf, 0x57, 0xc5, 0x1a, 0xb4, 0xa9, 0xf8, 0x97, 0x03,
0xe4, 0x14, 0x13, 0x7c, 0xa7, 0x92, 0x2d, 0xe2, 0xda, 0x50, 0x20, 0xb7, 0xa9, 0x40, 0x0f, 0xe1,
0x8e, 0x0c, 0x51, 0xd5, 0x66, 0x71, 0x28, 0x42, 0xb5, 0x5a, 0x83, 0x60, 0xc4, 0xb8, 0xa6, 0x70,
0x1a, 0x8a, 0x50, 0x12, 0xad, 0x11, 0x32, 0x44, 0xff, 0x71, 0x60, 0xfc, 0x94, 0x73, 0x36, 0x4f,
0x7f, 0xca, 0x92, 0x62, 0x81, 0x25, 0xd3, 0x5d, 0xe8, 0x45, 0x59, 0x61, 0x5e, 0x5e, 0x2f, 0xd0,
0x97, 0xb5, 0x45, 0xea, 0x34, 0x16, 0x69, 0x6d, 0x15, 0xdd, 0xe6, 0x2a, 0x5a, 0xab, 0xd6, 0xb5,
0x57, 0x8d, 0x7c, 0x0a, 0x43, 0xc9, 0x7d, 0x16, 0x61, 0x2a, 0x30, 0x57, 0x5a, 0xe0, 0x05, 0x20,
0x4d, 0x27, 0xca, 0x42, 0x6f, 0x60, 0xb7, 0x4e, 0xd4, 0x0c, 0xda, 0x46, 0x31, 0x94, 0x3a, 0x93,
0x27, 0x86, 0xa5, 0x3c, 0xaa, 0xed, 0x2c, 0x2e, 0x13, 0x16, 0xcd, 0xa4, 0xc3, 0x35, 0xdb, 0xa9,
0x2c, 0x17, 0x79, 0xb2, 0xea, 0xb9, 0x6b, 0xf5, 0x4c, 0xbf, 0x86, 0xb1, 0xfe, 0xbc, 0xd5, 0x1f,
0xd0, 0x3e, 0xc0, 0x8d, 0x32, 0xcc, 0x58, 0xac, 0x3f, 0x33, 0x5e, 0xe0, 0x69, 0xcb, 0x8b, 0x98,
0xd3, 0xef, 0xc0, 0x3b, 0xcb, 0x74, 0xcf, 0x9c, 0x1c, 0x81, 0x97, 0x94, 0x17, 0xf3, 0x45, 0x22,
0xab, 0x79, 0x2a, 0xe3, 0x82, 0x55, 0x10, 0xfd, 0x16, 0x06, 0xa5, 0xb9, 0xec, 0xc3, 0xd9, 0xd4,
0x47, 0x67, 0xad, 0x0f, 0xfa, 0x9f, 0x03, 0xbb, 0x75, 0xca, 0xe6, 0x51, 0x5d, 0xc0, 0x4e, 0x55,
0x62, 0xb6, 0x08, 0x97, 0x86, 0xcb, 0x91, 0xcd, 0xa5, 0x99, 0x56, 0x11, 0xe4, 0x2f, 0xc3, 0xa5,
0x9e, 0x9e, 0x51, 0x62, 0x99, 0x26, 0x3f, 0xc2, 0x47, 0x8d, 0x10, 0xc9, 0xfa, 0x1a, 0xcb, 0x21,
0x97, 0x47, 0xf2, 0x18, 0x7a, 0x37, 0x61, 0x52, 0xa0, 0xd9, 0xa8, 0x71, 0xf3, 0x09, 0xf0, 0x40,
0x47, 0x7c, 0xd3, 0x79, 0xe2, 0x1c, 0xff, 0xdb, 0x83, 0xd1, 0x39, 0x86, 0xbf, 0x21, 0xc6, 0x52,
0x5f, 0x72, 0x32, 0x2f, 0xbb, 0xaa, 0xff, 0x67, 0x90, 0x47, 0xeb, 0xf4, 0x5b, 0x7f, 0x6c, 0x26,
0x5f, 0xbc, 0x29, 0xcc, 0x6c, 0xc4, 0x16, 0x39, 0x83, 0xa1, 0xf5, 0x57, 0x41, 0xf6, 0xac, 0xc4,
0xc6, 0x0f, 0xca, 0x64, 0x7f, 0x83, 0xb7, 0x42, 0x0b, 0x81, 0x34, 0x95, 0x9d, 0x7c, 0xbe, 0x4a,
0xdb, 0xf8, 0x85, 0x99, 0x3c, 0x7c, 0x7d, 0x90, 0x4d, 0xd8, 0x92, 0x3d, 0x9b, 0x70, 0x53, 0x68,
0x6d, 0xc2, 0x6d, 0x5a, 0xa9, 0xd0, 0x2c, 0x49, 0xb3, 0xd1, 0x9a, 0x22, 0x6a, 0xa3, 0xb5, 0xe9,
0xa0, 0x42, 0xb3, 0x74, 0xc7, 0x46, 0x6b, 0xea, 0xa3, 0x8d, 0xd6, 0x26, 0x56, 0x5b, 0xe4, 0x15,
0x8c, 0x6c, 0x11, 0x20, 0x56, 0x42, 0x8b, 0x8a, 0x4d, 0x1e, 0x6c, 0x72, 0xdb, 0x80, 0xf6, 0xcc,
0xdb, 0x80, 0x2d, 0x5b, 0x6f, 0x03, 0xb6, 0xad, 0x0a, 0xdd, 0xba, 0xec, 0xab, 0xff, 0xed, 0xaf,
0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x65, 0x12, 0xc7, 0x9d, 0x7e, 0x0b, 0x00, 0x00,
// 1004 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x56, 0x5d, 0x6f, 0xdc, 0x44,
0x14, 0x8d, 0xd7, 0xbb, 0x9b, 0xf5, 0xdd, 0x4d, 0x81, 0xd9, 0xb4, 0x98, 0x6d, 0x52, 0x16, 0xd3,
0xa2, 0x54, 0x48, 0x51, 0x14, 0x78, 0xa8, 0x40, 0x48, 0x54, 0x49, 0xa9, 0x2a, 0xa5, 0xaa, 0x34,
0x21, 0x48, 0x3c, 0xad, 0x1c, 0xfb, 0x66, 0x19, 0xc5, 0x6b, 0x2f, 0x9e, 0x71, 0x50, 0x78, 0xe5,
0x91, 0xdf, 0x81, 0x78, 0x47, 0xfc, 0x03, 0xfe, 0x18, 0x9a, 0x0f, 0x7b, 0xc7, 0x6b, 0x6f, 0x3f,
0x1e, 0xfa, 0x36, 0x73, 0xe7, 0xce, 0xb9, 0xe7, 0xd8, 0xf7, 0x1e, 0x1b, 0x86, 0x57, 0x2c, 0xc1,
0xfc, 0x70, 0x99, 0x67, 0x22, 0x23, 0x03, 0xb5, 0x99, 0x2d, 0x2f, 0x83, 0x57, 0x70, 0xff, 0x2c,
0xcb, 0xae, 0x8b, 0xe5, 0x29, 0xcb, 0x31, 0x12, 0x59, 0x7e, 0xfb, 0x2c, 0x15, 0xf9, 0x2d, 0xc5,
0x5f, 0x0b, 0xe4, 0x82, 0xec, 0x81, 0x17, 0x97, 0x07, 0xbe, 0x33, 0x75, 0x0e, 0x3c, 0xba, 0x0a,
0x10, 0x02, 0xdd, 0x34, 0x5c, 0xa0, 0xdf, 0x51, 0x07, 0x6a, 0x1d, 0x3c, 0x83, 0xbd, 0x76, 0x40,
0xbe, 0xcc, 0x52, 0x8e, 0xe4, 0x11, 0xf4, 0x50, 0x06, 0x14, 0xda, 0xf0, 0xf8, 0x83, 0xc3, 0x92,
0xca, 0xa1, 0xce, 0xd3, 0xa7, 0xc1, 0x31, 0x90, 0x33, 0xc6, 0x85, 0x8c, 0x31, 0xe4, 0x6f, 0x45,
0x27, 0xf8, 0x1e, 0xc6, 0xb5, 0x3b, 0xa6, 0xe2, 0x63, 0xd8, 0x46, 0x1d, 0xf2, 0x9d, 0xa9, 0xdb,
0x56, 0xb3, 0x3c, 0x0f, 0xfe, 0x72, 0xa0, 0xa7, 0x42, 0x95, 0x34, 0x67, 0x25, 0x8d, 0x7c, 0x06,
0x23, 0xc6, 0x67, 0x2b, 0x02, 0x52, 0xf6, 0x80, 0x0e, 0x19, 0xaf, 0xa4, 0x92, 0x2f, 0xa1, 0x1f,
0xfd, 0x52, 0xa4, 0xd7, 0xdc, 0x77, 0x55, 0xa9, 0xf1, 0xaa, 0xd4, 0x0f, 0x2c, 0xc1, 0x13, 0x79,
0x46, 0x4d, 0x0a, 0x79, 0x02, 0x10, 0x0a, 0x91, 0xb3, 0xcb, 0x42, 0x20, 0xf7, 0xbb, 0xea, 0x79,
0xf8, 0xd6, 0x85, 0x82, 0xe3, 0xd3, 0xea, 0x9c, 0x5a, 0xb9, 0xc1, 0x15, 0x78, 0x15, 0x1c, 0xf9,
0x18, 0xb6, 0xe5, 0x9d, 0x19, 0x8b, 0x0d, 0xdb, 0xbe, 0xdc, 0xbe, 0x88, 0xc9, 0x3d, 0xe8, 0x67,
0x57, 0x57, 0x1c, 0x85, 0x62, 0xea, 0x52, 0xb3, 0x93, 0xda, 0x38, 0xfb, 0x1d, 0x7d, 0x77, 0xea,
0x1c, 0x74, 0xa9, 0x5a, 0x93, 0x5d, 0xe8, 0x2d, 0x04, 0x5b, 0xa0, 0xa2, 0xe1, 0x52, 0xbd, 0x09,
0xfe, 0xec, 0xc0, 0x9d, 0x3a, 0x0d, 0x72, 0x1f, 0x3c, 0x55, 0x4d, 0x21, 0x38, 0x0a, 0x41, 0x75,
0xd3, 0x79, 0x0d, 0xa5, 0x63, 0xa1, 0x54, 0x57, 0x16, 0x59, 0xac, 0x8b, 0xee, 0xe8, 0x2b, 0x2f,
0xb3, 0x18, 0xc9, 0x87, 0xe0, 0x16, 0x2c, 0x56, 0x65, 0x77, 0xa8, 0x5c, 0xca, 0xc8, 0x9c, 0xc5,
0x7e, 0x4f, 0x47, 0xe6, 0x4c, 0x09, 0x89, 0x72, 0x85, 0xdb, 0xd7, 0x42, 0xf4, 0x4e, 0x0a, 0x59,
0xc8, 0xe8, 0xb6, 0x7e, 0x49, 0x72, 0x4d, 0xa6, 0x30, 0xcc, 0x71, 0x99, 0xb0, 0x28, 0x14, 0x2c,
0x4b, 0xfd, 0x81, 0x3a, 0xb2, 0x43, 0xe4, 0x01, 0x40, 0x94, 0x25, 0x09, 0x46, 0x2a, 0xc1, 0x53,
0x09, 0x56, 0x44, 0x3e, 0x4f, 0x21, 0x92, 0x19, 0xc7, 0xc8, 0x87, 0xa9, 0x73, 0xd0, 0xa3, 0x7d,
0x21, 0x92, 0x73, 0x8c, 0x82, 0x39, 0x7c, 0xf2, 0x1c, 0x55, 0x7b, 0xdd, 0x5a, 0xef, 0xc5, 0xb4,
0x66, 0x5b, 0xc3, 0xec, 0x03, 0x2c, 0xc3, 0x1c, 0x53, 0x21, 0x9b, 0xc6, 0x4c, 0x89, 0xa7, 0x23,
0xa7, 0x2c, 0xb7, 0x5f, 0x9c, 0x6b, 0xbf, 0xb8, 0xe0, 0x0f, 0x07, 0x26, 0x6d, 0x95, 0x4c, 0x43,
0xd7, 0xfb, 0xc6, 0x79, 0xfb, 0xbe, 0xb1, 0xda, 0xb3, 0xf3, 0xc6, 0xf6, 0x0c, 0x8e, 0xe0, 0xee,
0x73, 0x14, 0x2a, 0x9e, 0xa5, 0x02, 0x53, 0x51, 0x4a, 0xdd, 0xd4, 0x70, 0xc1, 0x31, 0xdc, 0x5b,
0xbf, 0x61, 0x28, 0xfb, 0xb0, 0x1d, 0xe9, 0x90, 0xba, 0x32, 0xa2, 0xe5, 0x36, 0xf8, 0x19, 0xc8,
0x49, 0x8e, 0xa1, 0xc0, 0x77, 0xf0, 0x9d, 0xca, 0x43, 0x3a, 0xaf, 0xf5, 0x90, 0xbb, 0x30, 0xae,
0x41, 0x6b, 0x2e, 0xb2, 0xe2, 0xc5, 0x32, 0x7e, 0x5f, 0x15, 0x6b, 0xd0, 0xa6, 0xe2, 0x3f, 0x0e,
0x90, 0x53, 0x4c, 0xf0, 0x9d, 0x4a, 0xb6, 0x98, 0x6b, 0xc3, 0x81, 0xdc, 0xa6, 0x03, 0x3d, 0x84,
0x3b, 0x32, 0x45, 0x55, 0x9b, 0xc5, 0xa1, 0x08, 0xd5, 0x68, 0x0d, 0xe8, 0x88, 0x71, 0x4d, 0xe1,
0x34, 0x14, 0xa1, 0x01, 0xca, 0x31, 0x2a, 0x72, 0xce, 0x6e, 0x50, 0x0d, 0x9b, 0x02, 0xa2, 0x65,
0x48, 0x6a, 0xa9, 0x71, 0x36, 0x5a, 0xfe, 0x76, 0x60, 0xfc, 0x94, 0x73, 0x36, 0x4f, 0x7f, 0xca,
0x92, 0x62, 0x81, 0xa5, 0x98, 0x5d, 0xe8, 0x45, 0x59, 0x61, 0xde, 0x6f, 0x8f, 0xea, 0xcd, 0xda,
0xac, 0x75, 0x1a, 0xb3, 0xb6, 0x36, 0xad, 0x6e, 0x73, 0x5a, 0xad, 0x69, 0xec, 0xda, 0xd3, 0x48,
0x3e, 0x85, 0xa1, 0x94, 0x37, 0x8b, 0x30, 0x15, 0x98, 0x2b, 0x05, 0x1e, 0x05, 0x19, 0x3a, 0x51,
0x91, 0xe0, 0x06, 0x76, 0xeb, 0x44, 0x4d, 0x2f, 0x6e, 0xf4, 0x4b, 0x69, 0x45, 0x79, 0x62, 0x58,
0xca, 0xa5, 0x1a, 0xe0, 0xe2, 0x32, 0x61, 0xd1, 0x4c, 0x1e, 0xb8, 0x66, 0x80, 0x55, 0xe4, 0x22,
0x4f, 0x56, 0x9a, 0xbb, 0x96, 0xe6, 0xe0, 0x6b, 0x18, 0xeb, 0x2f, 0x60, 0xfd, 0x01, 0xed, 0x03,
0xdc, 0xa8, 0xc0, 0x8c, 0xc5, 0xfa, 0x4b, 0xe4, 0x51, 0x4f, 0x47, 0x5e, 0xc4, 0x3c, 0xf8, 0x0e,
0xbc, 0xb3, 0x4c, 0x6b, 0xe6, 0xe4, 0x08, 0xbc, 0xa4, 0xdc, 0x98, 0x8f, 0x16, 0x59, 0xb5, 0x5c,
0x99, 0x47, 0x57, 0x49, 0xc1, 0xb7, 0x30, 0x28, 0xc3, 0xa5, 0x0e, 0x67, 0x93, 0x8e, 0xce, 0x9a,
0x8e, 0xe0, 0x3f, 0x07, 0x76, 0xeb, 0x94, 0xcd, 0xa3, 0xba, 0x80, 0x9d, 0xaa, 0xc4, 0x6c, 0x11,
0x2e, 0x0d, 0x97, 0x23, 0x9b, 0x4b, 0xf3, 0x5a, 0x45, 0x90, 0xbf, 0x0c, 0x97, 0xba, 0x7b, 0x46,
0x89, 0x15, 0x9a, 0xfc, 0x08, 0x1f, 0x35, 0x52, 0x24, 0xeb, 0x6b, 0x2c, 0xe7, 0x40, 0x2e, 0xc9,
0x63, 0xe8, 0xdd, 0x84, 0x49, 0x81, 0x66, 0xe8, 0xc6, 0xcd, 0x27, 0xc0, 0xa9, 0xce, 0xf8, 0xa6,
0xf3, 0xc4, 0x39, 0xfe, 0xb7, 0x07, 0xa3, 0x73, 0x0c, 0x7f, 0x43, 0x8c, 0xa5, 0x05, 0xe5, 0x64,
0x5e, 0xaa, 0xaa, 0xff, 0x8a, 0x90, 0x47, 0xeb, 0xf4, 0x5b, 0xff, 0x7d, 0x26, 0x5f, 0xbc, 0x29,
0xcd, 0x4c, 0xc4, 0x16, 0x39, 0x83, 0xa1, 0xf5, 0xe3, 0x41, 0xf6, 0xac, 0x8b, 0x8d, 0x7f, 0x98,
0xc9, 0xfe, 0x86, 0xd3, 0x0a, 0x2d, 0x04, 0xd2, 0x34, 0x7f, 0xf2, 0xf9, 0xea, 0xda, 0xc6, 0x8f,
0xd0, 0xe4, 0xe1, 0xeb, 0x93, 0x6c, 0xc2, 0x96, 0x33, 0xda, 0x84, 0x9b, 0x5e, 0x6c, 0x13, 0x6e,
0xb3, 0x53, 0x85, 0x66, 0xb9, 0x9e, 0x8d, 0xd6, 0xf4, 0x59, 0x1b, 0xad, 0xcd, 0x2a, 0x15, 0x9a,
0xe5, 0x3b, 0x36, 0x5a, 0xd3, 0x42, 0x6d, 0xb4, 0x36, 0xb3, 0xda, 0x22, 0xaf, 0x60, 0x64, 0x9b,
0x00, 0xb1, 0x2e, 0xb4, 0xb8, 0xd8, 0xe4, 0xc1, 0xa6, 0x63, 0x1b, 0xd0, 0xee, 0x79, 0x1b, 0xb0,
0x65, 0xea, 0x6d, 0xc0, 0xb6, 0x51, 0x09, 0xb6, 0x2e, 0xfb, 0xea, 0x97, 0xfc, 0xab, 0xff, 0x03,
0x00, 0x00, 0xff, 0xff, 0x27, 0x89, 0x58, 0x67, 0xa1, 0x0b, 0x00, 0x00,
}

View file

@ -7,6 +7,13 @@ import (
"time"
"context"
"fmt"
"github.com/gorilla/mux"
"os"
)
var (
OS_UID = uint32(os.Getuid())
OS_GID = uint32(os.Getgid())
)
func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
@ -15,7 +22,7 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques
err := s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
request := &filer_pb.ListEntriesRequest{
Directory: "/buckets",
Directory: s3a.option.BucketsPath,
}
glog.V(4).Infof("read directory: %v", request)
@ -56,3 +63,76 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques
writeSuccessResponseXML(w, encodeResponse(response))
}
func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
bucket := vars["bucket"]
err := s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
request := &filer_pb.CreateEntryRequest{
Directory: s3a.option.BucketsPath,
Entry: &filer_pb.Entry{
Name: bucket,
IsDirectory: true,
Attributes: &filer_pb.FuseAttributes{
Mtime: time.Now().Unix(),
Crtime: time.Now().Unix(),
FileMode: uint32(0777 | os.ModeDir),
Uid: OS_UID,
Gid: OS_GID,
},
},
}
glog.V(1).Infof("create bucket: %v", request)
if _, err := client.CreateEntry(context.Background(), request); err != nil {
return fmt.Errorf("mkdir %s/%s: %v", s3a.option.BucketsPath, bucket, err)
}
// TODO create collection
return nil
})
if err != nil {
writeErrorResponse(w, ErrInternalError, r.URL)
return
}
writeSuccessResponseEmpty(w)
}
func (s3a *S3ApiServer) DeleteBucketHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
bucket := vars["bucket"]
// TODO delete collection
err := s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
request := &filer_pb.DeleteEntryRequest{
Directory: s3a.option.BucketsPath,
Name: bucket,
IsDirectory: true,
IsDeleteData: false,
IsRecursive: true,
}
glog.V(1).Infof("delete bucket: %v", request)
if _, err := client.DeleteEntry(context.Background(), request); err != nil {
return fmt.Errorf("delete bucket %s/%s: %v", s3a.option.BucketsPath, bucket, err)
}
return nil
})
if err != nil {
writeErrorResponse(w, ErrInternalError, r.URL)
return
}
writeResponse(w, http.StatusNoContent, nil, mimeNone)
}

View file

@ -89,3 +89,7 @@ func writeResponse(w http.ResponseWriter, statusCode int, response []byte, mType
func writeSuccessResponseXML(w http.ResponseWriter, response []byte) {
writeResponse(w, http.StatusOK, response, mimeXML)
}
func writeSuccessResponseEmpty(w http.ResponseWriter) {
writeResponse(w, http.StatusOK, nil, mimeNone)
}

View file

@ -15,6 +15,7 @@ type S3ApiServerOption struct {
Filer string
FilerGrpcAddress string
DomainName string
BucketsPath string
}
type S3ApiServer struct {
@ -40,65 +41,66 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
}
routers = append(routers, apiRouter.PathPrefix("/{bucket}").Subrouter())
/*
for _, bucket := range routers {
// HeadObject
bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(s3a.HeadObjectHandler)
// GetObject
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.GetObjectHandler)
// CopyObject
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(s3a.CopyObjectHandler)
// PutObject
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(s3a.PutObjectHandler)
// DeleteObject
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(s3a.DeleteObjectHandler)
// CopyObjectPart
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(s3a.CopyObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// PutObjectPart
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(s3a.PutObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// ListObjectPxarts
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.ListObjectPartsHandler).Queries("uploadId", "{uploadId:.*}")
// CompleteMultipartUpload
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(s3a.CompleteMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}")
// NewMultipartUpload
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(s3a.NewMultipartUploadHandler).Queries("uploads", "")
// AbortMultipartUpload
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(s3a.AbortMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}")
// ListMultipartUploads
bucket.Methods("GET").HandlerFunc(s3a.ListMultipartUploadsHandler).Queries("uploads", "")
// ListObjectsV2
bucket.Methods("GET").HandlerFunc(s3a.ListObjectsV2Handler).Queries("list-type", "2")
// ListObjectsV1 (Legacy)
bucket.Methods("GET").HandlerFunc(s3a.ListObjectsV1Handler)
// PutBucket
bucket.Methods("PUT").HandlerFunc(s3a.PutBucketHandler)
// HeadBucket
bucket.Methods("HEAD").HandlerFunc(s3a.HeadBucketHandler)
// DeleteMultipleObjects
bucket.Methods("POST").HandlerFunc(s3a.DeleteMultipleObjectsHandler).Queries("delete", "")
// DeleteBucket
bucket.Methods("DELETE").HandlerFunc(s3a.DeleteBucketHandler)
// not implemented
// GetBucketLocation
bucket.Methods("GET").HandlerFunc(s3a.GetBucketLocationHandler).Queries("location", "")
// GetBucketPolicy
bucket.Methods("GET").HandlerFunc(s3a.GetBucketPolicyHandler).Queries("policy", "")
// GetObjectACL
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.GetObjectACLHandler).Queries("acl", "")
// GetBucketACL
bucket.Methods("GET").HandlerFunc(s3a.GetBucketACLHandler).Queries("acl", "")
// PutBucketPolicy
bucket.Methods("PUT").HandlerFunc(s3a.PutBucketPolicyHandler).Queries("policy", "")
// DeleteBucketPolicy
bucket.Methods("DELETE").HandlerFunc(s3a.DeleteBucketPolicyHandler).Queries("policy", "")
// PostPolicy
bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(s3a.PostPolicyBucketHandler)
/*
// HeadObject
bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(s3a.HeadObjectHandler)
// GetObject
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.GetObjectHandler)
// CopyObject
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(s3a.CopyObjectHandler)
// PutObject
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(s3a.PutObjectHandler)
// DeleteObject
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(s3a.DeleteObjectHandler)
// CopyObjectPart
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(s3a.CopyObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// PutObjectPart
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(s3a.PutObjectPartHandler).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// ListObjectPxarts
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.ListObjectPartsHandler).Queries("uploadId", "{uploadId:.*}")
// CompleteMultipartUpload
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(s3a.CompleteMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}")
// NewMultipartUpload
bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(s3a.NewMultipartUploadHandler).Queries("uploads", "")
// AbortMultipartUpload
bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(s3a.AbortMultipartUploadHandler).Queries("uploadId", "{uploadId:.*}")
// ListMultipartUploads
bucket.Methods("GET").HandlerFunc(s3a.ListMultipartUploadsHandler).Queries("uploads", "")
// ListObjectsV2
bucket.Methods("GET").HandlerFunc(s3a.ListObjectsV2Handler).Queries("list-type", "2")
// ListObjectsV1 (Legacy)
bucket.Methods("GET").HandlerFunc(s3a.ListObjectsV1Handler)
// HeadBucket
bucket.Methods("HEAD").HandlerFunc(s3a.HeadBucketHandler)
// DeleteMultipleObjects
bucket.Methods("POST").HandlerFunc(s3a.DeleteMultipleObjectsHandler).Queries("delete", "")
// not implemented
// GetBucketLocation
bucket.Methods("GET").HandlerFunc(s3a.GetBucketLocationHandler).Queries("location", "")
// GetBucketPolicy
bucket.Methods("GET").HandlerFunc(s3a.GetBucketPolicyHandler).Queries("policy", "")
// GetObjectACL
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(s3a.GetObjectACLHandler).Queries("acl", "")
// GetBucketACL
bucket.Methods("GET").HandlerFunc(s3a.GetBucketACLHandler).Queries("acl", "")
// PutBucketPolicy
bucket.Methods("PUT").HandlerFunc(s3a.PutBucketPolicyHandler).Queries("policy", "")
// DeleteBucketPolicy
bucket.Methods("DELETE").HandlerFunc(s3a.DeleteBucketPolicyHandler).Queries("policy", "")
// PostPolicy
bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(s3a.PostPolicyBucketHandler)
*/
}
*/
// ListBuckets
apiRouter.Methods("GET").Path("/").HandlerFunc(s3a.ListBucketsHandler)

View file

@ -162,7 +162,7 @@ func (fs *FilerServer) UpdateEntry(ctx context.Context, req *filer_pb.UpdateEntr
}
func (fs *FilerServer) DeleteEntry(ctx context.Context, req *filer_pb.DeleteEntryRequest) (resp *filer_pb.DeleteEntryResponse, err error) {
err = fs.filer.DeleteEntryMetaAndData(filer2.FullPath(filepath.Join(req.Directory, req.Name)), req.IsDeleteData)
err = fs.filer.DeleteEntryMetaAndData(filer2.FullPath(filepath.Join(req.Directory, req.Name)), req.IsRecursive, req.IsDeleteData)
return &filer_pb.DeleteEntryResponse{}, err
}

View file

@ -31,11 +31,16 @@ func (fs *FilerServer) queryFileInfoByPath(w http.ResponseWriter, r *http.Reques
glog.V(0).Infoln("failing to find path in filer store", path, err.Error())
writeJsonError(w, r, http.StatusInternalServerError, err)
} else {
fileId = entry.Chunks[0].FileId
urlLocation, err = operation.LookupFileId(fs.filer.GetMaster(), fileId)
if err != nil {
glog.V(1).Infof("operation LookupFileId %s failed, err is %s", fileId, err.Error())
w.WriteHeader(http.StatusNotFound)
if len(entry.Chunks) == 0 {
glog.V(1).Infof("empty entry: %s", path)
w.WriteHeader(http.StatusNoContent)
}else{
fileId = entry.Chunks[0].FileId
urlLocation, err = operation.LookupFileId(fs.filer.GetMaster(), fileId)
if err != nil {
glog.V(1).Infof("operation LookupFileId %s failed, err is %s", fileId, err.Error())
w.WriteHeader(http.StatusNotFound)
}
}
}
return
@ -101,7 +106,7 @@ func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request) {
}
} else {
fileId, urlLocation, err = fs.monolithicUploadAnalyzer(w, r, replication, collection, dataCenter)
if err != nil {
if err != nil || fileId == "" {
return
}
}
@ -215,7 +220,7 @@ func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request) {
// curl -X DELETE http://localhost:8888/path/to
func (fs *FilerServer) DeleteHandler(w http.ResponseWriter, r *http.Request) {
err := fs.filer.DeleteEntryMetaAndData(filer2.FullPath(r.URL.Path), true)
err := fs.filer.DeleteEntryMetaAndData(filer2.FullPath(r.URL.Path), false, true)
if err != nil {
glog.V(4).Infoln("deleting", r.URL.Path, ":", err.Error())
writeJsonError(w, r, http.StatusInternalServerError, err)