11package annotations
22
33import (
4+ "sort"
45 "strings"
56
67 "github.com/go-test/deep"
78
89 "github.com/haproxytech/kubernetes-ingress/pkg/annotations/common"
910 "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/api"
1011 "github.com/haproxytech/kubernetes-ingress/pkg/store"
12+ "github.com/haproxytech/kubernetes-ingress/pkg/utils"
1113)
1214
1315type CfgSnippet struct {
@@ -17,8 +19,9 @@ type CfgSnippet struct {
1719}
1820
1921type cfgData struct {
20- value []string
21- updated []string
22+ value []string
23+ previousValue []string
24+ updated []string
2225}
2326
2427// cfgSnippet is a particular type of config that is not
@@ -76,15 +79,12 @@ func (a *CfgSnippet) Process(k store.K8s, annotations ...map[string]string) erro
7679 cfgSnippet .frontends [a .frontend ].updated = updated
7780 }
7881 case a .backend != "" :
79- _ , ok := cfgSnippet .backends [a .backend ]
82+ cfg , ok := cfgSnippet .backends [a .backend ]
8083 if ! ok {
81- cfgSnippet .backends [a .backend ] = & cfgData {}
82- }
83- updated := deep .Equal (cfgSnippet .backends [a .backend ].value , data )
84- if len (updated ) != 0 {
85- cfgSnippet .backends [a .backend ].value = data
86- cfgSnippet .backends [a .backend ].updated = updated
84+ cfg = & cfgData {}
8785 }
86+ cfg .value = append (cfg .value , data ... )
87+ cfgSnippet .backends [a .backend ] = cfg
8888 default :
8989 updated := deep .Equal (cfgSnippet .global .value , data )
9090 if len (updated ) != 0 {
@@ -133,16 +133,25 @@ func UpdateBackendCfgSnippet(api api.HAProxyClient, backend string) (updated []s
133133 if ! ok {
134134 return
135135 }
136- if len (data .updated ) == 0 {
136+ defer func () {
137+ data .value = nil
138+ }()
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 )
146+ if len (updated ) == 0 {
137147 return
138148 }
139149 err = api .BackendCfgSnippetSet (backend , data .value )
140150 if err != nil {
141151 return
142152 }
143- updated = data .updated
144- data .updated = nil
145- cfgSnippet .backends [backend ] = data
153+ data .previousValue = data .value
154+ data .value = nil
146155 return
147156}
148157
@@ -152,3 +161,17 @@ func RemoveBackendCfgSnippet(backend string) {
152161 }
153162 delete (cfgSnippet .backends , backend )
154163}
164+
165+ func HandleBackendCfgSnippet (api api.HAProxyClient ) (reload bool , err error ) {
166+ var errs utils.Errors
167+ for backend := range cfgSnippet .backends {
168+ updated , errBackend := UpdateBackendCfgSnippet (api , backend )
169+ if len (updated ) != 0 {
170+ logger .Debugf ("backend configsnippet of '%s' has been updated, reload required" , backend )
171+ }
172+ reload = reload || len (updated ) != 0
173+ errs .Add (errBackend )
174+ }
175+ err = errs .Result ()
176+ return
177+ }
0 commit comments