Skip to content

Commit 0a64904

Browse files
hdurand0710oktalz
authored andcommitted
MEDIUM: ensure all children of Frontend are written to haproxy.cfg file
1 parent 7b7bc31 commit 0a64904

10 files changed

Lines changed: 759 additions & 155 deletions

File tree

hug/haproxy/api/frontend.go

Lines changed: 5 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"context"
1818
"log/slog"
1919

20-
parser "github.com/haproxytech/client-native/v6/config-parser"
2120
"github.com/haproxytech/client-native/v6/models"
2221
"github.com/haproxytech/haproxy-unified-gateway/hug/reload"
2322
"github.com/haproxytech/haproxy-unified-gateway/k8s/gate/logging"
@@ -28,11 +27,10 @@ func (c *clientNative) FrontendCreate(frontend models.Frontend) error {
2827
if err != nil {
2928
return err
3029
}
31-
f := &models.Frontend{FrontendBase: frontend.FrontendBase}
32-
errCreate := configuration.CreateFrontend(f, c.activeTransaction, 0)
30+
errCreate := configuration.CreateStructuredFrontend(&frontend, c.activeTransaction, 0)
3331
if errCreate != nil {
3432
// ... maybe it's already existing, so just edit it.
35-
if err := configuration.EditFrontend(frontend.Name, &frontend, c.activeTransaction, 0); err != nil {
33+
if err := configuration.EditStructuredFrontend(frontend.Name, &frontend, c.activeTransaction, 0); err != nil {
3634
c.logger.LogAttrs(context.Background(), slog.LevelError, "failed to edit frontend",
3735
logging.LogAttrError(err),
3836
slog.String("frontend", frontend.Name),
@@ -42,36 +40,6 @@ func (c *clientNative) FrontendCreate(frontend models.Frontend) error {
4240
}
4341
reload.Instance().SetReload("Frontend upserted %s", frontend.Name)
4442

45-
// Binds
46-
err = c.BindReplaceAll(parser.Frontends, frontend.Name, frontend.Binds)
47-
if err != nil {
48-
return err
49-
}
50-
51-
// ACLs
52-
err = c.ACLReplaceAll(parser.Frontends, frontend.Name, frontend.ACLList)
53-
if err != nil {
54-
return err
55-
}
56-
57-
// Http Requests
58-
err = c.HTTPRequestReplaceAll(parser.Frontends, frontend.Name, frontend.HTTPRequestRuleList)
59-
if err != nil {
60-
return err
61-
}
62-
63-
// TCP Requests
64-
err = c.TCPRequestReplaceAll(parser.Frontends, frontend.Name, frontend.TCPRequestRuleList)
65-
if err != nil {
66-
return err
67-
}
68-
69-
// Use backend rules
70-
err = c.UseBackendReplaceAll(frontend.Name, frontend.BackendSwitchingRuleList)
71-
if err != nil {
72-
return err
73-
}
74-
7543
return nil
7644
}
7745

@@ -90,23 +58,8 @@ func (c *clientNative) FrontendsGet() (models.Frontends, error) {
9058
return nil, err
9159
}
9260
// TODO: complete with children
93-
_, frontends, err := configuration.GetFrontends(c.activeTransaction)
61+
_, frontends, err := configuration.GetStructuredFrontends(c.activeTransaction)
9462

95-
// Binds
96-
for _, frontend := range frontends {
97-
_, binds, err := configuration.GetBinds(string(parser.Frontends), frontend.Name, c.activeTransaction)
98-
if err != nil {
99-
return nil, err
100-
}
101-
if len(binds) != 0 {
102-
frontend.Binds = make(map[string]models.Bind)
103-
}
104-
for _, bind := range binds {
105-
if bind != nil {
106-
frontend.Binds[bind.Name] = *bind
107-
}
108-
}
109-
}
11063
return frontends, err
11164
}
11265

@@ -115,25 +68,10 @@ func (c *clientNative) FrontendGet(frontendName string) (models.Frontend, error)
11568
if err != nil {
11669
return models.Frontend{}, err
11770
}
118-
// TODO: complete with children
119-
_, frontend, err := configuration.GetFrontend(frontendName, c.activeTransaction)
120-
if err != nil {
121-
return models.Frontend{}, err
122-
}
123-
124-
// Binds
125-
_, binds, err := configuration.GetBinds(string(parser.Frontends), frontend.Name, c.activeTransaction)
71+
_, frontend, err := configuration.GetStructuredFrontend(frontendName, c.activeTransaction)
12672
if err != nil {
12773
return models.Frontend{}, err
12874
}
129-
if len(binds) != 0 {
130-
frontend.Binds = make(map[string]models.Bind)
131-
}
132-
for _, bind := range binds {
133-
if bind != nil {
134-
frontend.Binds[bind.Name] = *bind
135-
}
136-
}
13775

13876
return *frontend, err
13977
}
@@ -143,8 +81,7 @@ func (c *clientNative) FrontendEdit(frontend models.Frontend) error {
14381
if err != nil {
14482
return err
14583
}
146-
f := &models.Frontend{FrontendBase: frontend.FrontendBase}
147-
if err := configuration.EditFrontend(frontend.Name, f, c.activeTransaction, 0); err != nil {
84+
if err := configuration.EditFrontend(frontend.Name, &frontend, c.activeTransaction, 0); err != nil {
14885
c.logger.LogAttrs(context.Background(), slog.LevelError, "failed to edit frontend",
14986
logging.LogAttrError(err),
15087
slog.String("frontend", frontend.Name),
@@ -154,35 +91,5 @@ func (c *clientNative) FrontendEdit(frontend models.Frontend) error {
15491

15592
reload.Instance().SetReload("Frontend upserted %s", frontend.Name)
15693

157-
// Binds
158-
err = c.BindReplaceAll(parser.Frontends, frontend.Name, frontend.Binds)
159-
if err != nil {
160-
return err
161-
}
162-
163-
// ACLs
164-
err = c.ACLReplaceAll(parser.Frontends, frontend.Name, frontend.ACLList)
165-
if err != nil {
166-
return err
167-
}
168-
169-
// Http Requests
170-
err = c.HTTPRequestReplaceAll(parser.Frontends, frontend.Name, frontend.HTTPRequestRuleList)
171-
if err != nil {
172-
return err
173-
}
174-
175-
// TCP Requests
176-
err = c.TCPRequestReplaceAll(parser.Frontends, frontend.Name, frontend.TCPRequestRuleList)
177-
if err != nil {
178-
return err
179-
}
180-
181-
// Use backend rules
182-
err = c.UseBackendReplaceAll(frontend.Name, frontend.BackendSwitchingRuleList)
183-
if err != nil {
184-
return err
185-
}
186-
18794
return nil
18895
}

test/integration/base/base.go

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -388,27 +388,6 @@ func (b *BaseSuite) CleanupFixturesInNamespace(fixturePath, namespace string, ma
388388
b.Require().NoError(err)
389389
}
390390

391-
// Return HAProxy master process if it exists.
392-
// func haproxyProcess(pidFile string) (*os.Process, error) {
393-
// file, err := os.Open(pidFile)
394-
// if err != nil {
395-
// return nil, err
396-
// }
397-
// defer file.Close()
398-
// scanner := bufio.NewScanner(file)
399-
// scanner.Scan()
400-
// pid, err := strconv.Atoi(scanner.Text())
401-
// if err != nil {
402-
// return nil, err
403-
// }
404-
// process, err := os.FindProcess(pid)
405-
// if err != nil {
406-
// return nil, err
407-
// }
408-
// err = process.Signal(syscall.Signal(0))
409-
// return process, err
410-
// }
411-
412391
// For now: only checks the following certificate fields:
413392
// - StorageName
414393
// - Subject (for CN)
@@ -530,6 +509,7 @@ func (b *BaseSuite) ExpectFrontends(ctx context.Context, expectationPath string,
530509
return false
531510
}
532511

512+
// utils.ExportFrontend(gotFrontend)
533513
expectedFrontend := b.FrontendFromManifest(expectationPath, expectedFeName)
534514
areSame := expectedFrontend.Equal(*gotFrontend)
535515
if !areSame {
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
acl_list:
2+
- acl_name: route_is_json
3+
criterion: var(txn.route),bytes(0,1)
4+
metadata:
5+
hug: for lua routing
6+
value: -m str {
7+
backend_switching_rule_list:
8+
- cond: if
9+
cond_test: route_is_json
10+
name: '%[var(txn.backend)]'
11+
- name: '%[var(txn.route)]'
12+
binds:
13+
v4:
14+
address: 0.0.0.0
15+
name: v4
16+
port: 8080
17+
v6:
18+
address: '::'
19+
name: v6
20+
port: 8080
21+
default_backend: backend_not_found
22+
from: haproxytech
23+
http_request_rule_list:
24+
- type: set-var
25+
var_expr: path
26+
var_name: path
27+
var_scope: txn
28+
- type: set-var
29+
var_expr: req.hdr(Host),host_only
30+
var_name: host
31+
var_scope: txn
32+
- type: set-var
33+
var_expr: req.hdr(Host),host_only,lua.reverse_host
34+
var_name: hostreversed
35+
var_scope: txn
36+
- type: set-var
37+
var_expr: var(txn.host),concat("",txn.path)
38+
var_name: base
39+
var_scope: txn
40+
- metadata:
41+
hug: listener exact match selection
42+
type: set-var
43+
var_expr: var(txn.host),map(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/listener_exact_match.map)
44+
var_name: selected_listener_name
45+
var_scope: txn
46+
- metadata:
47+
hug: listener wildcard match selection
48+
type: set-var
49+
var_expr: var(txn.hostreversed),map_beg(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/listener_wildcard_match.map)
50+
var_name: selected_listener_name,ifnotexists
51+
var_scope: txn
52+
- type: set-var
53+
var_expr: var(txn.selected_listener_name),concat("/",txn.host)
54+
var_name: tmp_exact
55+
var_scope: txn
56+
- metadata:
57+
hug: listener-route exact match selection
58+
type: set-var
59+
var_expr: var(txn.tmp_exact),map(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/listener_route_exact_match.map)
60+
var_name: selected_listener_route,ifnotexists
61+
var_scope: txn
62+
- type: set-var
63+
var_expr: var(txn.selected_listener_name),concat("/",txn.hostreversed)
64+
var_name: tmp_wild
65+
var_scope: txn
66+
- metadata:
67+
hug: listener-route wildcard match selection
68+
type: set-var
69+
var_expr: var(txn.tmp_wild),map_beg(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/listener_route_wildcard_match.map)
70+
var_name: selected_listener_route,ifnotexists
71+
var_scope: txn
72+
- type: set-var
73+
var_expr: var(txn.selected_listener_route),concat("",txn.path)
74+
var_name: base_listener_route,ifnotexists
75+
var_scope: txn
76+
- metadata:
77+
hug: exact domain + exact path
78+
type: set-var
79+
var_expr: var(txn.base_listener_route),map(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/path_exact.map)
80+
var_name: route
81+
var_scope: txn
82+
- metadata:
83+
hug: exact domain + path prefix
84+
type: set-var
85+
var_expr: var(txn.base_listener_route),map_beg(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/path_prefix.map)
86+
var_name: route,ifnotexists
87+
var_scope: txn
88+
- metadata:
89+
hug: domain wildcard + path prefix or regex, exact domain + path regex
90+
type: set-var
91+
var_expr: var(txn.base_listener_route),map_reg(/tmp/hug/e2e-tests-gateway-tls-multiple/maps/hug_http_8080/path_regex.map)
92+
var_name: route,ifnotexists
93+
var_scope: txn
94+
- cond: if
95+
cond_test: route_is_json
96+
lua_action: route
97+
metadata:
98+
hug: lua routing
99+
type: lua
100+
metadata:
101+
hug:
102+
Gateway:
103+
e2e-tests-gateway-tls-multiple/gateway:
104+
Generation: 1
105+
LinkID: hug
106+
mode: http
107+
name: hug_http_8080

0 commit comments

Comments
 (0)