Skip to content

Commit 3183c69

Browse files
committed
REORG/MAJOR: Extract k8s dependency from controller struct
1 parent d0c17ef commit 3183c69

File tree

7 files changed

+661
-602
lines changed

7 files changed

+661
-602
lines changed

main.go

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,20 @@ import (
1919
"fmt"
2020
"os"
2121
"os/signal"
22+
"strings"
2223
"syscall"
2324

2425
//nolint:gosec
2526
_ "net/http/pprof"
2627

28+
"k8s.io/apimachinery/pkg/watch"
29+
2730
"github.com/jessevdk/go-flags"
2831

29-
c "github.com/haproxytech/kubernetes-ingress/pkg/controller"
32+
"github.com/haproxytech/kubernetes-ingress/pkg/controller"
3033
"github.com/haproxytech/kubernetes-ingress/pkg/controller/annotations"
34+
"github.com/haproxytech/kubernetes-ingress/pkg/ingress"
35+
"github.com/haproxytech/kubernetes-ingress/pkg/k8s"
3136
"github.com/haproxytech/kubernetes-ingress/pkg/store"
3237
"github.com/haproxytech/kubernetes-ingress/pkg/utils"
3338
)
@@ -72,21 +77,43 @@ func main() {
7277
annotations.SetDefaultValue("ssl-certificate", defaultCertificate)
7378

7479
// Start Controller
75-
s := store.NewK8sStore(osArgs)
76-
for _, namespace := range osArgs.NamespaceWhitelist {
77-
s.NamespacesAccess.Whitelist[namespace] = struct{}{}
80+
var chanSize int64 = int64(watch.DefaultChanSize * 6)
81+
if osArgs.ChannelSize > 0 {
82+
chanSize = osArgs.ChannelSize
7883
}
79-
for _, namespace := range osArgs.NamespaceBlacklist {
80-
s.NamespacesAccess.Blacklist[namespace] = struct{}{}
84+
eventChan := make(chan k8s.SyncDataEvent, chanSize)
85+
ingressChan := make(chan ingress.Sync, chanSize)
86+
stop := make(chan struct{})
87+
88+
publishService := getNamespaceValue(osArgs.PublishService)
89+
90+
s := store.NewK8sStore(osArgs)
91+
92+
c := controller.NewBuilder().
93+
WithEventChan(eventChan).
94+
WithIngressChan(ingressChan).
95+
WithStore(s).
96+
WithPublishService(publishService).
97+
WithArgs(osArgs).Build()
98+
99+
k := k8s.New(
100+
osArgs,
101+
s.NamespacesAccess.Whitelist,
102+
publishService,
103+
)
104+
105+
go k.MonitorChanges(eventChan, ingressChan, stop)
106+
go c.Start(haproxyConf)
107+
if publishService != nil {
108+
go ingress.UpdateStatus(k.GetClientset(), s, osArgs.IngressClass, osArgs.EmptyIngressClass, ingressChan)
81109
}
82-
controller := c.NewBuilder().WithStore(s).WithArgs(osArgs).Build()
83-
controller.Start(haproxyConf)
84110

85111
// Catch QUIT signals
86112
signalC := make(chan os.Signal, 1)
87113
signal.Notify(signalC, os.Interrupt, syscall.SIGTERM, syscall.SIGUSR1)
88114
<-signalC
89-
controller.Stop()
115+
c.Stop()
116+
close(stop)
90117
}
91118

92119
func logInfo(logger utils.Logger, osArgs utils.OSArgs) {
@@ -146,3 +173,15 @@ func logInfo(logger utils.Logger, osArgs utils.OSArgs) {
146173
logger.Error(err)
147174
logger.Printf("Running on %s", hostname)
148175
}
176+
177+
func getNamespaceValue(name string) *utils.NamespaceValue {
178+
parts := strings.Split(name, "/")
179+
var result *utils.NamespaceValue
180+
if len(parts) == 2 {
181+
result = &utils.NamespaceValue{
182+
Namespace: parts[0],
183+
Name: parts[1],
184+
}
185+
}
186+
return result
187+
}

pkg/controller/builder.go

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,19 @@ import (
1010
"github.com/prometheus/client_golang/prometheus/promhttp"
1111

1212
config "github.com/haproxytech/kubernetes-ingress/pkg/configuration"
13+
"github.com/haproxytech/kubernetes-ingress/pkg/ingress"
14+
"github.com/haproxytech/kubernetes-ingress/pkg/k8s"
1315
"github.com/haproxytech/kubernetes-ingress/pkg/store"
1416
"github.com/haproxytech/kubernetes-ingress/pkg/utils"
1517
)
1618

1719
type Builder struct {
18-
osArgs utils.OSArgs
19-
cfg config.ControllerCfg
20-
store store.K8s
20+
osArgs utils.OSArgs
21+
cfg config.ControllerCfg
22+
store store.K8s
23+
publishService *utils.NamespaceValue
24+
eventChan chan k8s.SyncDataEvent
25+
ingressChan chan ingress.Sync
2126
}
2227

2328
var defaultCfg = config.ControllerCfg{
@@ -36,6 +41,16 @@ func NewBuilder() *Builder {
3641
}
3742
}
3843

44+
func (builder *Builder) WithEventChan(eventChan chan k8s.SyncDataEvent) *Builder {
45+
builder.eventChan = eventChan
46+
return builder
47+
}
48+
49+
func (builder *Builder) WithIngressChan(ingressChan chan ingress.Sync) *Builder {
50+
builder.ingressChan = ingressChan
51+
return builder
52+
}
53+
3954
func (builder *Builder) WithStore(store store.K8s) *Builder {
4055
builder.store = store
4156
return builder
@@ -51,6 +66,11 @@ func (builder *Builder) WithArgs(osArgs utils.OSArgs) *Builder {
5166
return builder
5267
}
5368

69+
func (builder *Builder) WithPublishService(publishService *utils.NamespaceValue) *Builder {
70+
builder.publishService = publishService
71+
return builder
72+
}
73+
5474
func (builder *Builder) Build() *HAProxyController {
5575
if builder.osArgs.External {
5676
builder.cfg = setupExternalMode(builder.osArgs)
@@ -72,13 +92,15 @@ func (builder *Builder) Build() *HAProxyController {
7292

7393
prefix, errPrefix := utils.GetPodPrefix(os.Getenv("POD_NAME"))
7494
logger.Error(errPrefix)
75-
7695
return &HAProxyController{
77-
cfg: builder.cfg,
78-
osArgs: builder.osArgs,
79-
podNamespace: os.Getenv("POD_NAMESPACE"),
80-
podPrefix: prefix,
81-
store: builder.store,
96+
cfg: builder.cfg,
97+
osArgs: builder.osArgs,
98+
podNamespace: os.Getenv("POD_NAMESPACE"),
99+
podPrefix: prefix,
100+
store: builder.store,
101+
eventChan: builder.eventChan,
102+
ingressChan: builder.ingressChan,
103+
publishService: builder.publishService,
82104
}
83105
}
84106

pkg/controller/controller.go

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ package controller
1616

1717
import (
1818
"os"
19-
"path/filepath"
20-
"strings"
21-
22-
"k8s.io/client-go/rest"
23-
"k8s.io/client-go/tools/clientcmd"
2419

2520
"github.com/google/renameio"
2621

@@ -33,7 +28,6 @@ import (
3328
"github.com/haproxytech/kubernetes-ingress/pkg/k8s"
3429
"github.com/haproxytech/kubernetes-ingress/pkg/store"
3530
"github.com/haproxytech/kubernetes-ingress/pkg/utils"
36-
"k8s.io/apimachinery/pkg/watch"
3731
)
3832

3933
var logger = utils.GetLogger()
@@ -48,7 +42,6 @@ type HAProxyController struct {
4842
auxCfgModTime int64
4943
eventChan chan k8s.SyncDataEvent
5044
ingressChan chan ingress.Sync
51-
k8s k8s.K8s
5245
ready bool
5346
reload bool
5447
restart bool
@@ -101,49 +94,7 @@ func (c *HAProxyController) Start(haproxyConf []byte) {
10194
c.initHandlers()
10295
c.haproxyStartup()
10396

104-
// Controller PublishService
105-
parts := strings.Split(c.osArgs.PublishService, "/")
106-
if len(parts) == 2 {
107-
c.publishService = &utils.NamespaceValue{
108-
Namespace: parts[0],
109-
Name: parts[1],
110-
}
111-
}
112-
113-
// Get K8s client
114-
var restConfig *rest.Config
115-
if c.osArgs.External {
116-
kubeconfig := filepath.Join(utils.HomeDir(), ".kube", "config")
117-
if c.osArgs.KubeConfig != "" {
118-
kubeconfig = c.osArgs.KubeConfig
119-
}
120-
restConfig, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
121-
} else {
122-
restConfig, err = rest.InClusterConfig()
123-
}
124-
logger.Panicf("Unable to get kubernetes client config: %s", err)
125-
126-
c.k8s = k8s.New(restConfig, c.osArgs, c.eventChan)
127-
x := c.k8s.GetClient().Discovery()
128-
if k8sVersion, err := x.ServerVersion(); err != nil {
129-
logger.Panicf("Unable to get Kubernetes version: %v\n", err)
130-
} else {
131-
logger.Printf("Running on Kubernetes version: %s %s", k8sVersion.String(), k8sVersion.Platform)
132-
}
133-
134-
// Monitor k8s events
135-
var chanSize int64 = int64(watch.DefaultChanSize * 6)
136-
if c.osArgs.ChannelSize > 0 {
137-
chanSize = c.osArgs.ChannelSize
138-
}
139-
logger.Infof("Channel size: %d", chanSize)
140-
c.eventChan = make(chan k8s.SyncDataEvent, chanSize)
141-
go c.monitorChanges()
142-
if c.publishService != nil {
143-
// Update Ingress status
144-
c.ingressChan = make(chan ingress.Sync, chanSize)
145-
go ingress.UpdateStatus(c.k8s.GetClient(), c.store, c.osArgs.IngressClass, c.osArgs.EmptyIngressClass, c.ingressChan)
146-
}
97+
c.SyncData()
14798
}
14899

149100
// Stop handles shutting down HAProxyController

0 commit comments

Comments
 (0)