Skip to content

Commit 25dd078

Browse files
authored
Merge pull request #43 from nats-io/42
access provider properties protected by a mutex
2 parents ee39ece + ed3c8d2 commit 25dd078

File tree

2 files changed

+104
-72
lines changed

2 files changed

+104
-72
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ install:
55
- go get -u honnef.co/go/tools/cmd/staticcheck
66
- go get -u github.com/client9/misspell/cmd/misspell
77
before_script:
8+
- go mod tidy
89
- GO_LIST=$(go list ./...)
910
- $(exit $(go fmt $GO_LIST | wc -l))
1011
- find . -type f -name "*.go" | grep -v "/vendor/" | xargs misspell -error -locale US

jetstream/util.go

Lines changed: 103 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
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+
1823
func 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

Comments
 (0)