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  }