Skip to content

Commit 8962088

Browse files
ivanmatmatioktalz
authored andcommitted
BUG/MINOR: fix multiple insertion of config snippet from service referenced by several ingresses
1 parent d20e38f commit 8962088

File tree

4 files changed

+35
-22
lines changed

4 files changed

+35
-22
lines changed

pkg/annotations/cfgSnippet.go

+27-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package annotations
22

33
import (
4-
"sort"
54
"strings"
65

76
"github.com/go-test/deep"
@@ -20,6 +19,7 @@ type CfgSnippet struct {
2019

2120
type 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
4242
func 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
}

pkg/controller/global.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -180,25 +180,25 @@ func (c *HAProxyController) handleDefaultServicePort() (reload bool) {
180180
if portStr == "" {
181181
return
182182
}
183-
defaultLocalBackend := "default_local_backend"
183+
184184
ingressPath := &store.IngressPath{
185185
SvcNamespace: "",
186-
SvcName: defaultLocalBackend,
186+
SvcName: store.DefaultLocalBackend,
187187
SvcPortString: portStr,
188188
IsDefaultBackend: true,
189189
}
190190

191-
backend, _ := c.haproxy.BackendGet(defaultLocalBackend)
191+
backend, _ := c.haproxy.BackendGet(store.DefaultLocalBackend)
192192
if backend != nil {
193193
return
194194
}
195195
err = c.haproxy.BackendCreate(models.Backend{
196-
Name: defaultLocalBackend,
196+
Name: store.DefaultLocalBackend,
197197
})
198198
if err != nil {
199199
logger.Errorf("default backend port: %s", err)
200200
}
201-
backend, _ = c.haproxy.BackendGet(defaultLocalBackend)
201+
backend, _ = c.haproxy.BackendGet(store.DefaultLocalBackend)
202202

203203
if svc, err = service.NewLocal(c.store, ingressPath, backend, c.store.ConfigMaps.Main.Annotations); err == nil {
204204
reload, err = svc.SetDefaultBackend(c.store, c.haproxy, []string{c.haproxy.FrontHTTP, c.haproxy.FrontHTTPS}, c.annotations)

pkg/handler/backendCfgSnippet.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ import (
2323
type BackendCfgSnippet struct{}
2424

2525
func (handler BackendCfgSnippet) Update(k store.K8s, h haproxy.HAProxy, a annotations.Annotations) (reload bool, err error) {
26-
return annotations.HandleBackendCfgSnippet(h.HAProxyClient)
26+
return annotations.HandleBackendCfgSnippet(k, h.HAProxyClient)
2727
}

pkg/store/store.go

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"github.com/haproxytech/kubernetes-ingress/pkg/utils"
2222
)
2323

24+
const DefaultLocalBackend = "default_local_backend"
25+
2426
type K8s struct {
2527
NbrHAProxyInst int64
2628
Namespaces map[string]*Namespace

0 commit comments

Comments
 (0)