diff --git a/api/handler/handlers_test.go b/api/handler/handlers_test.go index 082c2ad..2ae9363 100644 --- a/api/handler/handlers_test.go +++ b/api/handler/handlers_test.go @@ -167,7 +167,7 @@ func prepareHandlerContextBase(cacheCfg *layer.CachesConfig) (*handlerContextBas tp := layer.NewTestFrostFS(key) testResolver := &resolver.Resolver{Name: "test_resolver"} - testResolver.SetResolveFunc(func(_ context.Context, name string) (cid.ID, error) { + testResolver.SetResolveFunc(func(_ context.Context, name, _ string, _ bool) (cid.ID, error) { return tp.ContainerID(name) }) diff --git a/api/layer/layer.go b/api/layer/layer.go index 0a8512b..e67eb71 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -35,7 +35,7 @@ import ( type ( BucketResolver interface { - Resolve(ctx context.Context, name string) (cid.ID, error) + Resolve(ctx context.Context, name, zone string, isDefault bool) (cid.ID, error) } FeatureSettings interface { @@ -801,7 +801,10 @@ func (n *Layer) CreateBucket(ctx context.Context, p *CreateBucketParams) (*data. func (n *Layer) ResolveBucket(ctx context.Context, name string) (cid.ID, error) { var cnrID cid.ID if err := cnrID.DecodeString(name); err != nil { - if cnrID, err = n.resolver.Resolve(ctx, name); err != nil { + reqInfo := middleware.GetReqInfo(ctx) + zone, isDefault := n.features.FormContainerZone(reqInfo.Namespace) + + if cnrID, err = n.resolver.Resolve(ctx, name, zone, isDefault); err != nil { return cid.ID{}, err } diff --git a/api/resolver/resolver.go b/api/resolver/resolver.go index c394be7..3477aba 100644 --- a/api/resolver/resolver.go +++ b/api/resolver/resolver.go @@ -6,7 +6,6 @@ import ( "fmt" "sync" - "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/middleware" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/ns" @@ -36,13 +35,11 @@ type Settings interface { type Config struct { FrostFS FrostFS RPCAddress string - Settings Settings } type BucketResolver struct { rpcAddress string frostfs FrostFS - settings Settings mu sync.RWMutex resolvers []*Resolver @@ -50,15 +47,15 @@ type BucketResolver struct { type Resolver struct { Name string - resolve func(context.Context, string) (cid.ID, error) + resolve func(context.Context, string, string, bool) (cid.ID, error) } -func (r *Resolver) SetResolveFunc(fn func(context.Context, string) (cid.ID, error)) { +func (r *Resolver) SetResolveFunc(fn func(context.Context, string, string, bool) (cid.ID, error)) { r.resolve = fn } -func (r *Resolver) Resolve(ctx context.Context, name string) (cid.ID, error) { - return r.resolve(ctx, name) +func (r *Resolver) Resolve(ctx context.Context, name, zone string, isDefault bool) (cid.ID, error) { + return r.resolve(ctx, name, zone, isDefault) } func NewBucketResolver(resolverNames []string, cfg *Config) (*BucketResolver, error) { @@ -87,12 +84,12 @@ func createResolvers(resolverNames []string, cfg *Config) ([]*Resolver, error) { return resolvers, nil } -func (r *BucketResolver) Resolve(ctx context.Context, bktName string) (cnrID cid.ID, err error) { +func (r *BucketResolver) Resolve(ctx context.Context, bktName, zone string, isDefault bool) (cnrID cid.ID, err error) { r.mu.RLock() defer r.mu.RUnlock() for _, resolver := range r.resolvers { - cnrID, resolverErr := resolver.Resolve(ctx, bktName) + cnrID, resolverErr := resolver.Resolve(ctx, bktName, zone, isDefault) if resolverErr != nil { resolverErr = fmt.Errorf("%s: %w", resolver.Name, resolverErr) if err == nil { @@ -123,7 +120,6 @@ func (r *BucketResolver) UpdateResolvers(resolverNames []string) error { cfg := &Config{ FrostFS: r.frostfs, RPCAddress: r.rpcAddress, - Settings: r.settings, } resolvers, err := createResolvers(resolverNames, cfg) @@ -152,29 +148,24 @@ func (r *BucketResolver) equals(resolverNames []string) bool { func newResolver(name string, cfg *Config) (*Resolver, error) { switch name { case DNSResolver: - return NewDNSResolver(cfg.FrostFS, cfg.Settings) + return NewDNSResolver(cfg.FrostFS) case NNSResolver: - return NewNNSResolver(cfg.RPCAddress, cfg.Settings) + return NewNNSResolver(cfg.RPCAddress) default: return nil, fmt.Errorf("unknown resolver: %s", name) } } -func NewDNSResolver(frostFS FrostFS, settings Settings) (*Resolver, error) { +func NewDNSResolver(frostFS FrostFS) (*Resolver, error) { if frostFS == nil { return nil, fmt.Errorf("pool must not be nil for DNS resolver") } - if settings == nil { - return nil, fmt.Errorf("resolver settings must not be nil for DNS resolver") - } var dns ns.DNS - resolveFunc := func(ctx context.Context, name string) (cid.ID, error) { + resolveFunc := func(ctx context.Context, name, zone string, isDefault bool) (cid.ID, error) { var err error - reqInfo := middleware.GetReqInfo(ctx) - zone, isDefault := settings.FormContainerZone(reqInfo.Namespace) if isDefault { zone, err = frostFS.SystemDNS(ctx) if err != nil { @@ -196,13 +187,10 @@ func NewDNSResolver(frostFS FrostFS, settings Settings) (*Resolver, error) { }, nil } -func NewNNSResolver(address string, settings Settings) (*Resolver, error) { +func NewNNSResolver(address string) (*Resolver, error) { if address == "" { return nil, fmt.Errorf("rpc address must not be empty for NNS resolver") } - if settings == nil { - return nil, fmt.Errorf("resolver settings must not be nil for NNS resolver") - } var nns ns.NNS @@ -210,12 +198,9 @@ func NewNNSResolver(address string, settings Settings) (*Resolver, error) { return nil, fmt.Errorf("dial %s: %w", address, err) } - resolveFunc := func(ctx context.Context, name string) (cid.ID, error) { + resolveFunc := func(_ context.Context, name, zone string, _ bool) (cid.ID, error) { var d container.Domain d.SetName(name) - - reqInfo := middleware.GetReqInfo(ctx) - zone, _ := settings.FormContainerZone(reqInfo.Namespace) d.SetZone(zone) cnrID, err := nns.ResolveContainerDomain(d) diff --git a/cmd/s3-gw/app.go b/cmd/s3-gw/app.go index cc2bb69..f0d6cef 100644 --- a/cmd/s3-gw/app.go +++ b/cmd/s3-gw/app.go @@ -11,6 +11,7 @@ import ( "os" "os/signal" "runtime/debug" + "strings" "sync" "syscall" "time" @@ -525,7 +526,6 @@ func (a *App) getResolverConfig() *resolver.Config { return &resolver.Config{ FrostFS: frostfs.NewResolverFrostFS(a.pool), RPCAddress: a.cfg.GetString(cfgRPCEndpoint), - Settings: a.settings, } } @@ -1062,7 +1062,8 @@ func (a *App) fetchContainerInfo(ctx context.Context, cfgKey string) (info *data var id cid.ID if err = id.DecodeString(containerString); err != nil { - if id, err = a.bucketResolver.Resolve(ctx, containerString); err != nil { + parts := strings.Split(containerString, ".") + if id, err = a.bucketResolver.Resolve(ctx, parts[0], parts[1], false); err != nil { return nil, fmt.Errorf("resolve container name %s: %w", containerString, err) } }