44 "fmt"
55 "os"
66 "strings"
7+ "sync"
78 "time"
89
910 "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
@@ -15,6 +16,10 @@ import (
1516 "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
1617)
1718
19+ var (
20+ connectMu sync.Mutex
21+ )
22+
1823func parseStreamKVID (id string ) (string , error ) {
1924 if ! kvIdRegex .MatchString (id ) {
2025 return "" , fmt .Errorf ("invalid kv bucket id %q" , id )
@@ -233,88 +238,111 @@ func wipeSlice(buf []byte) {
233238 }
234239}
235240
236- func connectMgr (d * schema.ResourceData ) (interface {}, error ) {
237- return func () (* nats.Conn , * jsm.Manager , error ) {
238- var (
239- creds string
240- credData []byte
241- servers string
242- user string
243- pass string
244- nkey string
245- caFile string
246- cleanupPem = func () {}
247- )
248-
249- s := d .Get ("credentials" )
250- if s != nil {
251- creds = s .(string )
252- }
241+ type connectProperties struct {
242+ creds string
243+ credData []byte
244+ servers string
245+ user string
246+ pass string
247+ nkey string
248+ caFile string
249+ cleanupPem func ()
250+ }
253251
254- s = d .Get ("credential_data" )
255- if s != nil {
256- credData = []byte (s .(string ))
257- }
252+ func getConnectProperties (d * schema.ResourceData ) (* connectProperties , error ) {
253+ connectMu .Lock ()
254+ defer connectMu .Unlock ()
255+
256+ p := connectProperties {
257+ creds : "" ,
258+ credData : nil ,
259+ servers : "" ,
260+ user : "" ,
261+ pass : "" ,
262+ nkey : "" ,
263+ caFile : "" ,
264+ cleanupPem : nil ,
265+ }
258266
259- s = d .Get ("servers " )
260- if s != nil {
261- servers = s .(string )
262- }
267+ s : = d .Get ("credentials " )
268+ if s != nil {
269+ p . creds = s .(string )
270+ }
263271
264- s = d .Get ("user " )
265- if s != nil {
266- user = s .(string )
267- }
272+ s = d .Get ("credential_data " )
273+ if s != nil {
274+ p . credData = [] byte ( s .(string ) )
275+ }
268276
269- s = d .Get ("password " )
270- if s != nil {
271- pass = s .(string )
272- }
277+ s = d .Get ("servers " )
278+ if s != nil {
279+ p . servers = s .(string )
280+ }
273281
274- s = d .Get ("nkey " )
275- if s != nil {
276- nkey = s .(string )
277- }
282+ s = d .Get ("user " )
283+ if s != nil {
284+ p . user = s .(string )
285+ }
278286
279- s = d .Get ("tls" )
280- if s != nil {
281- set := s .(* schema.Set )
282-
283- for _ , v := range set .List () {
284- m := v .(map [string ]interface {})
285-
286- for k , v := range m {
287- switch {
288- case k == "ca_file" && len (v .(string )) > 0 :
289- caFile = v .(string )
290- case k == "ca_file_data" && len (v .(string )) > 0 :
291- file , cleanup , err := newTempPEMFile (v .(string ))
292- if err != nil {
293- return nil , nil , err
294- }
295-
296- cleanupPem = cleanup
297- caFile = file
287+ s = d .Get ("password" )
288+ if s != nil {
289+ p .pass = s .(string )
290+ }
291+
292+ s = d .Get ("nkey" )
293+ if s != nil {
294+ p .nkey = s .(string )
295+ }
296+
297+ s = d .Get ("tls" )
298+ if s != nil {
299+ set := s .(* schema.Set )
300+
301+ for _ , v := range set .List () {
302+ m := v .(map [string ]interface {})
303+
304+ for k , v := range m {
305+ switch {
306+ case k == "ca_file" && len (v .(string )) > 0 :
307+ p .caFile = v .(string )
308+ case k == "ca_file_data" && len (v .(string )) > 0 :
309+ file , cleanup , err := newTempPEMFile (v .(string ))
310+ if err != nil {
311+ return nil , err
298312 }
313+
314+ p .cleanupPem = cleanup
315+ p .caFile = file
299316 }
300317 }
301318 }
319+ }
320+
321+ return & p , nil
322+ }
323+
324+ func connectMgr (d * schema.ResourceData ) (interface {}, error ) {
325+ return func () (* nats.Conn , * jsm.Manager , error ) {
326+ props , err := getConnectProperties (d )
327+ if err != nil {
328+ return nil , nil , err
329+ }
302330
303331 var opts []nats.Option
304332
305333 switch {
306- case creds != "" :
307- opts = append (opts , nats .UserCredentials (creds ))
334+ case props . creds != "" :
335+ opts = append (opts , nats .UserCredentials (props . creds ))
308336
309- case len (credData ) > 0 :
310- defer wipeSlice (credData )
337+ case len (props . credData ) > 0 :
338+ defer wipeSlice (props . credData )
311339
312340 userCB := func () (string , error ) {
313- return jwt .ParseDecoratedJWT (credData )
341+ return jwt .ParseDecoratedJWT (props . credData )
314342 }
315343
316344 sigCB := func (nonce []byte ) ([]byte , error ) {
317- kp , err := jwt .ParseDecoratedNKey (credData )
345+ kp , err := jwt .ParseDecoratedNKey (props . credData )
318346 if err != nil {
319347 return nil , err
320348 }
@@ -327,25 +355,28 @@ func connectMgr(d *schema.ResourceData) (interface{}, error) {
327355 }
328356
329357 switch {
330- case user != "" && pass == "" :
331- opts = append (opts , nats .UserInfo (user , pass ))
332- case user != "" :
333- opts = append (opts , nats .Token (user ))
334- case nkey != "" :
335- nko , err := nats .NkeyOptionFromSeed (nkey )
358+ case props . user != "" && props . pass == "" :
359+ opts = append (opts , nats .UserInfo (props . user , props . pass ))
360+ case props . user != "" :
361+ opts = append (opts , nats .Token (props . user ))
362+ case props . nkey != "" :
363+ nko , err := nats .NkeyOptionFromSeed (props . nkey )
336364 if err != nil {
337365 return nil , nil , err
338366 }
339367
340368 opts = append (opts , nko )
341369 }
342370
343- if len (caFile ) > 0 {
344- defer cleanupPem ()
345- opts = append (opts , nats .RootCAs (caFile ))
371+ if len (props .caFile ) > 0 {
372+ if props .cleanupPem != nil {
373+ defer props .cleanupPem ()
374+ }
375+
376+ opts = append (opts , nats .RootCAs (props .caFile ))
346377 }
347378
348- nc , err := nats .Connect (servers , opts ... )
379+ nc , err := nats .Connect (props . servers , opts ... )
349380 if err != nil {
350381 return nil , nil , err
351382 }
0 commit comments