Skip to content

Commit 0e913bc

Browse files
committed
BUG/MINOR: Don't initialize Backend.DefaultServer when not used
We used to always initialize the DefaultServer struct of Backend model before any processing. Which makes the deep.Equal(newBackend, backend) test always return true eventhough default-server is not used because newBackend.DefaultServer is an empty struct and backend.DefaultServer is nil. This has been fixed by initializing Backend.DefaultServer only when it is going to be used.
1 parent 44885e5 commit 0e913bc

File tree

9 files changed

+84
-38
lines changed

9 files changed

+84
-38
lines changed

controller/annotations/service/ca.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@ func (a *CA) Process(k store.K8s, annotations ...map[string]string) error {
3535
}
3636
secret, _ = k.GetSecret(ns, name)
3737
if secret == nil {
38-
a.backend.DefaultServer.CaFile = ""
39-
// Other values from serverSSL annotation are kept
38+
if a.backend.DefaultServer != nil {
39+
a.backend.DefaultServer.CaFile = ""
40+
// Other values from serverSSL annotation are kept
41+
}
4042
return nil
4143
}
4244
caFile, err = a.haproxyCerts.HandleTLSSecret(secret, certs.CA_CERT)
4345
if err != nil {
4446
return err
4547
}
48+
if a.backend.DefaultServer == nil {
49+
a.backend.DefaultServer = &models.DefaultServer{}
50+
}
4651
a.backend.DefaultServer.Ssl = "enabled"
4752
a.backend.DefaultServer.Alpn = "h2,http/1.1"
4853
a.backend.DefaultServer.Verify = "required"

controller/annotations/service/check.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,30 @@ func (a *Check) GetName() string {
2121
return a.name
2222
}
2323

24+
// the value models.DefaultSever.Check should be a bool value and not an enum [enabled, disabled]
25+
// this avoids an uncessary update when models.DefaultSever.Check is set form empty to "disabled"
2426
func (a *Check) Process(k store.K8s, annotations ...map[string]string) error {
2527
input := common.GetValue(a.GetName(), annotations...)
2628
if input == "" {
27-
a.backend.DefaultServer.Check = ""
29+
if a.backend.DefaultServer != nil {
30+
a.backend.DefaultServer.Check = ""
31+
}
2832
return nil
2933
}
3034
enabled, err := utils.GetBoolValue(input, "check")
3135
if err != nil {
3236
return err
3337
}
34-
if enabled {
35-
a.backend.DefaultServer.Check = "enabled"
38+
if !enabled {
39+
if a.backend.DefaultServer != nil {
40+
a.backend.DefaultServer.Check = ""
41+
}
42+
return nil
43+
}
44+
if a.backend.DefaultServer == nil {
45+
a.backend.DefaultServer = &models.DefaultServer{Check: "enabled"}
3646
} else {
37-
a.backend.DefaultServer.Check = "disabled"
47+
a.backend.DefaultServer.Check = "enabled"
3848
}
3949
return nil
4050
}

controller/annotations/service/checkInter.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,18 @@ func (a *CheckInter) GetName() string {
2424
func (a *CheckInter) Process(k store.K8s, annotations ...map[string]string) error {
2525
input := common.GetValue(a.GetName(), annotations...)
2626
if input == "" {
27-
a.backend.DefaultServer.Inter = nil
27+
if a.backend.DefaultServer != nil {
28+
a.backend.DefaultServer.Inter = nil
29+
}
2830
return nil
2931
}
3032
value, err := utils.ParseTime(input)
3133
if err != nil {
3234
return err
3335
}
36+
if a.backend.DefaultServer == nil {
37+
a.backend.DefaultServer = &models.DefaultServer{}
38+
}
3439
a.backend.DefaultServer.Inter = value
3540
return nil
3641
}

controller/annotations/service/crt.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,19 @@ func (a *Crt) Process(k store.K8s, annotations ...map[string]string) error {
3535
}
3636
secret, _ = k.GetSecret(ns, name)
3737
if secret == nil {
38-
a.backend.DefaultServer.SslCertificate = ""
39-
// Other values from serverSSL annotation are kept
38+
if a.backend.DefaultServer != nil {
39+
a.backend.DefaultServer.SslCertificate = ""
40+
// Other values from serverSSL annotation are kept
41+
}
4042
return nil
4143
}
4244
crtFile, err = a.haproxyCerts.HandleTLSSecret(secret, certs.BD_CERT)
4345
if err != nil {
4446
return err
4547
}
48+
if a.backend.DefaultServer == nil {
49+
a.backend.DefaultServer = &models.DefaultServer{}
50+
}
4651
a.backend.DefaultServer.Ssl = "enabled"
4752
a.backend.DefaultServer.Alpn = "h2,http/1.1"
4853
a.backend.DefaultServer.Verify = "none"

controller/annotations/service/maxconn.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ func (a *Maxconn) GetName() string {
2525
func (a *Maxconn) Process(k store.K8s, annotations ...map[string]string) error {
2626
input := common.GetValue(a.GetName(), annotations...)
2727
if input == "" {
28-
a.backend.DefaultServer.Maxconn = nil
28+
if a.backend.DefaultServer != nil {
29+
a.backend.DefaultServer.Maxconn = nil
30+
}
2931
return nil
3032
}
3133
v, err := strconv.ParseInt(input, 10, 64)
@@ -36,6 +38,9 @@ func (a *Maxconn) Process(k store.K8s, annotations ...map[string]string) error {
3638
if k.NbrHAProxyInst != 0 {
3739
v /= k.NbrHAProxyInst
3840
}
41+
if a.backend.DefaultServer == nil {
42+
a.backend.DefaultServer = &models.DefaultServer{}
43+
}
3944
a.backend.DefaultServer.Maxconn = &v
4045
return nil
4146
}

controller/annotations/service/proto.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@ func (a *Proto) GetName() string {
2424

2525
func (a *Proto) Process(k store.K8s, annotations ...map[string]string) error {
2626
input := common.GetValue(a.GetName(), annotations...)
27+
if input == "h2" {
28+
if a.backend.DefaultServer != nil {
29+
a.backend.DefaultServer = &models.DefaultServer{}
30+
}
31+
a.backend.DefaultServer.Proto = "h2"
32+
return nil
33+
} else if a.backend.DefaultServer == nil {
34+
return nil
35+
}
2736
switch input {
2837
case "":
2938
a.backend.DefaultServer.Proto = ""
3039
case "h1":
3140
// Forces H1 even when SSL is enabled
3241
a.backend.DefaultServer.Alpn = ""
3342
a.backend.DefaultServer.Proto = ""
34-
case "h2":
35-
a.backend.DefaultServer.Proto = "h2"
3643
default:
3744
return fmt.Errorf("unknown proto %s", input)
3845
}

controller/annotations/service/sendProxy.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ func (a *SendProxy) Process(k store.K8s, annotations ...map[string]string) error
2727
input := common.GetValue(a.GetName(), annotations...)
2828
var proxyPorto string
2929
v := strings.ToLower(input)
30+
if v == "" {
31+
if a.backend.DefaultServer != nil {
32+
a.backend.DefaultServer.SendProxy = ""
33+
a.backend.DefaultServer.SendProxyV2 = ""
34+
a.backend.DefaultServer.SendProxyV2Ssl = ""
35+
a.backend.DefaultServer.SendProxyV2SslCn = ""
36+
}
37+
return nil
38+
} else if a.backend.DefaultServer == nil {
39+
a.backend.DefaultServer = &models.DefaultServer{}
40+
}
3041
switch v {
3142
case "proxy":
3243
a.backend.DefaultServer.SendProxy = "enabled"
@@ -38,11 +49,6 @@ func (a *SendProxy) Process(k store.K8s, annotations ...map[string]string) error
3849
a.backend.DefaultServer.SendProxyV2Ssl = "enabled"
3950
case "proxy-v2-ssl-cn":
4051
a.backend.DefaultServer.SendProxyV2SslCn = "enabled"
41-
case "":
42-
a.backend.DefaultServer.SendProxy = ""
43-
a.backend.DefaultServer.SendProxyV2 = ""
44-
a.backend.DefaultServer.SendProxyV2Ssl = ""
45-
a.backend.DefaultServer.SendProxyV2SslCn = ""
4652
default:
4753
return fmt.Errorf("%s is an unknown enum", proxyPorto)
4854
}

controller/annotations/service/ssl.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@ func (a *SSL) Process(k store.K8s, annotations ...map[string]string) error {
3232
}
3333
}
3434
if enabled {
35+
if a.backend.DefaultServer == nil {
36+
a.backend.DefaultServer = &models.DefaultServer{}
37+
}
3538
a.backend.DefaultServer.Ssl = "enabled"
3639
a.backend.DefaultServer.Alpn = "h2,http/1.1"
3740
a.backend.DefaultServer.Verify = "none"
38-
} else {
41+
} else if a.backend.DefaultServer != nil {
3942
a.backend.DefaultServer.Ssl = ""
4043
a.backend.DefaultServer.Alpn = ""
4144
a.backend.DefaultServer.Verify = ""

controller/service/service.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -142,37 +142,37 @@ func (s *Service) HandleBackend(client api.HAProxyClient, store store.K8s) (relo
142142

143143
// getBackendModel checks for a corresponding custom resource before falling back to annoations
144144
func (s *Service) getBackendModel(store store.K8s) (backend *models.Backend, err error) {
145-
var crInUse = true
145+
// Backend mode
146+
var mode = "http"
147+
if s.modeTCP {
148+
mode = "tcp"
149+
}
146150
// get/create backend Model
147151
backend, err = annotations.ModelBackend("cr-backend", s.resource.Namespace, store, s.annotations...)
148152
logger.Warning(err)
149153
if backend == nil {
150-
backend = &models.Backend{DefaultServer: &models.DefaultServer{}}
151-
crInUse = false
152-
}
153-
if backend.DefaultServer == nil {
154-
backend.DefaultServer = &models.DefaultServer{}
155-
}
156-
// configure backend model
157-
if s.modeTCP {
158-
backend.Mode = "tcp"
159-
} else {
160-
backend.Mode = "http"
161-
}
162-
if backend.Name, err = s.GetBackendName(); err != nil {
163-
return nil, err
164-
}
165-
if s.resource.DNS != "" && backend.DefaultServer.InitAddr == "" {
166-
backend.DefaultServer.InitAddr = "last,libc,none"
167-
}
168-
if !crInUse {
154+
backend = &models.Backend{Mode: mode}
169155
for _, a := range annotations.Backend(backend, store, s.certs) {
170156
err = a.Process(store, s.annotations...)
171157
if err != nil {
172158
logger.Errorf("service '%s/%s': annotation '%s': %s", s.resource.Namespace, s.resource.Name, a.GetName(), err)
173159
}
174160
}
175161
}
162+
163+
// Manadatory backend params
164+
backend.Mode = mode
165+
backend.Name, err = s.GetBackendName()
166+
if err != nil {
167+
return nil, err
168+
}
169+
if s.resource.DNS != "" {
170+
if backend.DefaultServer == nil {
171+
backend.DefaultServer = &models.DefaultServer{InitAddr: "last,libc,none"}
172+
} else if backend.DefaultServer.InitAddr == "" {
173+
backend.DefaultServer.InitAddr = "last,libc,none"
174+
}
175+
}
176176
if backend.Cookie != nil && backend.Cookie.Dynamic && backend.DynamicCookieKey == "" {
177177
backend.DynamicCookieKey = cookieKey
178178
}

0 commit comments

Comments
 (0)