Skip to content

Commit 9fe918e

Browse files
Merge pull request #21 from sil-org/feature/refactor
Fix bugs in default handling and refactor code for less complexity
2 parents b56b047 + c03df65 commit 9fe918e

6 files changed

Lines changed: 55 additions & 65 deletions

File tree

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* @sil-org/go-devs

Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
FROM golang:1-alpine3.7 as builder
1+
FROM golang:1-alpine3.22 AS builder
22
WORKDIR /go/src/entrypoint
3+
COPY ./go.mod /go/src/entrypoint
34
COPY ./entrypoint.go /go/src/entrypoint/
45
RUN go build
56

Dockerfile-tests

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
FROM golang:1-alpine3.7
1+
FROM golang:1-alpine3.22
22
WORKDIR /go/src/entrypoint
3+
COPY ./go.mod /go/src/entrypoint
34
COPY ./entrypoint.go /go/src/entrypoint/
45
COPY ./entrypoint_test.go /go/src/entrypoint/
56
COPY ./traefik.toml /go/src/entrypoint/
67
COPY ./traefik_test.toml /go/src/entrypoint/
7-
CMD ["go", "test"]
8+
CMD ["go", "test"]

entrypoint.go

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"bufio"
55
"flag"
66
"fmt"
7-
"io/ioutil"
7+
"log"
88
"os"
99
"os/exec"
1010
"regexp"
@@ -26,14 +26,12 @@ type EnvVar struct {
2626
}
2727

2828
func main() {
29-
3029
var configFile string
3130
flag.StringVar(&configFile, "c", "/etc/traefik/traefik.toml", "Traefik config file to use, default: /etc/traefik/traefik.toml")
3231
flag.Parse()
3332

3433
if _, err := os.Stat(configFile); err != nil {
35-
fmt.Println("Config file", configFile, "not found")
36-
os.Exit(1)
34+
log.Fatalln("Config file not found:", configFile)
3735
}
3836

3937
if len(os.Args) <= 1 {
@@ -52,7 +50,6 @@ func main() {
5250
handleError(err)
5351

5452
runCmd()
55-
os.Exit(0)
5653
}
5754

5855
// Run CMD specified in Dockerfile or runtime and send output to stdout
@@ -79,29 +76,23 @@ func runCmd() {
7976

8077
func handleError(err error) {
8178
if err != nil {
82-
fmt.Println(err)
83-
os.Exit(1)
79+
log.Fatalln(err)
8480
}
8581
}
8682

8783
// ReadTraefikToml reads the Traefik config file from filesystem and returns as byte array
8884
func ReadTraefikToml(filename string) ([]byte, error) {
89-
file, err := ioutil.ReadFile(filename)
85+
file, err := os.ReadFile(filename)
9086
if err != nil {
91-
return []byte{}, fmt.Errorf("Unable to read config file at %s", filename)
87+
return []byte{}, fmt.Errorf("unable to read config file at %s", filename)
9288
}
9389

9490
return file, nil
9591
}
9692

9793
// WriteTraefikToml writes updated Traefix config to filesystem
9894
func WriteTraefikToml(filename string, contents []byte) error {
99-
err := ioutil.WriteFile(filename, contents, 0644)
100-
if err != nil {
101-
return err
102-
}
103-
104-
return nil
95+
return os.WriteFile(filename, contents, 0644)
10596
}
10697

10798
// UpdateConfigContent replaces placeholders with values from environment variables
@@ -116,38 +107,43 @@ func UpdateConfigContent(config []byte, replacements []Replacement) []byte {
116107

117108
// BuildReplacementsFromEnv Build []Replacement from env vars
118109
func BuildReplacementsFromEnv() ([]Replacement, error) {
110+
letsEncryptURLs := map[string]string{
111+
"staging": "https://acme-staging.api.letsencrypt.org/directory",
112+
"production": "https://acme-v01.api.letsencrypt.org/directory",
113+
}
119114

120115
var configReplacements []Replacement
121116

122117
envVars := GetEnvVarModels()
123118
for _, envvar := range envVars {
124119
value := os.Getenv(envvar.Name)
125-
if value == "" && envvar.Required {
126-
return configReplacements, fmt.Errorf("Missing required env var: %s. Description: %s", envvar.Name, envvar.Desc)
127-
}
120+
if value == "" {
121+
if envvar.Required {
122+
return configReplacements, fmt.Errorf("missing required env var: %s. Description: %s", envvar.Name, envvar.Desc)
123+
}
128124

129-
if value != "" {
130-
if envvar.Name == "LETS_ENCRYPT_CA" {
131-
if value == "staging" {
132-
value = "https://acme-staging.api.letsencrypt.org/directory"
133-
} else if value == "production" {
134-
value = "https://acme-v01.api.letsencrypt.org/directory"
135-
}
136-
} else if envvar.Name == "SANS" {
137-
sans := strings.Split(value, ",")
138-
value = ""
139-
for _, san := range sans {
140-
value += "\"" + san + "\", "
141-
}
142-
value = strings.TrimRight(value, ", ")
125+
if envvar.Default == "" {
126+
continue
143127
}
144-
configReplacements = append(configReplacements, Replacement{
145-
Key: envvar.Name,
146-
Value: value,
147-
})
148-
} else if value == "" && !envvar.Required {
128+
149129
value = envvar.Default
150130
}
131+
132+
switch envvar.Name {
133+
case "LETS_ENCRYPT_CA":
134+
if v, ok := letsEncryptURLs[value]; ok {
135+
value = v
136+
}
137+
case "SANS":
138+
value = `"` + strings.ReplaceAll(value, ",", `", "`) + `"`
139+
default:
140+
// Do nothing
141+
}
142+
143+
configReplacements = append(configReplacements, Replacement{
144+
Key: envvar.Name,
145+
Value: value,
146+
})
151147
}
152148

153149
return configReplacements, nil

entrypoint_test.go

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,51 +16,45 @@ example val
1616
another green
1717
`
1818
replacements := []Replacement{
19-
Replacement{
19+
{
2020
Key: "TEST",
2121
Value: "val",
2222
},
23-
Replacement{
23+
{
2424
Key: "FIELD",
2525
Value: "green",
2626
},
2727
}
2828
results := UpdateConfigContent([]byte(original), replacements)
2929

3030
if string(results) != expected {
31-
t.Error("Results to not match expected. Results:", results)
32-
t.FailNow()
31+
t.Fatal("Results to not match expected. Results:", results)
3332
}
3433
}
3534

3635
func TestBuildReplacementsFromEnv(t *testing.T) {
3736
// Test failure for required env var
3837
_, err := BuildReplacementsFromEnv()
3938
if err == nil {
40-
t.Error("BuildReplacementsFromEnv should have failed because no env vars have been set")
41-
t.FailNow()
39+
t.Fatal("BuildReplacementsFromEnv should have failed because no env vars have been set")
4240
}
4341

4442
setRequiredEnvVars()
4543

4644
replacements, err := BuildReplacementsFromEnv()
4745
if err != nil {
48-
t.Error(err)
49-
t.FailNow()
46+
t.Fatal(err)
5047
}
5148

52-
replacementsCount := len(replacements)
53-
if replacementsCount != 6 {
54-
t.Error("Replacements did not have enough entries, only found", replacementsCount, "but expected 6")
55-
t.FailNow()
49+
if want, got := 7, len(replacements); want != got {
50+
t.Fatal("Replacements did not have enough entries: found", got, "but expected", want)
5651
}
5752
}
5853

5954
func TestReadUpdateWrite(t *testing.T) {
6055
dir, err := os.Getwd()
6156
if err != nil {
62-
t.Error("Unable to get current working directory for TestReadUpdateWrite")
63-
t.FailNow()
57+
t.Fatal("Unable to get current working directory for TestReadUpdateWrite")
6458
}
6559
readFile := dir + "/traefik.toml"
6660
writeFile := dir + "/traefik_test.toml"
@@ -72,8 +66,7 @@ func TestReadUpdateWrite(t *testing.T) {
7266

7367
configToml, err := ReadTraefikToml(readFile)
7468
if err != nil {
75-
t.Error(err)
76-
t.FailNow()
69+
t.Fatal(err)
7770
}
7871

7972
// Make sure placeholders for env vars exist
@@ -82,17 +75,15 @@ func TestReadUpdateWrite(t *testing.T) {
8275
search := regexp.MustCompile(envvar.Name)
8376
found := search.Find(configToml)
8477
if found == nil {
85-
t.Error("Did not find key in configToml template for env var", envvar.Name)
86-
t.FailNow()
78+
t.Fatal("Did not find key in configToml template for env var", envvar.Name)
8779
}
8880
}
8981

9082
// Update config with required env var values
9183
setRequiredEnvVars()
9284
replacements, err := BuildReplacementsFromEnv()
9385
if err != nil {
94-
t.Error(err)
95-
t.FailNow()
86+
t.Fatal(err)
9687
}
9788
configToml = UpdateConfigContent(configToml, replacements)
9889

@@ -102,19 +93,16 @@ func TestReadUpdateWrite(t *testing.T) {
10293
search := regexp.MustCompile(envvar.Name)
10394
found := search.Find(configToml)
10495
if found != nil {
105-
t.Error("Uh oh, placeholder for required env var still present after update for env var:", envvar.Name)
106-
t.FailNow()
96+
t.Fatal("Uh oh, placeholder for required env var still present after update for env var:", envvar.Name)
10797
}
10898
}
10999
}
110100

111101
// Write out test file for manual reivew
112102
err = WriteTraefikToml(writeFile, configToml)
113103
if err != nil {
114-
t.Error(err)
115-
t.FailNow()
104+
t.Fatal(err)
116105
}
117-
118106
}
119107

120108
func setRequiredEnvVars() {

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module github.com/sil-org/traefik-https-proxy
2+
3+
go 1.18

0 commit comments

Comments
 (0)