Skip to content
This repository was archived by the owner on Apr 17, 2025. It is now read-only.

Commit 550d0c8

Browse files
authored
Merge pull request #129 from adrianludwin/new-main
Refactor main() into smaller bits
2 parents 082779a + 33caf3d commit 550d0c8

File tree

1 file changed

+48
-22
lines changed

1 file changed

+48
-22
lines changed

cmd/manager/main.go

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ var (
7070
includedNamespacesRegex string
7171
)
7272

73+
// init preloads some global vars before main() starts. Since this is the top-level module, I'm not
74+
// sure what happens _between_ init() and main() but this is the way kubebuilder left things so I'm
75+
// going to leave it alone.
7376
func init() {
7477
setupLog.Info("Starting main.go:init()")
7578
defer setupLog.Info("Finished main.go:init()")
@@ -82,6 +85,32 @@ func init() {
8285
}
8386

8487
func main() {
88+
parseFlags()
89+
metricsCleanupFn := enableMetrics()
90+
defer metricsCleanupFn()
91+
mgr := createManager()
92+
93+
// Make sure certs are generated and valid if webhooks are enabled and internal certs are used.
94+
setupLog.Info("Starting certificate generation")
95+
certsReady, err := setup.CreateCertsIfNeeded(mgr, novalidation, internalCert, restartOnSecretRefresh)
96+
if err != nil {
97+
setupLog.Error(err, "unable to set up cert rotation")
98+
os.Exit(1)
99+
}
100+
101+
// The call to mgr.Start will never return, but the certs won't be ready until the manager starts
102+
// and we can't set up the webhooks without them. So start a goroutine which will wait until the
103+
// certs are ready, and then create the rest of the HNC controllers.
104+
go startControllers(mgr, certsReady)
105+
106+
setupLog.Info("Starting manager")
107+
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
108+
setupLog.Error(err, "problem running manager")
109+
os.Exit(1)
110+
}
111+
}
112+
113+
func parseFlags() {
85114
setupLog.Info("Parsing flags")
86115
flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
87116
flag.BoolVar(&enableStackdriver, "enable-stackdriver", true, "If true, export metrics to stackdriver")
@@ -112,6 +141,12 @@ func main() {
112141
setupLog.Error(err, "Illegal flag values")
113142
os.Exit(1)
114143
}
144+
}
145+
146+
// enableMetrics returns a function to call from main() to export any remaining metrics when main()
147+
// is exiting.
148+
func enableMetrics() func() {
149+
var cleanupFn func()
115150

116151
// Enable OpenCensus exporters to export metrics
117152
// to Stackdriver Monitoring.
@@ -126,11 +161,13 @@ func main() {
126161
ReportingInterval: stats.ReportingInterval,
127162
})
128163
if err == nil {
129-
// Flush must be called before main() exits to ensure metrics are recorded.
130-
defer sd.Flush()
131164
err = sd.StartMetricsExporter()
132165
if err == nil {
133-
defer sd.StopMetricsExporter()
166+
cleanupFn = func() {
167+
// Flush must be called before main() exits to ensure metrics are recorded.
168+
sd.Flush()
169+
sd.StopMetricsExporter()
170+
}
134171
}
135172
}
136173
if err != nil {
@@ -151,6 +188,10 @@ func main() {
151188
setupLog.Error(err, "Could not create Prometheus exporter")
152189
}
153190

191+
return cleanupFn
192+
}
193+
194+
func createManager() ctrl.Manager {
154195
setupLog.Info("Configuring controller-manager")
155196
logLevel := zapcore.InfoLevel
156197
if debugLogs {
@@ -183,32 +224,17 @@ func main() {
183224
Port: webhookServerPort,
184225
})
185226
if err != nil {
186-
setupLog.Error(err, "unable to start manager")
187-
os.Exit(1)
188-
}
189-
190-
// Make sure certs are generated and valid if webhooks are enabled and internal certs are used.
191-
setupLog.Info("Starting certificate generation")
192-
certsCreated, err := setup.CreateCertsIfNeeded(mgr, novalidation, internalCert, restartOnSecretRefresh)
193-
if err != nil {
194-
setupLog.Error(err, "unable to set up cert rotation")
195-
os.Exit(1)
196-
}
197-
198-
go startControllers(mgr, certsCreated)
199-
200-
setupLog.Info("Starting manager")
201-
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
202-
setupLog.Error(err, "problem running manager")
227+
setupLog.Error(err, "unable to create manager")
203228
os.Exit(1)
204229
}
230+
return mgr
205231
}
206232

207-
func startControllers(mgr ctrl.Manager, certsCreated chan struct{}) {
233+
func startControllers(mgr ctrl.Manager, certsReady chan struct{}) {
208234
// The controllers won't work until the webhooks are operating, and those won't work until the
209235
// certs are all in place.
210236
setupLog.Info("Waiting for certificate generation to complete")
211-
<-certsCreated
237+
<-certsReady
212238

213239
if testLog {
214240
stats.StartLoggingActivity()

0 commit comments

Comments
 (0)