@@ -51,21 +51,39 @@ type ProviderMeta struct {
51
51
client * api.Client
52
52
resourceData * schema.ResourceData
53
53
clientCache map [string ]* api.Client
54
- m sync.RWMutex
55
54
vaultVersion * version.Version
55
+ mu sync.RWMutex
56
56
}
57
57
58
58
// GetClient returns the providers default Vault client.
59
- func (p * ProviderMeta ) GetClient () * api.Client {
60
- return p .client
59
+ func (p * ProviderMeta ) GetClient () (* api.Client , error ) {
60
+ p .mu .Lock ()
61
+ defer p .mu .Unlock ()
62
+
63
+ return p .getClient ()
64
+ }
65
+
66
+ // MustGetClient returns the providers default Vault client. Panics on any error.
67
+ func (p * ProviderMeta ) MustGetClient () * api.Client {
68
+ client , err := p .GetClient ()
69
+ if err != nil {
70
+ panic (err )
71
+ }
72
+
73
+ return client
61
74
}
62
75
63
76
// GetNSClient returns a namespaced Vault client.
64
77
// The provided namespace will always be set relative to the default client's
65
78
// namespace.
66
79
func (p * ProviderMeta ) GetNSClient (ns string ) (* api.Client , error ) {
67
- p .m .Lock ()
68
- defer p .m .Unlock ()
80
+ p .mu .Lock ()
81
+ defer p .mu .Unlock ()
82
+
83
+ client , err := p .getClient ()
84
+ if err != nil {
85
+ return nil , err
86
+ }
69
87
70
88
if err := p .validate (); err != nil {
71
89
return nil , err
@@ -88,7 +106,7 @@ func (p *ProviderMeta) GetNSClient(ns string) (*api.Client, error) {
88
106
return v , nil
89
107
}
90
108
91
- c , err := p . client .Clone ()
109
+ c , err := client .Clone ()
92
110
if err != nil {
93
111
return nil , err
94
112
}
@@ -122,12 +140,21 @@ func (p *ProviderMeta) IsEnterpriseSupported() bool {
122
140
if ver == nil {
123
141
return false
124
142
}
143
+
125
144
return strings .Contains (ver .Metadata (), enterpriseMetadata )
126
145
}
127
146
128
147
// GetVaultVersion returns the providerMeta
129
148
// vaultVersion attribute.
130
149
func (p * ProviderMeta ) GetVaultVersion () * version.Version {
150
+ p .mu .Lock ()
151
+ defer p .mu .Unlock ()
152
+
153
+ err := p .setVaultVersion ()
154
+ if err != nil {
155
+ return nil
156
+ }
157
+
131
158
return p .vaultVersion
132
159
}
133
160
@@ -143,12 +170,19 @@ func (p *ProviderMeta) validate() error {
143
170
return nil
144
171
}
145
172
146
- // NewProviderMeta sets up the Provider to service Vault requests.
147
- // It is meant to be used as a schema.ConfigureFunc.
148
- func NewProviderMeta (d * schema.ResourceData ) (interface {}, error ) {
149
- if d == nil {
150
- return nil , fmt .Errorf ("nil ResourceData provided" )
173
+ // setClient sets up an authenticated Vault client based on the
174
+ // ProviderMeta.resourceData configuration. It should typically only need to be
175
+ // called once per ProviderMeta instance. Must be called with a lock.
176
+ func (p * ProviderMeta ) setClient () error {
177
+ if p .client != nil {
178
+ return nil
179
+ }
180
+
181
+ if p .resourceData == nil {
182
+ return fmt .Errorf ("nil ResourceData provided" )
151
183
}
184
+
185
+ d := p .resourceData
152
186
clientConfig := api .DefaultConfig ()
153
187
addr := d .Get (consts .FieldAddress ).(string )
154
188
if addr != "" {
@@ -175,7 +209,7 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
175
209
176
210
err := clientConfig .ConfigureTLS (tlsConfig )
177
211
if err != nil {
178
- return nil , fmt .Errorf ("failed to configure TLS for Vault API: %s" , err )
212
+ return fmt .Errorf ("failed to configure TLS for Vault API: %s" , err )
179
213
}
180
214
181
215
clientConfig .HttpClient .Transport = helper .NewTransport (
@@ -192,7 +226,7 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
192
226
193
227
client , err := api .NewClient (clientConfig )
194
228
if err != nil {
195
- return nil , fmt .Errorf ("failed to configure Vault API: %s" , err )
229
+ return fmt .Errorf ("failed to configure Vault API: %s" , err )
196
230
}
197
231
198
232
// setting this is critical for proper namespace handling
@@ -226,15 +260,15 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
226
260
227
261
authLogin , err := GetAuthLogin (d )
228
262
if err != nil {
229
- return nil , err
263
+ return err
230
264
}
231
265
232
266
var token string
233
267
if authLogin != nil {
234
268
// the clone is only used to auth to Vault
235
269
clone , err := client .Clone ()
236
270
if err != nil {
237
- return nil , err
271
+ return err
238
272
}
239
273
240
274
if clone .Token () != "" {
@@ -256,15 +290,15 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
256
290
257
291
secret , err := authLogin .Login (clone )
258
292
if err != nil {
259
- return nil , err
293
+ return err
260
294
}
261
295
262
296
token = secret .Auth .ClientToken
263
297
} else {
264
298
// try and get the token from the config or token helper
265
299
token , err = GetToken (d )
266
300
if err != nil {
267
- return nil , err
301
+ return err
268
302
}
269
303
}
270
304
@@ -273,15 +307,15 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
273
307
}
274
308
275
309
if client .Token () == "" {
276
- return nil , errors .New ("no vault token set on Client" )
310
+ return errors .New ("no vault token set on Client" )
277
311
}
278
312
279
313
tokenInfo , err := client .Auth ().Token ().LookupSelf ()
280
314
if err != nil {
281
- return nil , fmt .Errorf ("failed to lookup token, err=%w" , err )
315
+ return fmt .Errorf ("failed to lookup token, err=%w" , err )
282
316
}
283
317
if tokenInfo == nil {
284
- return nil , fmt .Errorf ("no token information returned from self lookup" )
318
+ return fmt .Errorf ("no token information returned from self lookup" )
285
319
}
286
320
287
321
warnMinTokenTTL (tokenInfo )
@@ -295,7 +329,7 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
295
329
// a child token is always created in the namespace of the parent token.
296
330
token , err = createChildToken (d , client , tokenNamespace )
297
331
if err != nil {
298
- return nil , err
332
+ return err
299
333
}
300
334
301
335
client .SetToken (token )
@@ -316,7 +350,7 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
316
350
// namespace paths are properly honoured.
317
351
if v , ok := d .Get (consts .FieldSetNamespaceFromToken ).(bool ); ok && v {
318
352
if err := d .Set (consts .FieldNamespace , namespace ); err != nil {
319
- return nil , err
353
+ return err
320
354
}
321
355
}
322
356
}
@@ -326,27 +360,61 @@ func NewProviderMeta(d *schema.ResourceData) (interface{}, error) {
326
360
client .SetNamespace (namespace )
327
361
}
328
362
363
+ p .client = client
364
+ return nil
365
+ }
366
+
367
+ func (p * ProviderMeta ) setVaultVersion () error {
368
+ if p .vaultVersion != nil {
369
+ return nil
370
+ }
371
+
372
+ d := p .resourceData
329
373
var vaultVersion * version.Version
330
374
if v , ok := d .GetOk (consts .FieldVaultVersionOverride ); ok {
331
375
ver , err := version .NewVersion (v .(string ))
332
376
if err != nil {
333
- return nil , fmt .Errorf ("invalid value for %q, err=%w" ,
377
+ return fmt .Errorf ("invalid value for %q, err=%w" ,
334
378
consts .FieldVaultVersionOverride , err )
335
379
}
336
380
vaultVersion = ver
337
381
} else if ! d .Get (consts .FieldSkipGetVaultVersion ).(bool ) {
338
382
// Set the Vault version to *ProviderMeta object
383
+ client , err := p .getClient ()
384
+ if err != nil {
385
+ return err
386
+ }
387
+
339
388
ver , err := getVaultVersion (client )
340
389
if err != nil {
341
- return nil , err
390
+ return err
342
391
}
343
392
vaultVersion = ver
344
393
}
345
394
395
+ p .vaultVersion = vaultVersion
396
+
397
+ return nil
398
+ }
399
+
400
+ // getClient returns the provider's default Vault client. Must be called with ProviderMeta.mu
401
+ func (p * ProviderMeta ) getClient () (* api.Client , error ) {
402
+ if err := p .setClient (); err != nil {
403
+ return nil , err
404
+ }
405
+
406
+ return p .client , nil
407
+ }
408
+
409
+ // NewProviderMeta sets up the Provider to service Vault requests.
410
+ // It is meant to be used as a schema.ConfigureFunc.
411
+ func NewProviderMeta (d * schema.ResourceData ) (interface {}, error ) {
412
+ if d == nil {
413
+ return nil , fmt .Errorf ("nil ResourceData provided" )
414
+ }
415
+
346
416
return & ProviderMeta {
347
417
resourceData : d ,
348
- client : client ,
349
- vaultVersion : vaultVersion ,
350
418
}, nil
351
419
}
352
420
@@ -416,7 +484,7 @@ func GetClient(i interface{}, meta interface{}) (*api.Client, error) {
416
484
return p .GetNSClient (ns )
417
485
}
418
486
419
- return p .GetClient (), nil
487
+ return p .GetClient ()
420
488
}
421
489
422
490
func GetClientDiag (i interface {}, meta interface {}) (* api.Client , diag.Diagnostics ) {
0 commit comments