@@ -16,6 +16,7 @@ type etcdKeyValue map[string]string
16
16
17
17
type EtcdKeymateManager struct {
18
18
client * etcd.Client
19
+ cfg * traefikkeymate.Config
19
20
}
20
21
21
22
func NewEtcdManager (cfg * traefikkeymate.Config ) (KeymateConnector , error ) {
@@ -26,35 +27,58 @@ func NewEtcdManager(cfg *traefikkeymate.Config) (KeymateConnector, error) {
26
27
return nil , fmt .Errorf ("failed to connect to etcd: %v" , err )
27
28
}
28
29
30
+ // Validate that the default fields are set in the configuraiton
31
+ if cfg .Traefik .DefaultEntrypoint == "" {
32
+ return nil , fmt .Errorf ("defautl entrypoint cannot be empty" )
33
+ }
34
+ if cfg .Traefik .DefaultPrefix == "" {
35
+ return nil , fmt .Errorf ("default prefix cannot be empty" )
36
+ }
37
+
29
38
return & EtcdKeymateManager {
30
39
client : client ,
40
+ cfg : cfg ,
31
41
}, nil
32
42
}
33
43
34
- func validateTarget (target * traefikkeymate.Target ) error {
44
+ func ( m * EtcdKeymateManager ) validateTarget (target * traefikkeymate.Target ) error {
35
45
// Name cannot be empty
36
46
if target .Name == "" {
37
47
return fmt .Errorf ("target name cannot be empty" )
38
48
}
39
49
40
50
// Prefix cannot be empty
41
51
if target .Prefix == "" {
42
- return fmt .Errorf ("prefix for target named %s cannot be empty" , target .Name )
52
+ target .Prefix = m .cfg .Traefik .DefaultPrefix
53
+ }
54
+
55
+ if target .Entrypoint == "" {
56
+ target .Entrypoint = m .cfg .Traefik .DefaultEntrypoint
43
57
}
44
58
45
59
// Rule cannot be empty
46
60
if target .Rule == "" {
47
61
return fmt .Errorf ("prefix for target named %s cannot be empty" , target .Name )
48
62
}
49
63
64
+ if target .Type == "" {
65
+ log .Warnf ("target %s has an empty type, using http..." , target .Name )
66
+ target .Type = "http"
67
+ }
68
+
50
69
return nil
51
70
}
52
71
53
72
func (m * EtcdKeymateManager ) deleteTarget (ctx context.Context , target * traefikkeymate.Target ) []error {
73
+ err := m .validateTarget (target )
74
+ if err != nil {
75
+ return []error {fmt .Errorf ("invalid target: %v" , err )}
76
+ }
77
+
54
78
keyPrefixes := []string {
55
- fmt .Sprintf ("%s/http /routers/%s" , target .Prefix , target .Name ),
56
- fmt .Sprintf ("%s/http /services/%s" , target .Prefix , target .Name ),
57
- fmt .Sprintf ("%s/http /middlewares/%s" , target .Prefix , target .Name ),
79
+ fmt .Sprintf ("%s/%s /routers/%s" , target .Prefix , target . Type , target .Name ),
80
+ fmt .Sprintf ("%s/%s /services/%s" , target .Prefix , target . Type , target .Name ),
81
+ fmt .Sprintf ("%s/%s /middlewares/%s" , target .Prefix , target . Type , target .Name ),
58
82
}
59
83
60
84
var errs []error
@@ -73,40 +97,47 @@ func valuesForMiddlewares(target *traefikkeymate.Target, middlewares []*traefikk
73
97
var middlewareNames []string
74
98
for _ , middleware := range middlewares {
75
99
for key , value := range middleware .Values {
76
- keys [fmt .Sprintf ("%s/http /middlewares/%s/%s/%s" , target .Prefix , middleware .Name , middleware .Kind , key )] = value
100
+ keys [fmt .Sprintf ("%s/%s /middlewares/%s/%s/%s" , target .Prefix , target . Type , middleware .Name , middleware .Kind , key )] = value
77
101
}
78
102
79
103
middlewareNames = append (middlewareNames , middleware .Name )
80
104
}
81
105
82
106
if len (middlewareNames ) > 0 {
83
- keys [fmt .Sprintf ("%s/http /routers/%s/middlewares" , target .Prefix , target .Name )] = strings .Join (middlewareNames , "," )
107
+ keys [fmt .Sprintf ("%s/%s /routers/%s/middlewares" , target .Prefix , target . Type , target .Name )] = strings .Join (middlewareNames , "," )
84
108
}
85
109
86
110
return keys
87
111
}
88
112
89
113
func (m * EtcdKeymateManager ) writeTarget (ctx context.Context , target * traefikkeymate.Target ) error {
90
114
keys := etcdKeyValue {
91
- fmt .Sprintf ("%s/http /routers/%s/entrypoints" , target .Prefix , target .Name ): target .Entrypoint ,
92
- fmt .Sprintf ("%s/http /routers/%s/rule" , target .Prefix , target .Name ): target .Rule ,
93
- fmt .Sprintf ("%s/http /routers/%s/service" , target .Prefix , target .Name ): target .Name ,
115
+ fmt .Sprintf ("%s/%s /routers/%s/entrypoints" , target .Prefix , target . Type , target .Name ): target .Entrypoint ,
116
+ fmt .Sprintf ("%s/%s /routers/%s/rule" , target .Prefix , target . Type , target .Name ): target .Rule ,
117
+ fmt .Sprintf ("%s/%s /routers/%s/service" , target .Prefix , target . Type , target .Name ): target .Name ,
94
118
}
95
119
96
120
// Set loadbalancing between the endpoints
97
121
for id , url := range target .ServerURLs {
98
122
serverURL := url
99
123
100
- // Check we have a scheme in the url to the server
101
- if ! strings .HasPrefix (url , "http://" ) && ! strings .HasPrefix (url , "https://" ) {
102
- log .Warnf ("server URL for target %s doesn't have a scheme, adding http" , target .Name )
103
- serverURL = fmt .Sprintf ("http://%s" , url )
124
+ // Check we have a scheme in the url to the server with http routers
125
+ if target .Type == "http" {
126
+ if ! strings .Contains (url , "//" ) {
127
+ log .Warnf ("server URL for target %s doesn't have a scheme, adding %s" , target .Type , target .Name )
128
+ serverURL = fmt .Sprintf ("%s://%s" , target .Type , url )
129
+ }
130
+ }
131
+
132
+ suffix := "url"
133
+ if target .Type != "http" {
134
+ suffix = "address"
104
135
}
105
136
106
- keys [fmt .Sprintf ("%s/http /services/%s/loadbalancer/servers/%d/url " , target .Prefix , target .Name , id )] = serverURL
137
+ keys [fmt .Sprintf ("%s/%s /services/%s/loadbalancer/servers/%d/%s " , target .Prefix , target .Type , target . Name , id , suffix )] = serverURL
107
138
}
108
139
109
- if target .TLS {
140
+ if target .TLS && target . Type == "http" {
110
141
keys [fmt .Sprintf ("%s/http/routers/%s/tls" , target .Prefix , target .Name )] = "true"
111
142
}
112
143
@@ -145,7 +176,7 @@ func (m *EtcdKeymateManager) ApplyConfig(ctx context.Context, cfg *traefikkeymat
145
176
target .Entrypoint = cfg .Traefik .DefaultEntrypoint
146
177
}
147
178
148
- if err := validateTarget (target ); err != nil {
179
+ if err := m . validateTarget (target ); err != nil {
149
180
errs = append (errs , err )
150
181
continue
151
182
}
0 commit comments