forked from redboxllc/scuttle
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathscuttle_config.go
146 lines (123 loc) · 4.22 KB
/
scuttle_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package main
import (
"fmt"
"net/url"
"os"
"strings"
"time"
)
const defaultAdminAPIPort = 15000
const defaultQuitAPIPort = 15020
// ScuttleConfig ... represents Scuttle's configuration based on environment variables or defaults.
type ScuttleConfig struct {
LoggingEnabled bool
EnvoyAdminAPI string
StartWithoutEnvoy bool
WaitForEnvoyTimeout time.Duration
IstioQuitAPI string
NeverKillIstio bool
NeverKillIstioOnFailure bool
GenericQuitEndpoints []string
QuitRequestTimeout time.Duration
QuitWithoutEnvoyTimeout time.Duration
GenericQuitOnly bool
}
func log(message string) {
if config.LoggingEnabled {
fmt.Printf("%s scuttle: %s\n", time.Now().UTC().Format("2006-01-02T15:04:05Z"), message)
}
}
func getConfig() ScuttleConfig {
loggingEnabled := getBoolFromEnv("SCUTTLE_LOGGING", true, false)
config := ScuttleConfig{
// Logging enabled by default, disabled if "false"
LoggingEnabled: loggingEnabled,
EnvoyAdminAPI: getStringFromEnv("ENVOY_ADMIN_API", "", loggingEnabled),
StartWithoutEnvoy: getBoolFromEnv("START_WITHOUT_ENVOY", false, loggingEnabled),
WaitForEnvoyTimeout: getDurationFromEnv("WAIT_FOR_ENVOY_TIMEOUT", time.Duration(0), loggingEnabled),
IstioQuitAPI: getStringFromEnv("ISTIO_QUIT_API", "", loggingEnabled),
NeverKillIstio: getBoolFromEnv("NEVER_KILL_ISTIO", false, loggingEnabled),
NeverKillIstioOnFailure: getBoolFromEnv("NEVER_KILL_ISTIO_ON_FAILURE", false, loggingEnabled),
GenericQuitEndpoints: getStringArrayFromEnv("GENERIC_QUIT_ENDPOINTS", make([]string, 0), loggingEnabled),
QuitRequestTimeout: getDurationFromEnv("QUIT_REQUEST_TIMEOUT", time.Second*5, loggingEnabled),
QuitWithoutEnvoyTimeout: getDurationFromEnv("QUIT_WITHOUT_ENVOY_TIMEOUT", time.Duration(0), loggingEnabled),
GenericQuitOnly: getBoolFromEnv("GENERIC_QUIT_ONLY", false, loggingEnabled),
}
if config.IstioQuitAPI == "" {
config.IstioQuitAPI = replacePort(config.EnvoyAdminAPI, defaultAdminAPIPort, defaultQuitAPIPort)
}
return config
}
func getStringArrayFromEnv(name string, defaultVal []string, logEnabled bool) []string {
userValCsv := strings.Trim(os.Getenv(name), " ")
if userValCsv == "" {
return defaultVal
}
if logEnabled {
log(fmt.Sprintf("%s: %s", name, userValCsv))
}
userValArray := strings.Split(userValCsv, ",")
if len(userValArray) == 0 {
return defaultVal
}
return userValArray
}
func getStringFromEnv(name string, defaultVal string, logEnabled bool) string {
userVal := os.Getenv(name)
if logEnabled {
log(fmt.Sprintf("%s: %s", name, userVal))
}
if userVal != "" {
return userVal
}
return defaultVal
}
func getBoolFromEnv(name string, defaultVal bool, logEnabled bool) bool {
userVal := os.Getenv(name)
// User did not set anything return default
if userVal == "" {
return defaultVal
}
// User set something, check it is valid
if userVal != "true" && userVal != "false" {
if logEnabled {
log(fmt.Sprintf("%s: %s (Invalid value will be ignored)", name, userVal))
}
return defaultVal
}
// User gave valid option
if logEnabled {
log(fmt.Sprintf("%s: %s", name, userVal))
}
return userVal == "true"
}
func getDurationFromEnv(name string, defaultVal time.Duration, logEnabled bool) time.Duration {
userVal := os.Getenv(name)
// User did not set anything, return default.
if userVal == "" {
return defaultVal
}
// User has set something, check it is valid.
if userVal != "" {
if duration, err := time.ParseDuration(userVal); err == nil {
// User gave valid option.
if logEnabled {
log(fmt.Sprintf("%s: %s", name, userVal))
}
return duration
} else if logEnabled {
log(fmt.Sprintf("%s: %s (Invalid value will be ignored)", name, userVal))
}
}
return defaultVal
}
// replacePort returns a URL with the port replaced when the sourceURL is valid and has the original port set.
// If the original port does not match or the sourceURL is invalid an empty string is returned.
func replacePort(sourceURL string, original, replacement int) string {
u, err := url.Parse(sourceURL)
if err != nil || (u.Port() != fmt.Sprintf("%d", original)) {
return ""
}
u.Host = fmt.Sprintf("%s:%d", u.Hostname(), replacement)
return u.String()
}