70
70
includedNamespacesRegex string
71
71
)
72
72
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.
73
76
func init () {
74
77
setupLog .Info ("Starting main.go:init()" )
75
78
defer setupLog .Info ("Finished main.go:init()" )
@@ -82,6 +85,32 @@ func init() {
82
85
}
83
86
84
87
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 () {
85
114
setupLog .Info ("Parsing flags" )
86
115
flag .StringVar (& metricsAddr , "metrics-addr" , ":8080" , "The address the metric endpoint binds to." )
87
116
flag .BoolVar (& enableStackdriver , "enable-stackdriver" , true , "If true, export metrics to stackdriver" )
@@ -112,6 +141,12 @@ func main() {
112
141
setupLog .Error (err , "Illegal flag values" )
113
142
os .Exit (1 )
114
143
}
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 ()
115
150
116
151
// Enable OpenCensus exporters to export metrics
117
152
// to Stackdriver Monitoring.
@@ -126,11 +161,13 @@ func main() {
126
161
ReportingInterval : stats .ReportingInterval ,
127
162
})
128
163
if err == nil {
129
- // Flush must be called before main() exits to ensure metrics are recorded.
130
- defer sd .Flush ()
131
164
err = sd .StartMetricsExporter ()
132
165
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
+ }
134
171
}
135
172
}
136
173
if err != nil {
@@ -151,6 +188,10 @@ func main() {
151
188
setupLog .Error (err , "Could not create Prometheus exporter" )
152
189
}
153
190
191
+ return cleanupFn
192
+ }
193
+
194
+ func createManager () ctrl.Manager {
154
195
setupLog .Info ("Configuring controller-manager" )
155
196
logLevel := zapcore .InfoLevel
156
197
if debugLogs {
@@ -183,32 +224,17 @@ func main() {
183
224
Port : webhookServerPort ,
184
225
})
185
226
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" )
203
228
os .Exit (1 )
204
229
}
230
+ return mgr
205
231
}
206
232
207
- func startControllers (mgr ctrl.Manager , certsCreated chan struct {}) {
233
+ func startControllers (mgr ctrl.Manager , certsReady chan struct {}) {
208
234
// The controllers won't work until the webhooks are operating, and those won't work until the
209
235
// certs are all in place.
210
236
setupLog .Info ("Waiting for certificate generation to complete" )
211
- <- certsCreated
237
+ <- certsReady
212
238
213
239
if testLog {
214
240
stats .StartLoggingActivity ()
0 commit comments