github.com/argoproj/argo-events@v1.9.1/sensors/cmd/start.go (about) 1 package cmd 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "fmt" 7 "os" 8 9 "go.uber.org/zap" 10 "k8s.io/client-go/dynamic" 11 "k8s.io/client-go/kubernetes" 12 "sigs.k8s.io/controller-runtime/pkg/manager/signals" 13 14 argoevents "github.com/argoproj/argo-events" 15 "github.com/argoproj/argo-events/common" 16 "github.com/argoproj/argo-events/common/logging" 17 "github.com/argoproj/argo-events/metrics" 18 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 19 v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 20 "github.com/argoproj/argo-events/sensors" 21 ) 22 23 func Start() { 24 logger := logging.NewArgoEventsLogger().Named("sensor") 25 kubeConfig, _ := os.LookupEnv(common.EnvVarKubeConfig) 26 restConfig, err := common.GetClientConfig(kubeConfig) 27 if err != nil { 28 logger.Fatalw("failed to get kubeconfig", zap.Error(err)) 29 } 30 kubeClient := kubernetes.NewForConfigOrDie(restConfig) 31 encodedSensorSpec, defined := os.LookupEnv(common.EnvVarSensorObject) 32 if !defined { 33 logger.Fatalf("required environment variable '%s' not defined", common.EnvVarSensorObject) 34 } 35 sensorSpec, err := base64.StdEncoding.DecodeString(encodedSensorSpec) 36 if err != nil { 37 logger.Fatalw("failed to decode sensor string", zap.Error(err)) 38 } 39 sensor := &v1alpha1.Sensor{} 40 if err = json.Unmarshal(sensorSpec, sensor); err != nil { 41 logger.Fatalw("failed to unmarshal sensor object", zap.Error(err)) 42 } 43 44 busConfig := &eventbusv1alpha1.BusConfig{} 45 encodedBusConfigSpec := os.Getenv(common.EnvVarEventBusConfig) 46 if len(encodedBusConfigSpec) > 0 { 47 busConfigSpec, err := base64.StdEncoding.DecodeString(encodedBusConfigSpec) 48 if err != nil { 49 logger.Fatalw("failed to decode bus config string", zap.Error(err)) 50 } 51 if err = json.Unmarshal(busConfigSpec, busConfig); err != nil { 52 logger.Fatalw("failed to unmarshal bus config object", zap.Error(err)) 53 } 54 } 55 if busConfig.NATS != nil { 56 for _, trigger := range sensor.Spec.Triggers { 57 if trigger.AtLeastOnce { 58 logger.Warn("ignoring atLeastOnce when using NATS") 59 trigger.AtLeastOnce = false 60 } 61 } 62 } 63 ebSubject, defined := os.LookupEnv(common.EnvVarEventBusSubject) 64 if !defined { 65 logger.Fatalf("required environment variable '%s' not defined", common.EnvVarEventBusSubject) 66 } 67 68 hostname, defined := os.LookupEnv("POD_NAME") 69 if !defined { 70 logger.Fatal("required environment variable 'POD_NAME' not defined") 71 } 72 73 dynamicClient := dynamic.NewForConfigOrDie(restConfig) 74 75 logger = logger.With("sensorName", sensor.Name) 76 for name, value := range sensor.Spec.LoggingFields { 77 logger.With(name, value) 78 } 79 80 ctx := logging.WithLogger(signals.SetupSignalHandler(), logger) 81 m := metrics.NewMetrics(sensor.Namespace) 82 go m.Run(ctx, fmt.Sprintf(":%d", common.SensorMetricsPort)) 83 84 logger.Infow("starting sensor server", "version", argoevents.GetVersion()) 85 sensorExecutionCtx := sensors.NewSensorContext(kubeClient, dynamicClient, sensor, busConfig, ebSubject, hostname, m) 86 if err := sensorExecutionCtx.Start(ctx); err != nil { 87 logger.Fatalw("failed to listen to events", zap.Error(err)) 88 } 89 }