Skip to content

Commit 571a817

Browse files
authored
feat: Implemented Go SDK env var handling (#975)
Also added unit tests for it that will leave existing environment variables undisturbed. (Will store env vars before test and restore env vars after test)
1 parent 49614f5 commit 571a817

File tree

3 files changed

+150
-5
lines changed

3 files changed

+150
-5
lines changed

go/rtl/constants.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package rtl
22

33
const (
4-
DefaultApiVersion = "4.0"
4+
baseUrlEnvKey = "LOOKERSDK_BASE_URL"
5+
apiVersionEnvKey = "LOOKERSDK_API_VERSION"
6+
verifySslEnvKey = "LOOKERSDK_VERIFY_SSL"
7+
timeoutEnvKey = "LOOKERSDK_TIMEOUT"
8+
clientIdEnvKey = "LOOKERSDK_CLIENT_ID"
9+
clientSecretEnvKey = "LOOKERSDK_CLIENT_SECRET"
510
)

go/rtl/settings.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package rtl
33
import (
44
"fmt"
55
"gopkg.in/ini.v1"
6+
"os"
7+
"strconv"
8+
"strings"
69
)
710

811
var defaultSectionName string = "Looker"
@@ -18,15 +21,19 @@ type ApiSettings struct {
1821
ApiVersion string `ini:"api_version"`
1922
}
2023

24+
var defaultSettings ApiSettings = ApiSettings{
25+
VerifySsl: true,
26+
ApiVersion: "4.0",
27+
Timeout: 120,
28+
}
29+
2130
func NewSettingsFromFile(file string, section *string) (ApiSettings, error) {
2231
if section == nil {
2332
section = &defaultSectionName
2433
}
2534

26-
s := ApiSettings{
27-
VerifySsl: true,
28-
ApiVersion: DefaultApiVersion,
29-
}
35+
// Default values
36+
s := defaultSettings
3037

3138
cfg, err := ini.Load(file)
3239
if err != nil {
@@ -37,3 +44,32 @@ func NewSettingsFromFile(file string, section *string) (ApiSettings, error) {
3744
return s, err
3845

3946
}
47+
48+
func NewSettingsFromEnv() (ApiSettings, error) {
49+
settings := defaultSettings
50+
51+
if v, present := os.LookupEnv(baseUrlEnvKey); present {
52+
settings.BaseUrl = v
53+
}
54+
if v, present := os.LookupEnv(apiVersionEnvKey); present {
55+
settings.ApiVersion = v
56+
}
57+
if v, present := os.LookupEnv(verifySslEnvKey); present {
58+
s := strings.ToLower(v)
59+
settings.VerifySsl = s == "true" || s == "t" || s == "1" || s == "y" || s == "yes"
60+
}
61+
if v, present := os.LookupEnv(timeoutEnvKey); present {
62+
timeout, err := strconv.ParseInt(v,10,32)
63+
if err == nil {
64+
settings.Timeout = int32(timeout)
65+
}
66+
}
67+
if v, present := os.LookupEnv(clientIdEnvKey); present {
68+
settings.ClientId = v
69+
}
70+
if v, present := os.LookupEnv(clientSecretEnvKey); present {
71+
settings.ClientSecret = v
72+
}
73+
74+
return settings, nil
75+
}

go/rtl/settings_test.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rtl
22

33
import (
4+
"os"
45
"reflect"
56
"testing"
67
)
@@ -48,3 +49,106 @@ func TestNewSettingsFromFile(t *testing.T) {
4849
})
4950
}
5051
}
52+
53+
type pair struct {
54+
k string
55+
v string
56+
}
57+
58+
func TestNewSettingsFromEnv(t *testing.T) {
59+
getEnv := func() []pair {
60+
var pairs []pair
61+
62+
if v,present := os.LookupEnv(baseUrlEnvKey); present {
63+
pairs = append(pairs, pair{ k: baseUrlEnvKey, v: v })
64+
}
65+
if v,present := os.LookupEnv(apiVersionEnvKey); present {
66+
pairs = append(pairs, pair{ k: apiVersionEnvKey, v: v })
67+
}
68+
if v,present := os.LookupEnv(verifySslEnvKey); present {
69+
pairs = append(pairs, pair{ k: verifySslEnvKey, v: v })
70+
}
71+
if v,present := os.LookupEnv(timeoutEnvKey); present {
72+
pairs = append(pairs, pair{ k: timeoutEnvKey, v: v })
73+
}
74+
if v,present := os.LookupEnv(clientIdEnvKey); present {
75+
pairs = append(pairs, pair{ k: clientIdEnvKey, v: v })
76+
}
77+
if v,present := os.LookupEnv(clientSecretEnvKey); present {
78+
pairs = append(pairs, pair{ k: clientSecretEnvKey, v: v })
79+
}
80+
81+
return pairs
82+
}
83+
84+
clearEnv := func() {
85+
os.Unsetenv(baseUrlEnvKey)
86+
os.Unsetenv(apiVersionEnvKey)
87+
os.Unsetenv(verifySslEnvKey)
88+
os.Unsetenv(timeoutEnvKey)
89+
os.Unsetenv(clientIdEnvKey)
90+
os.Unsetenv(clientSecretEnvKey)
91+
}
92+
93+
setEnv := func(pairs []pair ) {
94+
clearEnv()
95+
for _, pair := range pairs {
96+
os.Setenv(pair.k, pair.v)
97+
}
98+
}
99+
100+
tests := []struct {
101+
name string
102+
env []pair
103+
want ApiSettings
104+
}{
105+
{
106+
name: "NewSettingsFromEnv() returns settings when all environment variables set",
107+
env: []pair {
108+
{baseUrlEnvKey, "url"},
109+
{apiVersionEnvKey, "5.0"},
110+
{verifySslEnvKey, "false"},
111+
{timeoutEnvKey, "360"},
112+
{clientIdEnvKey, "id"},
113+
{clientSecretEnvKey, "secret"},
114+
},
115+
want: ApiSettings{
116+
BaseUrl: "url",
117+
ApiVersion: "5.0",
118+
VerifySsl: false,
119+
Timeout: 360,
120+
ClientId: "id",
121+
ClientSecret: "secret",
122+
},
123+
},
124+
{
125+
name: "NewSettingsFromEnv() sets defaults correctly if env vars not set for them",
126+
env: []pair {
127+
{baseUrlEnvKey, "url"},
128+
{clientIdEnvKey, "id"},
129+
{clientSecretEnvKey, "secret"},
130+
},
131+
want: ApiSettings{
132+
BaseUrl: "url",
133+
ApiVersion: "4.0",
134+
VerifySsl: true,
135+
Timeout: 120,
136+
ClientId: "id",
137+
ClientSecret: "secret",
138+
},
139+
},
140+
}
141+
for _, tt := range tests {
142+
t.Run(tt.name, func(t *testing.T) {
143+
origEnv := getEnv()
144+
defer setEnv(origEnv)
145+
146+
setEnv(tt.env)
147+
148+
got, _ := NewSettingsFromEnv()
149+
if !reflect.DeepEqual(got, tt.want) {
150+
t.Errorf("NewSettingsFromEnv() got = %v, want %v", got, tt.want)
151+
}
152+
})
153+
}
154+
}

0 commit comments

Comments
 (0)