1
1
package annotations
2
2
3
3
import (
4
- "sort"
5
4
"strings"
6
5
7
6
"github.com/go-test/deep"
@@ -20,6 +19,7 @@ type CfgSnippet struct {
20
19
21
20
type cfgData struct {
22
21
value []string
22
+ backendValue map [string ]struct {}
23
23
previousValue []string
24
24
updated []string
25
25
}
@@ -40,7 +40,7 @@ var cfgSnippet struct {
40
40
41
41
//nolint:gochecknoinits
42
42
func init () {
43
- cfgSnippet .global = & cfgData {}
43
+ cfgSnippet .global = & cfgData {backendValue : map [ string ] struct {}{} }
44
44
cfgSnippet .frontends = make (map [string ]* cfgData )
45
45
cfgSnippet .backends = make (map [string ]* cfgData )
46
46
}
@@ -83,7 +83,12 @@ func (a *CfgSnippet) Process(k store.K8s, annotations ...map[string]string) erro
83
83
if ! ok {
84
84
cfg = & cfgData {}
85
85
}
86
- cfg .value = append (cfg .value , data ... )
86
+ if cfg .backendValue == nil {
87
+ cfg .backendValue = map [string ]struct {}{}
88
+ }
89
+ // As a configsnippet from a service referenced by multiple ingress will be resubmited as many times as ingresses
90
+ // We guarantee unicity with map.
91
+ cfg .backendValue [input ] = struct {}{}
87
92
cfgSnippet .backends [a .backend ] = cfg
88
93
default :
89
94
updated := deep .Equal (cfgSnippet .global .value , data )
@@ -128,30 +133,36 @@ func UpdateFrontendCfgSnippet(api api.HAProxyClient, frontends ...string) (updat
128
133
return
129
134
}
130
135
131
- func UpdateBackendCfgSnippet (api api.HAProxyClient , backend string ) (updated []string , err error ) {
136
+ func UpdateBackendCfgSnippet (k store. K8s , api api.HAProxyClient , backend string ) (updated []string , err error ) {
132
137
data , ok := cfgSnippet .backends [backend ]
133
138
if ! ok {
134
139
return
135
140
}
141
+
136
142
defer func () {
143
+ if backend == store .DefaultLocalBackend {
144
+ return
145
+ }
137
146
data .value = nil
147
+ data .backendValue = nil
138
148
}()
139
- valueCopy := make ([]string , len (data .value ))
140
- copy (valueCopy , data .value )
141
- prevValueCopy := make ([]string , len (data .previousValue ))
142
- copy (prevValueCopy , data .previousValue )
143
- sort .StringSlice (valueCopy ).Sort ()
144
- sort .StringSlice (prevValueCopy ).Sort ()
145
- updated = deep .Equal (valueCopy , prevValueCopy )
149
+
150
+ var value []string
151
+ for input := range data .backendValue {
152
+ if input != "" {
153
+ data := strings .Split (strings .Trim (input , "\n " ), "\n " )
154
+ value = append (value , data ... )
155
+ }
156
+ }
157
+ updated = deep .Equal (data .previousValue , value )
146
158
if len (updated ) == 0 {
147
159
return
148
160
}
149
- err = api .BackendCfgSnippetSet (backend , data . value )
161
+ err = api .BackendCfgSnippetSet (backend , value )
150
162
if err != nil {
151
163
return
152
164
}
153
- data .previousValue = data .value
154
- data .value = nil
165
+ data .previousValue = value
155
166
return
156
167
}
157
168
@@ -162,10 +173,10 @@ func RemoveBackendCfgSnippet(backend string) {
162
173
delete (cfgSnippet .backends , backend )
163
174
}
164
175
165
- func HandleBackendCfgSnippet (api api.HAProxyClient ) (reload bool , err error ) {
176
+ func HandleBackendCfgSnippet (k store. K8s , api api.HAProxyClient ) (reload bool , err error ) {
166
177
var errs utils.Errors
167
178
for backend := range cfgSnippet .backends {
168
- updated , errBackend := UpdateBackendCfgSnippet (api , backend )
179
+ updated , errBackend := UpdateBackendCfgSnippet (k , api , backend )
169
180
if len (updated ) != 0 {
170
181
logger .Debugf ("backend configsnippet of '%s' has been updated, reload required" , backend )
171
182
}
0 commit comments