Skip to content

Commit d490e9f

Browse files
committed
MINOR: support keyword hash-preserve-affinity in defaults, backends and listen sections
Signed-off-by: Vincent Gramer <vgramer@haproxy.com>
1 parent 74556cd commit d490e9f

19 files changed

Lines changed: 395 additions & 5 deletions
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package parsers
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/haproxytech/client-native/v6/config-parser/common"
7+
"github.com/haproxytech/client-native/v6/config-parser/errors"
8+
"github.com/haproxytech/client-native/v6/config-parser/types"
9+
)
10+
11+
type HashPreserveAffinity struct {
12+
data *types.StringC
13+
preComments []string // comments that appear before the actual line
14+
}
15+
16+
func (p *HashPreserveAffinity) Parse(line string, parts []string, comment string) (string, error) {
17+
if parts[0] == "hash-preserve-affinity" {
18+
if len(parts) < 2 {
19+
return "", &errors.ParseError{Parser: "HashPreserveAffinity", Line: line, Message: "Parse error"}
20+
}
21+
22+
if parts[1] == "always" || parts[1] == "maxconn" || parts[1] == "maxqueue" {
23+
p.data = &types.StringC{
24+
Value: parts[1],
25+
Comment: comment,
26+
}
27+
return "", nil
28+
}
29+
30+
return "", &errors.ParseError{Parser: "HashPreserveAffinity", Line: line, Message: fmt.Sprintf("Unknown data %q", parts[1])}
31+
}
32+
return "", &errors.ParseError{Parser: "HashPreserveAffinity", Line: line}
33+
}
34+
35+
func (p *HashPreserveAffinity) Result() ([]common.ReturnResultLine, error) {
36+
if p.data == nil {
37+
return nil, errors.ErrFetch
38+
}
39+
return []common.ReturnResultLine{
40+
{
41+
Data: "hash-preserve-affinity " + p.data.Value,
42+
Comment: p.data.Comment,
43+
},
44+
}, nil
45+
}

config-parser/parsers/hash-preserve-affinity_generated.go

Lines changed: 99 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config-parser/section-parsers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ func (p *configParser) getDefaultParser() *Parsers {
211211
addParser(parser, &sequence, &parsers.Persist{})
212212
addParser(parser, &sequence, &simple.Number{Name: "rate-limit sessions"})
213213
addParser(parser, &sequence, &simple.Number{Name: "hash-balance-factor"})
214+
addParser(parser, &sequence, &parsers.HashPreserveAffinity{})
214215
addParser(parser, &sequence, &http.Requests{Mode: "defaults"})
215216
addParser(parser, &sequence, &tcp.Requests{Mode: "defaults"})
216217
addParser(parser, &sequence, &tcp.Responses{Mode: "defaults"})
@@ -698,6 +699,7 @@ func (p *configParser) getBackendParser() *Parsers {
698699
addParser(parser, &sequence, &parsers.Source{})
699700
addParser(parser, &sequence, &parsers.Persist{})
700701
addParser(parser, &sequence, &simple.Number{Name: "hash-balance-factor"})
702+
addParser(parser, &sequence, &parsers.HashPreserveAffinity{})
701703
addParser(parser, &sequence, &simple.Word{Name: "guid"})
702704
return p.createParsers(parser, sequence)
703705
}
@@ -789,6 +791,7 @@ func (p *configParser) getListenParser() *Parsers {
789791
addParser(parser, &sequence, &parsers.OptionHTTPRestrictReqHdrNames{})
790792
addParser(parser, &sequence, &tcp.Checks{})
791793
addParser(parser, &sequence, &parsers.OptionHttpchk{})
794+
addParser(parser, &sequence, &parsers.HashPreserveAffinity{})
792795
if p.Options.UseV2HTTPCheck {
793796
addParser(parser, &sequence, &parsers.HTTPCheckV2{})
794797
} else {

config-parser/tests/configs/haproxy.cfg.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ defaults A
127127
srvtcpka-intvl 10s
128128
load-server-state-from-file global
129129
hash-balance-factor 150
130+
hash-preserve-affinity maxconn
130131
131132
# some random userlist L1
132133
userlist L1
@@ -397,6 +398,7 @@ backend test from A
397398
tcp-response content accept if TRUE
398399
tcp-response content reject if FALSE
399400
hash-balance-factor 150
401+
hash-preserve-affinity always
400402
option httplog
401403
option contstats
402404
option contstats
@@ -421,6 +423,7 @@ listen stats from A
421423
option transparent
422424
option idle-close-on-response
423425
option dontlog-normal
426+
hash-preserve-affinity maxconn
424427
stats enable
425428
stats realm HAProxy\ Statistics
426429
stats uri /

config-parser/tests/hash-preserve-affinity_generated_test.go

Lines changed: 85 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config-parser/types/types-generic.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ type Int64C struct {
7676
Comment string
7777
}
7878

79-
// String is used by parsers Mode, DefaultBackend, SimpleTimeTwoWords, StatsTimeout, CompressionDirection, CompressionAlgoReq, CPUPolicy
79+
// String is used by parsers Mode, DefaultBackend, SimpleTimeTwoWords, StatsTimeout, CompressionDirection, CompressionAlgoReq, CPUPolicy, HashPreserveAffinity
8080
//
8181
//generate:type:Mode
8282
//name:mode
@@ -124,6 +124,13 @@ type Int64C struct {
124124
//test:ok:cpu-policy resource
125125
//test:ko:cpu-policy
126126
//test:ko:cpu-policy notvalid
127+
//generate:type:HashPreserveAffinity
128+
//name:hash-preserve-affinity
129+
//test:ok:hash-preserve-affinity always
130+
//test:ok:hash-preserve-affinity maxconn # comment
131+
//test:ok:hash-preserve-affinity maxqueue
132+
//test:fail:hash-preserve-affinity
133+
//test:fail:hash-preserve-affinity notvalid
127134
type StringC struct {
128135
Value string
129136
Comment string

models/backend_base.go

Lines changed: 54 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/backend_base_compare.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)