github.com/argoproj/argo-events@v1.9.1/controllers/cmd/start.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 7 "go.uber.org/zap" 8 appv1 "k8s.io/api/apps/v1" 9 corev1 "k8s.io/api/core/v1" 10 "k8s.io/client-go/kubernetes" 11 ctrl "sigs.k8s.io/controller-runtime" 12 "sigs.k8s.io/controller-runtime/pkg/controller" 13 "sigs.k8s.io/controller-runtime/pkg/handler" 14 "sigs.k8s.io/controller-runtime/pkg/healthz" 15 "sigs.k8s.io/controller-runtime/pkg/manager/signals" 16 "sigs.k8s.io/controller-runtime/pkg/predicate" 17 "sigs.k8s.io/controller-runtime/pkg/source" 18 19 argoevents "github.com/argoproj/argo-events" 20 "github.com/argoproj/argo-events/common/logging" 21 "github.com/argoproj/argo-events/controllers" 22 "github.com/argoproj/argo-events/controllers/eventbus" 23 "github.com/argoproj/argo-events/controllers/eventsource" 24 "github.com/argoproj/argo-events/controllers/sensor" 25 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 26 eventsourcev1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" 27 sensorv1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 28 ) 29 30 const ( 31 imageEnvVar = "ARGO_EVENTS_IMAGE" 32 ) 33 34 type ArgoEventsControllerOpts struct { 35 Namespaced bool 36 ManagedNamespace string 37 LeaderElection bool 38 MetricsPort int32 39 HealthPort int32 40 } 41 42 func Start(eventsOpts ArgoEventsControllerOpts) { 43 logger := logging.NewArgoEventsLogger().Named(eventbus.ControllerName) 44 config, err := controllers.LoadConfig(func(err error) { 45 logger.Errorw("Failed to reload global configuration file", zap.Error(err)) 46 }) 47 if err != nil { 48 logger.Fatalw("Failed to load global configuration file", zap.Error(err)) 49 } 50 51 if err = controllers.ValidateConfig(config); err != nil { 52 logger.Fatalw("Global configuration file validation failed", zap.Error(err)) 53 } 54 55 imageName, defined := os.LookupEnv(imageEnvVar) 56 if !defined { 57 logger.Fatalf("required environment variable '%s' not defined", imageEnvVar) 58 } 59 opts := ctrl.Options{ 60 MetricsBindAddress: fmt.Sprintf(":%d", eventsOpts.MetricsPort), 61 HealthProbeBindAddress: fmt.Sprintf(":%d", eventsOpts.HealthPort), 62 } 63 if eventsOpts.Namespaced { 64 opts.Namespace = eventsOpts.ManagedNamespace 65 } 66 if eventsOpts.LeaderElection { 67 opts.LeaderElection = true 68 opts.LeaderElectionID = "argo-events-controller" 69 } 70 restConfig := ctrl.GetConfigOrDie() 71 mgr, err := ctrl.NewManager(restConfig, opts) 72 if err != nil { 73 logger.Fatalw("unable to get a controller-runtime manager", zap.Error(err)) 74 } 75 kubeClient := kubernetes.NewForConfigOrDie(restConfig) 76 77 // Readyness probe 78 if err := mgr.AddReadyzCheck("readiness", healthz.Ping); err != nil { 79 logger.Fatalw("unable add a readiness check", zap.Error(err)) 80 } 81 82 // Liveness probe 83 if err := mgr.AddHealthzCheck("liveness", healthz.Ping); err != nil { 84 logger.Fatalw("unable add a health check", zap.Error(err)) 85 } 86 87 if err := eventbusv1alpha1.AddToScheme(mgr.GetScheme()); err != nil { 88 logger.Fatalw("unable to add scheme", zap.Error(err)) 89 } 90 91 if err := eventsourcev1alpha1.AddToScheme(mgr.GetScheme()); err != nil { 92 logger.Fatalw("unable to add EventSource scheme", zap.Error(err)) 93 } 94 95 if err := sensorv1alpha1.AddToScheme(mgr.GetScheme()); err != nil { 96 logger.Fatalw("unable to add Sensor scheme", zap.Error(err)) 97 } 98 99 // EventBus controller 100 eventBusController, err := controller.New(eventbus.ControllerName, mgr, controller.Options{ 101 Reconciler: eventbus.NewReconciler(mgr.GetClient(), kubeClient, mgr.GetScheme(), config, logger), 102 }) 103 if err != nil { 104 logger.Fatalw("unable to set up EventBus controller", zap.Error(err)) 105 } 106 107 // Watch EventBus and enqueue EventBus object key 108 if err := eventBusController.Watch(&source.Kind{Type: &eventbusv1alpha1.EventBus{}}, &handler.EnqueueRequestForObject{}, 109 predicate.Or( 110 predicate.GenerationChangedPredicate{}, 111 predicate.LabelChangedPredicate{}, 112 )); err != nil { 113 logger.Fatalw("unable to watch EventBus", zap.Error(err)) 114 } 115 116 // Watch ConfigMaps and enqueue owning EventBus key 117 if err := eventBusController.Watch(&source.Kind{Type: &corev1.ConfigMap{}}, &handler.EnqueueRequestForOwner{OwnerType: &eventbusv1alpha1.EventBus{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 118 logger.Fatalw("unable to watch ConfigMaps", zap.Error(err)) 119 } 120 121 // Watch StatefulSets and enqueue owning EventBus key 122 if err := eventBusController.Watch(&source.Kind{Type: &appv1.StatefulSet{}}, &handler.EnqueueRequestForOwner{OwnerType: &eventbusv1alpha1.EventBus{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 123 logger.Fatalw("unable to watch StatefulSets", zap.Error(err)) 124 } 125 126 // Watch Services and enqueue owning EventBus key 127 if err := eventBusController.Watch(&source.Kind{Type: &corev1.Service{}}, &handler.EnqueueRequestForOwner{OwnerType: &eventbusv1alpha1.EventBus{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 128 logger.Fatalw("unable to watch Services", zap.Error(err)) 129 } 130 131 // EventSource controller 132 eventSourceController, err := controller.New(eventsource.ControllerName, mgr, controller.Options{ 133 Reconciler: eventsource.NewReconciler(mgr.GetClient(), mgr.GetScheme(), imageName, logger), 134 }) 135 if err != nil { 136 logger.Fatalw("unable to set up EventSource controller", zap.Error(err)) 137 } 138 139 // Watch EventSource and enqueue EventSource object key 140 if err := eventSourceController.Watch(&source.Kind{Type: &eventsourcev1alpha1.EventSource{}}, &handler.EnqueueRequestForObject{}, 141 predicate.Or( 142 predicate.GenerationChangedPredicate{}, 143 predicate.LabelChangedPredicate{}, 144 )); err != nil { 145 logger.Fatalw("unable to watch EventSources", zap.Error(err)) 146 } 147 148 // Watch Deployments and enqueue owning EventSource key 149 if err := eventSourceController.Watch(&source.Kind{Type: &appv1.Deployment{}}, &handler.EnqueueRequestForOwner{OwnerType: &eventsourcev1alpha1.EventSource{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 150 logger.Fatalw("unable to watch Deployments", zap.Error(err)) 151 } 152 153 // Watch Services and enqueue owning EventSource key 154 if err := eventSourceController.Watch(&source.Kind{Type: &corev1.Service{}}, &handler.EnqueueRequestForOwner{OwnerType: &eventsourcev1alpha1.EventSource{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 155 logger.Fatalw("unable to watch Services", zap.Error(err)) 156 } 157 158 // Sensor controller 159 sensorController, err := controller.New(sensor.ControllerName, mgr, controller.Options{ 160 Reconciler: sensor.NewReconciler(mgr.GetClient(), mgr.GetScheme(), imageName, logger), 161 }) 162 if err != nil { 163 logger.Fatalw("unable to set up Sensor controller", zap.Error(err)) 164 } 165 166 // Watch Sensor and enqueue Sensor object key 167 if err := sensorController.Watch(&source.Kind{Type: &sensorv1alpha1.Sensor{}}, &handler.EnqueueRequestForObject{}, 168 predicate.Or( 169 predicate.GenerationChangedPredicate{}, 170 predicate.LabelChangedPredicate{}, 171 )); err != nil { 172 logger.Fatalw("unable to watch Sensors", zap.Error(err)) 173 } 174 175 // Watch Deployments and enqueue owning Sensor key 176 if err := sensorController.Watch(&source.Kind{Type: &appv1.Deployment{}}, &handler.EnqueueRequestForOwner{OwnerType: &sensorv1alpha1.Sensor{}, IsController: true}, predicate.GenerationChangedPredicate{}); err != nil { 177 logger.Fatalw("unable to watch Deployments", zap.Error(err)) 178 } 179 180 logger.Infow("starting controller manager", "version", argoevents.GetVersion()) 181 if err := mgr.Start(signals.SetupSignalHandler()); err != nil { 182 logger.Fatalw("unable to run eventbus controller", zap.Error(err)) 183 } 184 }