github.com/argoproj/argo-events@v1.9.1/eventbus/driver.go (about) 1 package eventbus 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/argoproj/argo-events/common" 8 apicommon "github.com/argoproj/argo-events/pkg/apis/common" 9 "github.com/fsnotify/fsnotify" 10 "go.uber.org/zap" 11 12 "github.com/argoproj/argo-events/common/logging" 13 eventbuscommon "github.com/argoproj/argo-events/eventbus/common" 14 jetstreamsource "github.com/argoproj/argo-events/eventbus/jetstream/eventsource" 15 jetstreamsensor "github.com/argoproj/argo-events/eventbus/jetstream/sensor" 16 kafkasource "github.com/argoproj/argo-events/eventbus/kafka/eventsource" 17 kafkasensor "github.com/argoproj/argo-events/eventbus/kafka/sensor" 18 stansource "github.com/argoproj/argo-events/eventbus/stan/eventsource" 19 stansensor "github.com/argoproj/argo-events/eventbus/stan/sensor" 20 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 21 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 22 "github.com/spf13/viper" 23 ) 24 25 func GetEventSourceDriver(ctx context.Context, eventBusConfig eventbusv1alpha1.BusConfig, eventSourceName string, defaultSubject string) (eventbuscommon.EventSourceDriver, error) { 26 auth, err := GetAuth(ctx, eventBusConfig) 27 if err != nil { 28 return nil, err 29 } 30 if eventSourceName == "" { 31 return nil, fmt.Errorf("eventSourceName must be specified to create eventbus driver") 32 } 33 34 logger := logging.FromContext(ctx) 35 36 logger.Infof("eventBusConfig: %+v", eventBusConfig) 37 38 var eventBusType apicommon.EventBusType 39 switch { 40 case eventBusConfig.NATS != nil: 41 eventBusType = apicommon.EventBusNATS 42 case eventBusConfig.JetStream != nil: 43 eventBusType = apicommon.EventBusJetStream 44 case eventBusConfig.Kafka != nil: 45 eventBusType = apicommon.EventBusKafka 46 default: 47 return nil, fmt.Errorf("invalid event bus") 48 } 49 50 var dvr eventbuscommon.EventSourceDriver 51 switch eventBusType { 52 case apicommon.EventBusNATS: 53 if defaultSubject == "" { 54 return nil, fmt.Errorf("subject must be specified to create NATS Streaming driver") 55 } 56 dvr = stansource.NewSourceSTAN(eventBusConfig.NATS.URL, *eventBusConfig.NATS.ClusterID, eventSourceName, defaultSubject, auth, logger) 57 case apicommon.EventBusJetStream: 58 dvr, err = jetstreamsource.NewSourceJetstream(eventBusConfig.JetStream.URL, eventSourceName, eventBusConfig.JetStream.StreamConfig, auth, logger) // don't need to pass in subject because subjects will be derived from dependencies 59 if err != nil { 60 return nil, err 61 } 62 case apicommon.EventBusKafka: 63 dvr = kafkasource.NewKafkaSource(eventBusConfig.Kafka, logger) 64 default: 65 return nil, fmt.Errorf("invalid eventbus type") 66 } 67 return dvr, nil 68 } 69 70 func GetSensorDriver(ctx context.Context, eventBusConfig eventbusv1alpha1.BusConfig, sensorSpec *v1alpha1.Sensor, hostname string) (eventbuscommon.SensorDriver, error) { 71 auth, err := GetAuth(ctx, eventBusConfig) 72 if err != nil { 73 return nil, err 74 } 75 76 if sensorSpec == nil { 77 return nil, fmt.Errorf("sensorSpec required for getting eventbus driver") 78 } 79 if sensorSpec.Name == "" { 80 return nil, fmt.Errorf("sensorSpec name must be set for getting eventbus driver") 81 } 82 logger := logging.FromContext(ctx) 83 84 var eventBusType apicommon.EventBusType 85 switch { 86 case eventBusConfig.NATS != nil: 87 eventBusType = apicommon.EventBusNATS 88 case eventBusConfig.JetStream != nil: 89 eventBusType = apicommon.EventBusJetStream 90 case eventBusConfig.Kafka != nil: 91 eventBusType = apicommon.EventBusKafka 92 default: 93 return nil, fmt.Errorf("invalid event bus") 94 } 95 96 var dvr eventbuscommon.SensorDriver 97 switch eventBusType { 98 case apicommon.EventBusNATS: 99 dvr = stansensor.NewSensorSTAN(eventBusConfig.NATS.URL, *eventBusConfig.NATS.ClusterID, sensorSpec.Name, auth, logger) 100 return dvr, nil 101 case apicommon.EventBusJetStream: 102 dvr, err = jetstreamsensor.NewSensorJetstream(eventBusConfig.JetStream.URL, sensorSpec, eventBusConfig.JetStream.StreamConfig, auth, logger) // don't need to pass in subject because subjects will be derived from dependencies 103 return dvr, err 104 case apicommon.EventBusKafka: 105 dvr = kafkasensor.NewKafkaSensor(eventBusConfig.Kafka, sensorSpec, hostname, logger) 106 return dvr, nil 107 default: 108 return nil, fmt.Errorf("invalid eventbus type") 109 } 110 } 111 112 func GetAuth(ctx context.Context, eventBusConfig eventbusv1alpha1.BusConfig) (*eventbuscommon.Auth, error) { 113 logger := logging.FromContext(ctx) 114 115 var eventBusAuth *eventbusv1alpha1.AuthStrategy 116 switch { 117 case eventBusConfig.NATS != nil: 118 eventBusAuth = eventBusConfig.NATS.Auth 119 case eventBusConfig.JetStream != nil: 120 if eventBusConfig.JetStream.AccessSecret != nil { 121 eventBusAuth = &eventbusv1alpha1.AuthStrategyBasic 122 } else { 123 eventBusAuth = nil 124 } 125 case eventBusConfig.Kafka != nil: 126 eventBusAuth = nil 127 default: 128 return nil, fmt.Errorf("invalid event bus") 129 } 130 var auth *eventbuscommon.Auth 131 cred := &eventbuscommon.AuthCredential{} 132 if eventBusAuth == nil || *eventBusAuth == eventbusv1alpha1.AuthStrategyNone { 133 auth = &eventbuscommon.Auth{ 134 Strategy: eventbusv1alpha1.AuthStrategyNone, 135 } 136 } else { 137 v := viper.New() 138 v.SetConfigName("auth") 139 v.SetConfigType("yaml") 140 v.AddConfigPath(common.EventBusAuthFileMountPath) 141 err := v.ReadInConfig() 142 if err != nil { 143 return nil, fmt.Errorf("failed to load auth.yaml. err: %w", err) 144 } 145 err = v.Unmarshal(cred) 146 if err != nil { 147 logger.Errorw("failed to unmarshal auth.yaml", zap.Error(err)) 148 return nil, err 149 } 150 v.WatchConfig() 151 v.OnConfigChange(func(e fsnotify.Event) { 152 // Auth file changed, let it restart 153 logger.Fatal("Eventbus auth config file changed, exiting..") 154 }) 155 auth = &eventbuscommon.Auth{ 156 Strategy: *eventBusAuth, 157 Credential: cred, 158 } 159 } 160 161 return auth, nil 162 }