Browse Source

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
pull/693/head
Chris Lu 7 years ago
parent
commit
c7228fefa7
  1. 11
      weed/command/s3.go
  2. 14
      weed/filer2/filer.go
  3. 1
      weed/pb/filer.proto
  4. 135
      weed/pb/filer_pb/filer.pb.go
  5. 82
      weed/s3api/s3api_bucket_handlers.go
  6. 4
      weed/s3api/s3api_handlers.go
  7. 104
      weed/s3api/s3api_server.go
  8. 2
      weed/server/filer_grpc_server.go
  9. 19
      weed/server/filer_server_handlers_write.go

11
weed/command/s3.go

@ -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)

14
weed/filer2/filer.go

@ -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

1
weed/pb/filer.proto

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

135
weed/pb/filer_pb/filer.pb.go

@ -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,
}

82
weed/s3api/s3api_bucket_handlers.go

@ -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)
}

4
weed/s3api/s3api_handlers.go

@ -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)
}

104
weed/s3api/s3api_server.go

@ -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)

2
weed/server/filer_grpc_server.go

@ -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
}

19
weed/server/filer_server_handlers_write.go

@ -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)

Loading…
Cancel
Save