-
Notifications
You must be signed in to change notification settings - Fork 0
/
docker.go
133 lines (119 loc) · 3.81 KB
/
docker.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
package env
import (
"fmt"
"log"
"os"
"strings"
)
// DockerProvider is an implementation of a EnvReader
type DockerProvider struct{}
// Getenv looks for docker specific environment variables and returns
// either the value or empty string, if nothing is found.
func (er *DockerProvider) Getenv(key string) string {
dockerEnv := extractDockerEnvironment()
return dockerEnv[key]
}
func extractDockerEnvironment() map[string]string {
normalizedEnvironment := make(map[string]string)
candidates := getDockerPrefixAndKeys()
for _, keyList := range candidates {
if doesCandidateQualify(keyList) {
normalizedEnvironment = appendMap(normalizedEnvironment, normalizeDockerVars(keyList))
}
}
return normalizedEnvironment
}
func appendMap(initial map[string]string, additional map[string]string) map[string]string {
for k, v := range additional {
initial[k] = v
}
return initial
}
func normalizeDockerVars(keyList []string) map[string]string {
normalizedEnvironment := make(map[string]string)
for _, key := range keyList {
val := os.Getenv(key)
switch {
case strings.HasSuffix(key, "_PORT") && !strings.Contains(key, "_PORT_"):
url := fmt.Sprintf("%v_URL", strings.TrimSuffix(key, "_PORT"))
normalizedEnvironment[url] = val
case strings.Contains(key, "_PORT_"):
vars := strings.Split(key, "_PORT_")
switch {
case strings.Contains(key, "_PROTO"):
proto := fmt.Sprintf("%v_PROTO", vars[0])
normalizedEnvironment[proto] = val
case strings.Contains(key, "_ADDR"):
addr := fmt.Sprintf("%v_ADDR", vars[0])
host := fmt.Sprintf("%v_HOST", vars[0])
normalizedEnvironment[addr] = val
normalizedEnvironment[host] = val
case strings.Contains(key, "_PORT"):
port := fmt.Sprintf("%v_PORT", vars[0])
normalizedEnvironment[port] = val
}
case strings.Contains(key, "_ENV_"):
vars := strings.Split(key, "_ENV_")
if len(vars) != 2 {
log.Printf("length of %v is not equal to 2 after split on _ENV_", key)
}
envKey := fmt.Sprintf("%v_%v", vars[0], vars[1])
normalizedEnvironment[envKey] = val
}
}
return normalizedEnvironment
}
func doesCandidateQualify(candidateList []string) bool {
return len(candidateList) >= 5
}
func getDockerPrefixAndKeys() map[string][]string {
candidates := make(map[string][]string)
for _, entry := range os.Environ() {
switch {
case strings.Contains(entry, "_PORT"):
candidates = appendEntryToMapSlice(candidates, entry)
case strings.Contains(entry, "_NAME"):
candidates = appendEntryToMapSlice(candidates, entry)
case strings.Contains(entry, "_PROTO"):
candidates = appendEntryToMapSlice(candidates, entry)
case strings.Contains(entry, "_ADDR"):
candidates = appendEntryToMapSlice(candidates, entry)
case strings.Contains(entry, "_ENV_"):
candidates = appendEntryToMapSlice(candidates, entry)
}
}
return candidates
}
func appendEntryToMapSlice(candidates map[string][]string, entry string) map[string][]string {
key := getEntryKey(entry)
prefix := strings.SplitN(key, "_", 2)[0]
envs := candidates[prefix]
if envs == nil {
envs = []string{}
}
envs = append(envs, key)
candidates[prefix] = envs
return candidates
}
func getEntryKey(entry string) string {
return getEntryKeyAndValue(entry)[0]
}
func getEntryValue(entry string) string {
return getEntryKeyAndValue(entry)[1]
}
func getEntryKeyAndValue(entry string) []string {
return strings.SplitN(entry, "=", 2)
}
/*
{map[string]string{
"DB_NAME": "/somename/db",
"DB_PORT": "tcp://24.50.222.1:5555",
"DB_PORT_5555_TCP_PROTO": "tcp",
"DB_PORT_5555_TCP_ADDR": "24.50.222.1",
"DB_PORT_5555_TCP_PORT": "5555",
"DB_ENV_ANYTHING": "TEST123",
},
[]string{"", "DB_PORT", "DB_HOST", "DB_ADDR", "DB_URL", "DB_ANYTHING"},
[]string{"", "5555", "24.50.222.1", "24.50.222.1", "tcp://24.50.222.1:5555", "TEST123"},
},
*/