diff --git a/api/resolver/resolver.go b/api/resolver/resolver.go index 8ee72dc4..57cea2d4 100644 --- a/api/resolver/resolver.go +++ b/api/resolver/resolver.go @@ -16,18 +16,23 @@ var ( ErrNotFound = errors.New("not found") ) -// Resolver allows to resolve container id by its name. -type Resolver struct { +// 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 } -// NewResolver is a constructor for the Resolver. -func NewResolver(reader *rpcNNS.ContractReader) *Resolver { - return &Resolver{reader: reader} +// NewNNSResolver is a constructor for the NNSResolver. +func NewNNSResolver(reader *rpcNNS.ContractReader) *NNSResolver { + return &NNSResolver{reader: reader} } // Resolve looks up the container id by it's name via NNS contract. -func (r *Resolver) Resolve(_ context.Context, name string) (cid.ID, error) { +func (r *NNSResolver) Resolve(_ context.Context, name string) (cid.ID, error) { var result cid.ID items, err := r.reader.GetRecords(nnsContainerDomain(name), rpcNNS.TXT) @@ -48,3 +53,17 @@ func (r *Resolver) Resolve(_ context.Context, name string) (cid.ID, error) { func nnsContainerDomain(name string) string { return fmt.Sprintf("%s.%s", name, defaultZone) } + +// NoOpResolver is a special resolver for situation when [NNSResolver] can't be created. +type NoOpResolver struct { +} + +// NewNoOpResolver is a constructor for the NoOpResolver. +func NewNoOpResolver() *NoOpResolver { + return &NoOpResolver{} +} + +// Resolve always returns [ErrNotFound]. +func (r *NoOpResolver) Resolve(_ context.Context, _ string) (cid.ID, error) { + return cid.ID{}, ErrNotFound +} diff --git a/cmd/s3-gw/app.go b/cmd/s3-gw/app.go index 99847178..ee6e3e1b 100644 --- a/cmd/s3-gw/app.go +++ b/cmd/s3-gw/app.go @@ -57,7 +57,7 @@ type ( servers []Server metrics *appMetrics - bucketResolver *resolver.Resolver + bucketResolver resolver.Resolver services []*Service settings *appSettings maxClients api.MaxClients @@ -205,6 +205,15 @@ func (a *App) initMetrics() { } func (a *App) initResolver(ctx context.Context) { + a.log.Info("rcp endpoint", zap.String("address", a.cfg.GetString(cfgRPCEndpoint))) + + endpoint := a.cfg.GetString(cfgRPCEndpoint) + if endpoint == "" { + a.log.Warn("rcp endpoint is empty, NoOpResolver is used") + a.bucketResolver = resolver.NewNoOpResolver() + return + } + cl, err := rpcClient(ctx, a.cfg.GetString(cfgRPCEndpoint)) if err != nil { a.log.Fatal("rpcclient", zap.Error(err)) @@ -218,7 +227,7 @@ func (a *App) initResolver(ctx context.Context) { inv := invoker.New(cl, nil) nnsReader := rpcNNS.NewReader(inv, nnsHash) - a.bucketResolver = resolver.NewResolver(nnsReader) + a.bucketResolver = resolver.NewNNSResolver(nnsReader) } // SystemContractHash allows to get system contract hash.