11package annotations
22
33import (
4- "sort"
54 "strings"
65
76 "github.com/go-test/deep"
@@ -20,6 +19,7 @@ type CfgSnippet struct {
2019
2120type cfgData struct {
2221 value []string
22+ backendValue map [string ]struct {}
2323 previousValue []string
2424 updated []string
2525}
@@ -40,7 +40,7 @@ var cfgSnippet struct {
4040
4141//nolint:gochecknoinits
4242func init () {
43- cfgSnippet .global = & cfgData {}
43+ cfgSnippet .global = & cfgData {backendValue : map [ string ] struct {}{} }
4444 cfgSnippet .frontends = make (map [string ]* cfgData )
4545 cfgSnippet .backends = make (map [string ]* cfgData )
4646}
@@ -83,7 +83,12 @@ func (a *CfgSnippet) Process(k store.K8s, annotations ...map[string]string) erro
8383 if ! ok {
8484 cfg = & cfgData {}
8585 }
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 {}{}
8792 cfgSnippet .backends [a .backend ] = cfg
8893 default :
8994 updated := deep .Equal (cfgSnippet .global .value , data )
@@ -128,30 +133,36 @@ func UpdateFrontendCfgSnippet(api api.HAProxyClient, frontends ...string) (updat
128133 return
129134}
130135
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 ) {
132137 data , ok := cfgSnippet .backends [backend ]
133138 if ! ok {
134139 return
135140 }
141+
136142 defer func () {
143+ if backend == store .DefaultLocalBackend {
144+ return
145+ }
137146 data .value = nil
147+ data .backendValue = nil
138148 }()
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 )
146158 if len (updated ) == 0 {
147159 return
148160 }
149- err = api .BackendCfgSnippetSet (backend , data . value )
161+ err = api .BackendCfgSnippetSet (backend , value )
150162 if err != nil {
151163 return
152164 }
153- data .previousValue = data .value
154- data .value = nil
165+ data .previousValue = value
155166 return
156167}
157168
@@ -162,10 +173,10 @@ func RemoveBackendCfgSnippet(backend string) {
162173 delete (cfgSnippet .backends , backend )
163174}
164175
165- func HandleBackendCfgSnippet (api api.HAProxyClient ) (reload bool , err error ) {
176+ func HandleBackendCfgSnippet (k store. K8s , api api.HAProxyClient ) (reload bool , err error ) {
166177 var errs utils.Errors
167178 for backend := range cfgSnippet .backends {
168- updated , errBackend := UpdateBackendCfgSnippet (api , backend )
179+ updated , errBackend := UpdateBackendCfgSnippet (k , api , backend )
169180 if len (updated ) != 0 {
170181 logger .Debugf ("backend configsnippet of '%s' has been updated, reload required" , backend )
171182 }
0 commit comments