aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/filer_util.go
diff options
context:
space:
mode:
authorKonstantin Lebedev <lebedev_k@tochka.com>2020-11-03 21:45:56 +0500
committerKonstantin Lebedev <lebedev_k@tochka.com>2020-11-03 21:45:56 +0500
commite1190b3224638616cf4e1318ddcba0b1575f2130 (patch)
tree6765b03449064f1e0e91bf56897ac6c760612e82 /weed/s3api/filer_util.go
parente1423a83dd9ffdd0eedbe5e5f8507e2b8aa77931 (diff)
downloadseaweedfs-e1190b3224638616cf4e1318ddcba0b1575f2130.tar.xz
seaweedfs-e1190b3224638616cf4e1318ddcba0b1575f2130.zip
load S3 config from filer
https://github.com/chrislusf/seaweedfs/issues/1500
Diffstat (limited to 'weed/s3api/filer_util.go')
-rw-r--r--weed/s3api/filer_util.go105
1 files changed, 103 insertions, 2 deletions
diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go
index ebdbe8245..f6cfed785 100644
--- a/weed/s3api/filer_util.go
+++ b/weed/s3api/filer_util.go
@@ -3,10 +3,13 @@ package s3api
import (
"context"
"fmt"
- "strings"
-
"github.com/chrislusf/seaweedfs/weed/glog"
+ "github.com/chrislusf/seaweedfs/weed/pb"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
+ "github.com/chrislusf/seaweedfs/weed/pb/iam_pb"
+ proto "github.com/golang/protobuf/proto"
+ "google.golang.org/grpc"
+ "strings"
)
func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string, fn func(entry *filer_pb.Entry)) error {
@@ -75,6 +78,104 @@ func (s3a *S3ApiServer) exists(parentDirectoryPath string, entryName string, isD
}
+func loadS3config(iam *IdentityAccessManagement, option *S3ApiServerOption) error {
+ return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
+ client := filer_pb.NewSeaweedFilerClient(grpcConnection)
+ resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
+ Directory: "/.configs",
+ Name: "s3identities",
+ })
+ if err != nil {
+ return err
+ }
+ for name, ident := range resp.Entry.Extended {
+ t := &Identity{
+ Name: name,
+ Credentials: nil,
+ Actions: nil,
+ }
+ identity := &iam_pb.Identity{}
+ if err := proto.Unmarshal(ident, identity); err != nil {
+ return err
+ }
+ for _, action := range identity.Actions {
+ t.Actions = append(t.Actions, Action(action))
+ }
+ for _, cred := range identity.Credentials {
+ t.Credentials = append(t.Credentials, &Credential{
+ AccessKey: cred.AccessKey,
+ SecretKey: cred.SecretKey,
+ })
+ glog.V(0).Infof("AccessKey %s, SecretKey: %s", cred.AccessKey, cred.SecretKey)
+ }
+ iam.identities = append(iam.identities, t)
+ }
+ return nil
+ }, option.FilerGrpcAddress, option.GrpcDialOption)
+}
+
+/* testing save
+func saveS3config(iam *IdentityAccessManagement, option *S3ApiServerOption) (error) {
+ return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
+ client := filer_pb.NewSeaweedFilerClient(grpcConnection)
+ entry := &filer_pb.Entry{
+ Name: "s3identities",
+ IsDirectory: false,
+ Attributes: &filer_pb.FuseAttributes{
+ Mtime: time.Now().Unix(),
+ Crtime: time.Now().Unix(),
+ FileMode: uint32(0644),
+ Collection: "",
+ Replication: "",
+ },
+ Extended: make(map[string][]byte),
+ }
+ for _, identity := range iam.identities {
+ glog.V(0).Infof("get iam identities %s", identity.Name)
+ i := &iam_pb.Identity{
+ Name: identity.Name,
+ Credentials: []*iam_pb.Credential{},
+ Actions: []string{},
+ }
+ for _, cred := range identity.Credentials {
+ i.Credentials = append(i.Credentials, &iam_pb.Credential{
+ AccessKey: cred.AccessKey,
+ SecretKey: cred.SecretKey,
+ })
+ }
+ for _, action := range identity.Actions {
+ i.Actions = append(i.Actions, string(action))
+ }
+ ident, err := proto.Marshal(i)
+ if err != nil {
+ return err
+ }
+ entry.Extended[identity.Name] = ident
+ }
+ _, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
+ Directory: "/.configs",
+ Name: "s3identities",
+ })
+ if err == filer_pb.ErrNotFound {
+ err = filer_pb.CreateEntry(client, &filer_pb.CreateEntryRequest{
+ Directory: "/.configs",
+ Entry: entry,
+ IsFromOtherCluster: false,
+ Signatures: nil,
+ })
+ } else {
+ err = filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
+ Directory: "/.configs",
+ Entry: entry,
+ IsFromOtherCluster: false,
+ Signatures: nil,
+ })
+ }
+ return err
+ },option.FilerGrpcAddress, option.GrpcDialOption)
+}
+*/
+
func objectKey(key *string) *string {
if strings.HasPrefix(*key, "/") {
t := (*key)[1:]