diff --git a/api/handler/handlers_test.go b/api/handler/handlers_test.go index 285e18a6..31b52998 100644 --- a/api/handler/handlers_test.go +++ b/api/handler/handlers_test.go @@ -30,7 +30,7 @@ type contResolver struct { layer *layer.TestNeoFS } -func (r *contResolver) Resolve(_ context.Context, name string) (cid.ID, error) { +func (r *contResolver) ResolveCID(_ context.Context, name string) (cid.ID, error) { return r.layer.ContainerID(name) } diff --git a/api/layer/layer.go b/api/layer/layer.go index 1cae32ea..67da7c61 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -17,7 +17,6 @@ import ( "github.com/nspcc-dev/neofs-s3-gw/api" "github.com/nspcc-dev/neofs-s3-gw/api/data" "github.com/nspcc-dev/neofs-s3-gw/api/layer/encryption" - "github.com/nspcc-dev/neofs-s3-gw/api/resolver" "github.com/nspcc-dev/neofs-s3-gw/api/s3errors" "github.com/nspcc-dev/neofs-s3-gw/creds/accessbox" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" @@ -47,7 +46,7 @@ type ( // used in case of user wants to do something like anonymous. // Typical using is a flag --no-sign-request in aws-cli. anonymous user.ID - resolver resolver.Resolver + resolver Resolver ncontroller EventListener cache *Cache treeService TreeService @@ -59,7 +58,7 @@ type ( Caches *CachesConfig GateKey *keys.PrivateKey Anonymous user.ID - Resolver resolver.Resolver + Resolver Resolver TreeService TreeService } @@ -87,6 +86,11 @@ type ( NoErrorOnDeleteMarker bool } + // Resolver allows to map container ID by container name. + Resolver interface { + ResolveCID(ctx context.Context, containerName string) (cid.ID, error) + } + // RangeParams stores range header request parameters. RangeParams struct { Start uint64 @@ -673,7 +677,7 @@ 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 { + if cnrID, err = n.resolver.ResolveCID(ctx, name); err != nil { return cid.ID{}, err } diff --git a/api/resolver/init.go b/api/resolver/init.go index 05bc8626..3524a6e9 100644 --- a/api/resolver/init.go +++ b/api/resolver/init.go @@ -8,30 +8,25 @@ import ( "github.com/nspcc-dev/neo-go/pkg/rpcclient" "github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker" - "github.com/nspcc-dev/neo-go/pkg/util" - rpcNNS "github.com/nspcc-dev/neofs-contract/rpc/nns" + "github.com/nspcc-dev/neofs-contract/rpc/nns" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" ) -const ( - nnsContract = int32(1) -) - -// Container is a wrapper for the [Resolver]. It allows to update resolvers in runtime, without service restarting. +// Container is a wrapper for the [NNSResolver]. It allows to update resolvers in runtime, without service restarting. // -// The Container should be used like regular [Resolver]. +// The Container should be used like regular [NNSResolver]. type Container struct { mu sync.RWMutex - resolver Resolver + resolver *NNSResolver } -// Resolve looks up the container id by its name via NNS contract. +// ResolveCID looks up the container id by its name via NNS contract. // The method calls inline resolver. -func (r *Container) Resolve(ctx context.Context, name string) (cid.ID, error) { +func (r *Container) ResolveCID(ctx context.Context, name string) (cid.ID, error) { r.mu.RLock() defer r.mu.RUnlock() - return r.resolver.Resolve(ctx, name) + return r.resolver.ResolveCID(ctx, name) } // UpdateResolvers allows to update resolver in runtime. Resolvers will be created from scratch. @@ -63,7 +58,7 @@ func NewContainer(ctx context.Context, endpoint string) (*Container, error) { // NewResolver returns resolver depending on corresponding endpoint. // // If endpoint is empty, error will be returned. -func NewResolver(ctx context.Context, endpoint string) (Resolver, error) { +func NewResolver(ctx context.Context, endpoint string) (*NNSResolver, error) { if endpoint == "" { return nil, errors.New("endpoint must be set") } @@ -73,23 +68,13 @@ func NewResolver(ctx context.Context, endpoint string) (Resolver, error) { return nil, fmt.Errorf("rpcclient: %w", err) } - nnsHash, err := systemContractHash(cl, nnsContract) - if err != nil { - return nil, fmt.Errorf("nns contract: %w", err) - } - inv := invoker.New(cl, nil) - nnsReader := rpcNNS.NewReader(inv, nnsHash) - return NewNNSResolver(nnsReader), nil -} - -func systemContractHash(cl *rpcclient.Client, id int32) (util.Uint160, error) { - c, err := cl.GetContractStateByID(id) + nnsReader, err := nns.NewInferredReader(cl, inv) if err != nil { - return util.Uint160{}, fmt.Errorf("GetContractStateByID [%d]: %w", id, err) + return nil, fmt.Errorf("nns reader instantiation: %w", err) } - return c.Hash, nil + return NewNNSResolver(nnsReader), nil } func rpcClient(ctx context.Context, endpoint string) (*rpcclient.Client, error) { diff --git a/api/resolver/resolver.go b/api/resolver/resolver.go index 53b1c122..f92ce92f 100644 --- a/api/resolver/resolver.go +++ b/api/resolver/resolver.go @@ -16,11 +16,6 @@ var ( ErrNotFound = errors.New("not found") ) -// Resolver allows to map container ID by container name. -type Resolver interface { - Resolve(ctx context.Context, containerName string) (cid.ID, error) -} - // NNSResolver allows to resolve container id by its name. type NNSResolver struct { reader *rpcNNS.ContractReader @@ -31,8 +26,8 @@ func NewNNSResolver(reader *rpcNNS.ContractReader) *NNSResolver { return &NNSResolver{reader: reader} } -// Resolve looks up the container id by its name via NNS contract. -func (r *NNSResolver) Resolve(_ context.Context, name string) (cid.ID, error) { +// ResolveCID looks up the container id by its name via NNS contract. +func (r *NNSResolver) ResolveCID(_ context.Context, name string) (cid.ID, error) { var result cid.ID items, err := r.reader.GetRecords(nnsContainerDomain(name), rpcNNS.TXT) diff --git a/go.mod b/go.mod index b73bee35..834aab11 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/minio/sio v0.3.0 github.com/nats-io/nats.go v1.31.0 github.com/nspcc-dev/neo-go v0.106.1 - github.com/nspcc-dev/neofs-contract v0.19.1 + github.com/nspcc-dev/neofs-contract v0.19.2-0.20240610103236-d50c8e0c9396 github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12 github.com/nspcc-dev/tzhash v1.8.0 github.com/panjf2000/ants/v2 v2.5.0 diff --git a/go.sum b/go.sum index 6658e329..b238c1a5 100644 --- a/go.sum +++ b/go.sum @@ -105,8 +105,8 @@ github.com/nspcc-dev/neo-go v0.106.1 h1:VpWfNBimGRpqNIyjJj6RhuAEMy4GRahDrAClODOm github.com/nspcc-dev/neo-go v0.106.1/go.mod h1:bZyJexBlrja4ngxiBgo8by5pVHuAbhg9l09/8yVGDyg= github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240305074711-35bc78d84dc4 h1:arN0Ypn+jawZpu1BND7TGRn44InAVIqKygndsx0y2no= github.com/nspcc-dev/neofs-api-go/v2 v2.14.1-0.20240305074711-35bc78d84dc4/go.mod h1:7Tm1NKEoUVVIUlkVwFrPh7GG5+Lmta2m7EGr4oVpBd8= -github.com/nspcc-dev/neofs-contract v0.19.1 h1:U1Uh+MlzfkalO0kRJ2pADZyHrmAOroC6KLFjdWnTNR0= -github.com/nspcc-dev/neofs-contract v0.19.1/go.mod h1:ZOGouuwuHpgvYkx/LCGufGncIzEUhYEO18LL4cWEbyw= +github.com/nspcc-dev/neofs-contract v0.19.2-0.20240610103236-d50c8e0c9396 h1:1Fo1Dgdxqx4qzWU2rKPK2gxOKo4bsVaq93t7S1XKvrM= +github.com/nspcc-dev/neofs-contract v0.19.2-0.20240610103236-d50c8e0c9396/go.mod h1:r0bxoBSOMqE9mdjdjPJXNOmqflxxT7Tcbwry0WxStlA= github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12 h1:mdxtlSU2I4oVZ/7AXTLKyz8uUPbDWikZw4DM8gvrddA= github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.12/go.mod h1:JdsEM1qgNukrWqgOBDChcYp8oY4XUzidcKaxY4hNJvQ= github.com/nspcc-dev/rfc6979 v0.2.1 h1:8wWxkamHWFmO790GsewSoKUSJjVnL1fmdRpokU/RgRM=