in cmd/mcs-controller-manager/main.go [78:188]
func main() {
flag.Parse()
rand.Seed(time.Now().UnixNano())
handleExitFunc := func() {
klog.Flush()
}
exitWithErrorFunc := func() {
handleExitFunc()
os.Exit(1)
}
defer handleExitFunc()
flag.VisitAll(func(f *flag.Flag) {
klog.InfoS("flag:", "name", f.Name, "value", f.Value)
})
// Set up controller-runtime logger
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
memberConfig, memberOptions := prepareMemberParameters()
hubConfig, hubOptions, err := prepareHubParameters(memberConfig)
if err != nil {
exitWithErrorFunc()
}
// Setup hub controller manager.
hubMgr, err := ctrl.NewManager(hubConfig, *hubOptions)
if err != nil {
klog.ErrorS(err, "Unable to start hub manager")
exitWithErrorFunc()
}
if err := hubMgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
klog.ErrorS(err, "Unable to set up health check for hub manager")
exitWithErrorFunc()
}
if err := hubMgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
klog.ErrorS(err, "Unable to set up ready check for hub manager")
exitWithErrorFunc()
}
// Setup member controller manager.
memberMgr, err := ctrl.NewManager(memberConfig, *memberOptions)
if err != nil {
klog.ErrorS(err, "Unable to start member manager")
exitWithErrorFunc()
}
if err := memberMgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
klog.ErrorS(err, "Unable to set up health check for member manager")
exitWithErrorFunc()
}
if err := memberMgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
klog.ErrorS(err, "Unable to set up ready check for member manager")
exitWithErrorFunc()
}
ctx, cancel := context.WithCancel(context.Background())
klog.V(1).InfoS("Setup controllers with controller manager")
if err := setupControllersWithManager(ctx, hubMgr, memberMgr); err != nil {
klog.ErrorS(err, "Unable to setup controllers with manager")
exitWithErrorFunc()
}
// All managers should stop if either of them is dead or Linux SIGTERM or SIGINT signal is received
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt, syscall.SIGTERM)
go func() {
<-ch
klog.Info("Received termination, signaling shutdown MultiClusterService agent")
cancel()
}()
var startErrors []error
wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
klog.V(1).InfoS("Starting hub manager for MultiClusterService agent")
defer func() {
wg.Done()
klog.V(1).InfoS("Shutting down hub manager")
cancel()
}()
if err := hubMgr.Start(ctx); err != nil {
klog.ErrorS(err, "Failed to start hub manager")
startErrors = append(startErrors, err)
}
}()
wg.Add(1)
go func() {
klog.V(1).InfoS("Starting member manager for MultiClusterService agent")
defer func() {
klog.V(1).InfoS("Shutting down member manager")
wg.Done()
cancel()
}()
if err = memberMgr.Start(ctx); err != nil {
klog.ErrorS(err, "Failed to start member manager")
startErrors = append(startErrors, err)
}
}()
wg.Wait()
if len(startErrors) > 0 {
exitWithErrorFunc()
}
}