@@ -17,6 +17,7 @@ package client
1717import (
1818 "context"
1919 "errors"
20+ "fmt"
2021 "net"
2122 "net/http"
2223 "time"
4344 ParsePattern = secrets .ParsePattern
4445 MustParsePattern = secrets .MustParsePattern
4546
46- ErrSecretNotFound = secrets .ErrNotFound
47+ ErrSecretNotFound = secrets .ErrNotFound
48+ ErrSecretsEngineNotAvailable = errors .New ("secrets engine is not available" )
4749)
4850
4951var _ secrets.Resolver = & client {}
@@ -121,7 +123,14 @@ type client struct {
121123}
122124
123125func (c client ) GetSecrets (ctx context.Context , pattern secrets.Pattern ) ([]secrets.Envelope , error ) {
124- return c .resolverClient .GetSecrets (ctx , pattern )
126+ envelopes , err := c .resolverClient .GetSecrets (ctx , pattern )
127+ if isDialError (err ) {
128+ return nil , fmt .Errorf ("%w: %w" , ErrSecretsEngineNotAvailable , err )
129+ }
130+ if err != nil {
131+ return nil , err
132+ }
133+ return envelopes , nil
125134}
126135
127136type Client interface {
@@ -130,6 +139,17 @@ type Client interface {
130139 ListPlugins (ctx context.Context ) ([]PluginInfo , error )
131140}
132141
142+ func isDialError (err error ) bool {
143+ if err == nil {
144+ return false
145+ }
146+ var oe * net.OpError
147+ if errors .As (err , & oe ) && (oe .Op == "dial" || oe .Op == "connect" ) {
148+ return true
149+ }
150+ return false
151+ }
152+
133153func New (options ... Option ) (Client , error ) {
134154 cfg := & config {
135155 requestTimeout : api .DefaultClientRequestTimeout ,
@@ -173,6 +193,9 @@ func New(options ...Option) (Client, error) {
173193func (c client ) ListPlugins (ctx context.Context ) ([]PluginInfo , error ) {
174194 req := connect .NewRequest (v1.ListPluginsRequest_builder {}.Build ())
175195 resp , err := c .listClient .ListPlugins (ctx , req )
196+ if isDialError (err ) {
197+ return nil , fmt .Errorf ("%w: %w" , ErrSecretsEngineNotAvailable , err )
198+ }
176199 if err != nil {
177200 return nil , err
178201 }
0 commit comments