1515package controller
1616
1717import (
18+ "fmt"
19+
1820 "github.com/go-test/deep"
1921
2022 "github.com/haproxytech/client-native/v3/models"
@@ -24,6 +26,7 @@ import (
2426 "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/certs"
2527 "github.com/haproxytech/kubernetes-ingress/pkg/haproxy/env"
2628 "github.com/haproxytech/kubernetes-ingress/pkg/ingress"
29+ "github.com/haproxytech/kubernetes-ingress/pkg/k8s"
2730 "github.com/haproxytech/kubernetes-ingress/pkg/service"
2831 "github.com/haproxytech/kubernetes-ingress/pkg/store"
2932)
@@ -32,7 +35,11 @@ func (c *HAProxyController) handleGlobalConfig() (reload, restart bool) {
3235 reload , restart = c .globalCfg ()
3336 reload = c .defaultsCfg () || reload
3437 c .handleDefaultCert ()
35- reload = c .handleDefaultService () || reload
38+ if c .osArgs .DefaultBackendService .String () == "" {
39+ reload = c .handleDefaultLocalService () || reload
40+ } else {
41+ reload = c .handleDefaultService () || reload
42+ }
3643 ingress .HandleCfgMapAnnotations (c .store , c .haproxy , c .annotations )
3744 return reload , restart
3845}
@@ -154,7 +161,7 @@ func (c *HAProxyController) handleDefaultService() (reload bool) {
154161 logger .Errorf ("default service: %s" , err )
155162 }
156163 if name == "" {
157- return c . handleDefaultServicePort ()
164+ return
158165 }
159166 ingressPath := & store.IngressPath {
160167 SvcNamespace : namespace ,
@@ -170,43 +177,73 @@ func (c *HAProxyController) handleDefaultService() (reload bool) {
170177 return reload
171178}
172179
173- // handleDefaultServicePort configures local HAProy default backend provided via cli param "default-backend-port"
174- func (c * HAProxyController ) handleDefaultServicePort () (reload bool ) {
175- var svc * service.Service
176- _ , portStr , err := common .GetK8sPath ("default-backend-port" , c .store .ConfigMaps .Main .Annotations )
177- if err != nil {
178- logger .Errorf ("default backend port: %s" , err )
180+ func populateDefaultLocalBackendResources (k8sStore store.K8s , eventChan chan k8s.SyncDataEvent , podNs string , defaultBackendPort int ) error {
181+ controllerNs , ok := k8sStore .Namespaces [podNs ]
182+ if ! ok {
183+ return fmt .Errorf ("controller namespace '%s' not found" , podNs )
184+ }
185+
186+ defaultLocalService := controllerNs .Services [store .DefaultLocalBackend ]
187+ if defaultLocalService == nil {
188+ item := & store.Service {
189+ Namespace : podNs ,
190+ Name : store .DefaultLocalBackend ,
191+ Status : store .ADDED ,
192+ Annotations : k8sStore .ConfigMaps .Main .Annotations ,
193+ Ports : []store.ServicePort {
194+ {
195+ Name : "http" ,
196+ Protocol : "http" ,
197+ Port : 8765 ,
198+ Status : store .ADDED ,
199+ },
200+ },
201+ }
202+ eventChan <- k8s.SyncDataEvent {SyncType : k8s .SERVICE , Namespace : item .Namespace , Data : item }
203+
204+ endpoints := & store.Endpoints {
205+ Namespace : podNs ,
206+ Service : store .DefaultLocalBackend ,
207+ SliceName : store .DefaultLocalBackend ,
208+ Status : store .ADDED ,
209+ Ports : map [string ]* store.PortEndpoints {
210+ "http" : {
211+ Port : int64 (defaultBackendPort ),
212+ Addresses : map [string ]struct {}{"127.0.0.1" : {}},
213+ },
214+ },
215+ }
216+ eventChan <- k8s.SyncDataEvent {SyncType : k8s .ENDPOINTS , Namespace : endpoints .Namespace , Data : endpoints }
217+ } else {
218+ defaultLocalService .Annotations = k8sStore .ConfigMaps .Main .Annotations
179219 }
180- if portStr == "" {
220+ return nil
221+ }
222+
223+ func (c * HAProxyController ) handleDefaultLocalService () (reload bool ) {
224+ var (
225+ err error
226+ svc * service.Service
227+ )
228+ err = populateDefaultLocalBackendResources (c .store , c .eventChan , c .podNamespace , c .osArgs .DefaultBackendPort )
229+ if err != nil {
230+ logger .Error (err )
181231 return
182232 }
183233
184234 ingressPath := & store.IngressPath {
185- SvcNamespace : "" ,
235+ SvcNamespace : c . podNamespace ,
186236 SvcName : store .DefaultLocalBackend ,
187- SvcPortString : portStr ,
188237 IsDefaultBackend : true ,
189238 }
190239
191- backend , _ := c .haproxy .BackendGet (store .DefaultLocalBackend )
192- if backend != nil {
193- return
194- }
195- err = c .haproxy .BackendCreate (models.Backend {
196- Name : store .DefaultLocalBackend ,
197- })
198- if err != nil {
199- logger .Errorf ("default backend port: %s" , err )
200- }
201- backend , _ = c .haproxy .BackendGet (store .DefaultLocalBackend )
202-
203- if svc , err = service .NewLocal (c .store , ingressPath , backend , c .store .ConfigMaps .Main .Annotations ); err == nil {
240+ if svc , err = service .New (c .store , ingressPath , nil , false ); err == nil {
204241 reload , err = svc .SetDefaultBackend (c .store , c .haproxy , []string {c .haproxy .FrontHTTP , c .haproxy .FrontHTTPS }, c .annotations )
205242 }
206243 if err != nil {
207- logger .Errorf ("default service port : %s" , err )
244+ logger .Errorf ("default service: %s" , err )
208245 }
209- return reload
246+ return
210247}
211248
212249// handleDefaultCert configures default/fallback HAProxy certificate to use for client HTTPS requests.
0 commit comments