15
15
package controller
16
16
17
17
import (
18
+ "os"
18
19
"path/filepath"
19
20
"strings"
20
21
22
+ "github.com/google/renameio"
23
+
21
24
"github.com/haproxytech/client-native/v2/models"
22
25
config "github.com/haproxytech/kubernetes-ingress/pkg/configuration"
23
26
"github.com/haproxytech/kubernetes-ingress/pkg/controller/route"
@@ -35,13 +38,13 @@ var logger = utils.GetLogger()
35
38
36
39
// HAProxyController is ingress controller
37
40
type HAProxyController struct {
38
- Cfg config.ControllerCfg
41
+ cfg config.ControllerCfg
39
42
crManager cr.CRManager
40
- Client api.HAProxyClient
41
- OSArgs utils.OSArgs
42
- Store store.K8s
43
- PublishService * utils.NamespaceValue
44
- AuxCfgModTime int64
43
+ client api.HAProxyClient
44
+ osArgs utils.OSArgs
45
+ store store.K8s
46
+ publishService * utils.NamespaceValue
47
+ auxCfgModTime int64
45
48
eventChan chan k8s.SyncDataEvent
46
49
ingressChan chan ingress.Sync
47
50
k8s * k8s.K8s
@@ -50,41 +53,46 @@ type HAProxyController struct {
50
53
restart bool
51
54
updateHandlers []UpdateHandler
52
55
haproxyProcess process.Process
53
- PodNamespace string
54
- PodPrefix string
56
+ podNamespace string
57
+ podPrefix string
55
58
}
56
59
57
60
// Wrapping a Native-Client transaction and commit it.
58
61
// Returning an error to let panic or log it upon the scenario.
59
62
func (c * HAProxyController ) clientAPIClosure (fn func () error ) (err error ) {
60
- if err = c .Client .APIStartTransaction (); err != nil {
63
+ if err = c .client .APIStartTransaction (); err != nil {
61
64
return err
62
65
}
63
66
defer func () {
64
- c .Client .APIDisposeTransaction ()
67
+ c .client .APIDisposeTransaction ()
65
68
}()
66
69
if err = fn (); err != nil {
67
70
return err
68
71
}
69
72
70
- if err = c .Client .APICommitTransaction (); err != nil {
73
+ if err = c .client .APICommitTransaction (); err != nil {
71
74
return err
72
75
}
73
76
return nil
74
77
}
75
78
76
79
// Start initializes and runs HAProxyController
77
- func (c * HAProxyController ) Start () {
80
+ func (c * HAProxyController ) Start (haproxyConf [] byte ) {
78
81
var err error
79
- logger .SetLevel (c .OSArgs .LogLevel .LogLevel )
82
+ logger .SetLevel (c .osArgs .LogLevel .LogLevel )
83
+ err = renameio .WriteFile (c .cfg .Env .MainCFGFile , haproxyConf , 0755 )
84
+ if err != nil {
85
+ logger .Panic (err )
86
+ }
87
+ logger .Error (os .Chdir (c .cfg .Env .CfgDir ))
80
88
81
89
// Initialize controller
82
- err = c .Cfg .Init ()
90
+ err = c .cfg .Init ()
83
91
if err != nil {
84
92
logger .Panic (err )
85
93
}
86
94
87
- c .Client , err = api .Init (c .Cfg .Env .CfgDir , c .Cfg .Env .MainCFGFile , c .Cfg .Env .HAProxyBinary , c .Cfg .Env .RuntimeSocket )
95
+ c .client , err = api .Init (c .cfg .Env .CfgDir , c .cfg .Env .MainCFGFile , c .cfg .Env .HAProxyBinary , c .cfg .Env .RuntimeSocket )
88
96
if err != nil {
89
97
logger .Panic (err )
90
98
}
@@ -93,22 +101,22 @@ func (c *HAProxyController) Start() {
93
101
c .haproxyStartup ()
94
102
95
103
// Controller PublishService
96
- parts := strings .Split (c .OSArgs .PublishService , "/" )
104
+ parts := strings .Split (c .osArgs .PublishService , "/" )
97
105
if len (parts ) == 2 {
98
- c .PublishService = & utils.NamespaceValue {
106
+ c .publishService = & utils.NamespaceValue {
99
107
Namespace : parts [0 ],
100
108
Name : parts [1 ],
101
109
}
102
110
}
103
111
104
112
// Get K8s client
105
- c .k8s , err = k8s .GetKubernetesClient (c .OSArgs .DisableServiceExternalName )
106
- if c .OSArgs .External {
113
+ c .k8s , err = k8s .GetKubernetesClient (c .osArgs .DisableServiceExternalName )
114
+ if c .osArgs .External {
107
115
kubeconfig := filepath .Join (utils .HomeDir (), ".kube" , "config" )
108
- if c .OSArgs .KubeConfig != "" {
109
- kubeconfig = c .OSArgs .KubeConfig
116
+ if c .osArgs .KubeConfig != "" {
117
+ kubeconfig = c .osArgs .KubeConfig
110
118
}
111
- c .k8s , err = k8s .GetRemoteKubernetesClient (kubeconfig , c .OSArgs .DisableServiceExternalName )
119
+ c .k8s , err = k8s .GetRemoteKubernetesClient (kubeconfig , c .osArgs .DisableServiceExternalName )
112
120
}
113
121
if err != nil {
114
122
logger .Panic (err )
@@ -122,16 +130,16 @@ func (c *HAProxyController) Start() {
122
130
123
131
// Monitor k8s events
124
132
var chanSize int64 = int64 (watch .DefaultChanSize * 6 )
125
- if c .OSArgs .ChannelSize > 0 {
126
- chanSize = c .OSArgs .ChannelSize
133
+ if c .osArgs .ChannelSize > 0 {
134
+ chanSize = c .osArgs .ChannelSize
127
135
}
128
136
logger .Infof ("Channel size: %d" , chanSize )
129
137
c .eventChan = make (chan k8s.SyncDataEvent , chanSize )
130
138
go c .monitorChanges ()
131
- if c .PublishService != nil {
139
+ if c .publishService != nil {
132
140
// Update Ingress status
133
141
c .ingressChan = make (chan ingress.Sync , chanSize )
134
- go ingress .UpdateStatus (c .k8s .API , c .Store , c .OSArgs .IngressClass , c .OSArgs .EmptyIngressClass , c .ingressChan )
142
+ go ingress .UpdateStatus (c .k8s .API , c .store , c .osArgs .IngressClass , c .osArgs .EmptyIngressClass , c .ingressChan )
135
143
}
136
144
}
137
145
@@ -147,51 +155,51 @@ func (c *HAProxyController) updateHAProxy() {
147
155
var err error
148
156
logger .Trace ("HAProxy config sync started" )
149
157
150
- err = c .Client .APIStartTransaction ()
158
+ err = c .client .APIStartTransaction ()
151
159
if err != nil {
152
160
logger .Error (err )
153
161
return
154
162
}
155
163
defer func () {
156
- c .Client .APIDisposeTransaction ()
164
+ c .client .APIDisposeTransaction ()
157
165
}()
158
166
159
167
reload , restart := c .handleGlobalConfig ()
160
168
c .reload = c .reload || reload
161
169
c .restart = c .restart || restart
162
170
163
171
if len (route .CustomRoutes ) != 0 {
164
- logger .Error (route .CustomRoutesReset (c .Client ))
172
+ logger .Error (route .CustomRoutesReset (c .client ))
165
173
}
166
174
167
- for _ , namespace := range c .Store .Namespaces {
175
+ for _ , namespace := range c .store .Namespaces {
168
176
if ! namespace .Relevant {
169
177
continue
170
178
}
171
179
for _ , ingResource := range namespace .Ingresses {
172
- i := ingress .New (c .Store , ingResource , c .OSArgs .IngressClass , c .OSArgs .EmptyIngressClass )
180
+ i := ingress .New (c .store , ingResource , c .osArgs .IngressClass , c .osArgs .EmptyIngressClass )
173
181
if i == nil {
174
182
logger .Debugf ("ingress '%s/%s' ignored: no matching IngressClass" , ingResource .Namespace , ingResource .Name )
175
183
continue
176
184
}
177
- if c .PublishService != nil && ingResource .Status == store .ADDED {
185
+ if c .publishService != nil && ingResource .Status == store .ADDED {
178
186
select {
179
187
case c .ingressChan <- ingress.Sync {Ingress : ingResource }:
180
188
default :
181
189
logger .Errorf ("Ingress %s/%s: unable to sync status: sync channel full" , ingResource .Namespace , ingResource .Name )
182
190
}
183
191
}
184
- c .reload = i .Update (c .Store , & c .Cfg , c .Client ) || c .reload
192
+ c .reload = i .Update (c .store , & c .cfg , c .client ) || c .reload
185
193
}
186
194
}
187
195
188
196
for _ , handler := range c .updateHandlers {
189
- reload , err = handler .Update (c .Store , & c .Cfg , c .Client )
197
+ reload , err = handler .Update (c .store , & c .cfg , c .client )
190
198
logger .Error (err )
191
199
c .reload = c .reload || reload
192
200
}
193
201
194
- err = c .Client .APICommitTransaction ()
202
+ err = c .client .APICommitTransaction ()
195
203
if err != nil {
196
204
logger .Error ("unable to Sync HAProxy configuration !!" )
197
205
logger .Error (err )
@@ -226,15 +234,15 @@ func (c *HAProxyController) updateHAProxy() {
226
234
// setToRready exposes readiness endpoint
227
235
func (c * HAProxyController ) setToReady () {
228
236
logger .Panic (c .clientAPIClosure (func () error {
229
- return c .Client .FrontendBindEdit ("healthz" ,
237
+ return c .client .FrontendBindEdit ("healthz" ,
230
238
models.Bind {
231
239
Name : "v4" ,
232
240
Address : "0.0.0.0:1042" ,
233
241
})
234
242
}))
235
- if ! c .OSArgs .DisableIPV6 {
243
+ if ! c .osArgs .DisableIPV6 {
236
244
logger .Panic (c .clientAPIClosure (func () error {
237
- return c .Client .FrontendBindCreate ("healthz" ,
245
+ return c .client .FrontendBindCreate ("healthz" ,
238
246
models.Bind {
239
247
Name : "v6" ,
240
248
Address : ":::1042" ,
@@ -243,7 +251,7 @@ func (c *HAProxyController) setToReady() {
243
251
}))
244
252
}
245
253
logger .Debugf ("healthz frontend exposed for readiness probe" )
246
- cm := c .Store .ConfigMaps .Main
254
+ cm := c .store .ConfigMaps .Main
247
255
if cm .Name != "" && ! cm .Loaded {
248
256
logger .Warningf ("Main configmap '%s/%s' not found" , cm .Namespace , cm .Name )
249
257
}
@@ -252,10 +260,10 @@ func (c *HAProxyController) setToReady() {
252
260
253
261
// clean controller state
254
262
func (c * HAProxyController ) clean (failedSync bool ) {
255
- logger .Error (c .Cfg .Clean ())
256
- c .Cfg .SSLPassthrough = false
263
+ logger .Error (c .cfg .Clean ())
264
+ c .cfg .SSLPassthrough = false
257
265
if ! failedSync {
258
- c .Store .Clean ()
266
+ c .store .Clean ()
259
267
}
260
268
c .reload = false
261
269
c .restart = false
0 commit comments