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  }