in cmd/hubagent/main.go [91:198]
func main() {
// The wait group for synchronizing the steps (esp. the exit) of the controller manager and the scheduler.
var wg sync.WaitGroup
opts := options.NewOptions()
opts.AddFlags(flag.CommandLine)
flag.Parse()
defer handleExitFunc()
flag.VisitAll(func(f *flag.Flag) {
klog.InfoS("flag:", "name", f.Name, "value", f.Value)
})
if errs := opts.Validate(); len(errs) != 0 {
klog.ErrorS(errs.ToAggregate(), "invalid parameter")
exitWithErrorFunc()
}
config := ctrl.GetConfigOrDie()
config.QPS, config.Burst = float32(opts.HubQPS), opts.HubBurst
mgr, err := ctrl.NewManager(config, ctrl.Options{
Scheme: scheme,
Cache: cache.Options{
SyncPeriod: &opts.ResyncPeriod.Duration,
},
LeaderElection: opts.LeaderElection.LeaderElect,
LeaderElectionID: opts.LeaderElection.ResourceName,
LeaderElectionNamespace: opts.LeaderElection.ResourceNamespace,
LeaderElectionResourceLock: opts.LeaderElection.ResourceLock,
HealthProbeBindAddress: opts.HealthProbeAddress,
Metrics: metricsserver.Options{
BindAddress: opts.MetricsBindAddress,
},
WebhookServer: ctrlwebhook.NewServer(ctrlwebhook.Options{
Port: FleetWebhookPort,
CertDir: FleetWebhookCertDir,
}),
})
if err != nil {
klog.ErrorS(err, "unable to start controller manager.")
exitWithErrorFunc()
}
klog.V(2).InfoS("starting hubagent")
if opts.EnableV1Alpha1APIs {
klog.Info("Setting up memberCluster v1alpha1 controller")
if err = (&mcv1alpha1.Reconciler{
Client: mgr.GetClient(),
NetworkingAgentsEnabled: opts.NetworkingAgentsEnabled,
}).SetupWithManager(mgr, "memberclusterv1alpha1-controller"); err != nil {
klog.ErrorS(err, "unable to create v1alpha1 controller", "controller", "MemberCluster")
exitWithErrorFunc()
}
}
if opts.EnableV1Beta1APIs {
klog.Info("Setting up memberCluster v1beta1 controller")
if err = (&mcv1beta1.Reconciler{
Client: mgr.GetClient(),
NetworkingAgentsEnabled: opts.NetworkingAgentsEnabled,
MaxConcurrentReconciles: int(math.Ceil(float64(opts.MaxFleetSizeSupported) / 100)), //one member cluster reconciler routine per 100 member clusters
ForceDeleteWaitTime: opts.ForceDeleteWaitTime.Duration,
}).SetupWithManager(mgr, "membercluster-controller"); err != nil {
klog.ErrorS(err, "unable to create v1beta1 controller", "controller", "MemberCluster")
exitWithErrorFunc()
}
}
if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
klog.ErrorS(err, "unable to set up health check")
exitWithErrorFunc()
}
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
klog.ErrorS(err, "unable to set up ready check")
exitWithErrorFunc()
}
if opts.EnableWebhook {
whiteListedUsers := strings.Split(opts.WhiteListedUsers, ",")
if err := SetupWebhook(mgr, options.WebhookClientConnectionType(opts.WebhookClientConnectionType), opts.WebhookServiceName, whiteListedUsers, opts.EnableGuardRail, opts.EnableV1Beta1APIs); err != nil {
klog.ErrorS(err, "unable to set up webhook")
exitWithErrorFunc()
}
}
ctx := ctrl.SetupSignalHandler()
if err := workload.SetupControllers(ctx, &wg, mgr, config, opts); err != nil {
klog.ErrorS(err, "unable to set up ready check")
exitWithErrorFunc()
}
// +kubebuilder:scaffold:builder
wg.Add(1)
go func() {
defer wg.Done()
// Start() is a blocking call and it is set to exit on context cancellation.
if err := mgr.Start(ctx); err != nil {
klog.ErrorS(err, "problem starting manager")
exitWithErrorFunc()
}
klog.InfoS("The controller manager has exited")
}()
// Wait for the controller manager and the scheduler to exit.
wg.Wait()
}