Skip to content

Commit 307235b

Browse files
committed
REORG/MINOR: split ErrorFiles handler in smaller functions
1 parent 3c56527 commit 307235b

File tree

4 files changed

+51
-72
lines changed

4 files changed

+51
-72
lines changed

controller/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (c *HAProxyController) initHandlers() {
4141
Port: c.OSArgs.HTTPSBindPort,
4242
},
4343
handler.ProxyProtocol{},
44-
&handler.ErrorFile{},
44+
&handler.ErrorFiles{},
4545
handler.TCPServices{
4646
CertDir: c.Cfg.Env.FrontendCertDir,
4747
IPv4: !c.OSArgs.DisableIPV4,

controller/handler/errorfile.go renamed to controller/handler/errorfiles.go

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -26,42 +26,53 @@ import (
2626
"github.com/haproxytech/kubernetes-ingress/controller/store"
2727
)
2828

29-
type ErrorFile struct {
30-
files files
31-
updateAPI bool
29+
type ErrorFiles struct {
30+
files files
3231
}
3332

34-
func (h *ErrorFile) Update(k store.K8s, cfg *config.ControllerCfg, api api.HAProxyClient) (reload bool, err error) {
33+
func (h *ErrorFiles) Update(k store.K8s, cfg *config.ControllerCfg, api api.HAProxyClient) (reload bool, err error) {
3534
h.files.dir = cfg.Env.ErrFileDir
3635
if k.ConfigMaps.Errorfiles == nil {
3736
return false, nil
3837
}
38+
// Update Files
39+
for code, content := range k.ConfigMaps.Errorfiles.Annotations {
40+
logger.Error(h.writeFile(code, content))
41+
}
42+
var apiInput []*models.Errorfile
43+
apiInput, reload = h.refresh()
44+
// Update API
45+
defaults, err := api.DefaultsGetConfiguration()
46+
if err != nil {
47+
return false, err
48+
}
49+
defaults.ErrorFiles = apiInput
50+
if err = api.DefaultsPushConfiguration(*defaults); err != nil {
51+
return false, err
52+
}
53+
return reload, nil
54+
}
3955

40-
for code, v := range k.ConfigMaps.Errorfiles.Annotations {
41-
_, ok := h.files.data[code]
42-
if ok {
43-
err = h.files.updateFile(code, v)
44-
if err != nil {
45-
logger.Errorf("failed updating errorfile for code '%s': %s", code, err)
46-
}
47-
continue
48-
}
56+
func (h *ErrorFiles) writeFile(code, content string) (err error) {
57+
// Update file
58+
if _, ok := h.files.data[code]; !ok {
4959
err = checkCode(code)
5060
if err != nil {
51-
logger.Errorf("failed creating errorfile for code '%s': %s", code, err)
61+
return
5262
}
53-
err = h.files.newFile(code, v)
54-
if err != nil {
55-
logger.Errorf("failed creating errorfile for code '%s': %s", code, err)
56-
}
57-
h.updateAPI = true
5863
}
64+
err = h.files.writeFile(code, content)
65+
if err != nil {
66+
err = fmt.Errorf("failed writing errorfile for code '%s': %w", code, err)
67+
}
68+
return
69+
}
5970

60-
var apiInput = []*models.Errorfile{}
71+
func (h *ErrorFiles) refresh() (result []*models.Errorfile, reload bool) {
6172
for code, f := range h.files.data {
6273
if !f.inUse {
63-
h.updateAPI = true
64-
err = h.files.deleteFile(code)
74+
reload = true
75+
err := h.files.deleteFile(code)
6576
if err != nil {
6677
logger.Errorf("failed deleting errorfile for code '%s': %s", code, err)
6778
}
@@ -72,28 +83,14 @@ func (h *ErrorFile) Update(k store.K8s, cfg *config.ControllerCfg, api api.HAPro
7283
reload = true
7384
}
7485
c, _ := strconv.Atoi(code) // code already checked in newCode
75-
apiInput = append(apiInput, &models.Errorfile{
86+
result = append(result, &models.Errorfile{
7687
Code: int64(c),
7788
File: filepath.Join(h.files.dir, code),
7889
})
7990
f.inUse = false
8091
f.updated = false
8192
}
82-
// HAProxy config update
83-
if h.updateAPI {
84-
defaults, err := api.DefaultsGetConfiguration()
85-
if err != nil {
86-
logger.Error(err)
87-
return reload, err
88-
}
89-
defaults.ErrorFiles = apiInput
90-
if err = api.DefaultsPushConfiguration(*defaults); err != nil {
91-
logger.Error(err)
92-
return reload, err
93-
}
94-
h.updateAPI = false
95-
}
96-
return reload, nil
93+
return
9794
}
9895

9996
func checkCode(code string) error {

controller/handler/pattern-files.go

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,22 @@ func (h *PatternFiles) Update(k store.K8s, cfg *config.ControllerCfg, api api.HA
3636
return false, nil
3737
}
3838
for name, v := range k.ConfigMaps.PatternFiles.Annotations {
39-
_, ok := h.files.data[name]
40-
if ok {
41-
err = h.files.updateFile(name, v)
42-
if err != nil {
43-
logger.Errorf("failed updating patternFile '%s': %s", name, err)
44-
}
45-
} else {
46-
err = h.files.newFile(name, v)
47-
if err != nil {
48-
logger.Errorf("failed creating patternFile '%s': %s", name, err)
49-
}
39+
err = h.files.writeFile(name, v)
40+
if err != nil {
41+
logger.Errorf("failed writing patternfile '%s': %s", name, err)
5042
}
5143
}
5244

5345
for name, f := range h.files.data {
5446
if !f.inUse {
5547
err = h.files.deleteFile(name)
5648
if err != nil {
57-
logger.Errorf("failed deleting PatternFile '%s': %s", name, err)
49+
logger.Errorf("failed deleting atternfile '%s': %s", name, err)
5850
}
5951
continue
6052
}
6153
if f.updated {
62-
logger.Debugf("updating PatternFile '%s': reload required", name)
54+
logger.Debugf("patternfile '%s' updated: reload required", name)
6355
reload = true
6456
}
6557
f.inUse = false
@@ -79,39 +71,29 @@ type file struct {
7971
updated bool
8072
}
8173

82-
func (f *files) deleteFile(code string) error {
83-
delete(f.data, code)
84-
err := os.Remove(filepath.Join(f.dir, code))
74+
func (f *files) deleteFile(name string) error {
75+
delete(f.data, name)
76+
err := os.Remove(filepath.Join(f.dir, name))
8577
return err
8678
}
8779

88-
func (f *files) newFile(code, value string) error {
89-
if err := renameio.WriteFile(filepath.Join(f.dir, code), []byte(value), os.ModePerm); err != nil {
90-
return err
91-
}
80+
// writeFile checks if content hash has changed before writing it.
81+
func (f *files) writeFile(name, content string) error {
82+
newHash := utils.Hash([]byte(content))
9283
if f.data == nil {
9384
f.data = map[string]*file{}
9485
}
95-
f.data[code] = &file{
96-
hash: utils.Hash([]byte(value)),
97-
inUse: true,
98-
updated: true,
86+
if f.data[name] == nil {
87+
f.data[name] = &file{}
9988
}
100-
return nil
101-
}
102-
103-
func (f *files) updateFile(name, value string) error {
104-
newHash := utils.Hash([]byte(value))
10589
file := f.data[name]
10690
if file.hash != newHash {
107-
err := renameio.WriteFile(filepath.Join(f.dir, name), []byte(value), os.ModePerm)
108-
if err != nil {
91+
if err := renameio.WriteFile(filepath.Join(f.dir, name), []byte(content), os.ModePerm); err != nil {
10992
return err
11093
}
11194
file.hash = newHash
11295
file.updated = true
11396
}
11497
file.inUse = true
115-
f.data[name] = file
11698
return nil
11799
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func main() {
115115
logger.Printf("TCP Services provided in '%s'", osArgs.ConfigMapTCPServices)
116116
}
117117
if osArgs.ConfigMapErrorFiles.Name != "" {
118-
logger.Printf("Errofile pages provided in '%s'", osArgs.ConfigMapErrorFiles)
118+
logger.Printf("Errorfiles provided in '%s'", osArgs.ConfigMapErrorFiles)
119119
}
120120
if osArgs.ConfigMapPatternFiles.Name != "" {
121121
logger.Printf("Pattern files provided in '%s'", osArgs.ConfigMapPatternFiles)

0 commit comments

Comments
 (0)