github.com/argoproj/argo-events@v1.9.1/eventbus/kafka/base/kafka.go (about)

     1  package base
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/IBM/sarama"
     7  	"github.com/argoproj/argo-events/common"
     8  	eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1"
     9  	"go.uber.org/zap"
    10  )
    11  
    12  type Kafka struct {
    13  	Logger *zap.SugaredLogger
    14  	config *eventbusv1alpha1.KafkaBus
    15  }
    16  
    17  func NewKafka(config *eventbusv1alpha1.KafkaBus, logger *zap.SugaredLogger) *Kafka {
    18  	// set defaults
    19  	if config.ConsumerGroup == nil {
    20  		config.ConsumerGroup = &eventbusv1alpha1.KafkaConsumerGroup{}
    21  	}
    22  
    23  	return &Kafka{
    24  		Logger: logger,
    25  		config: config,
    26  	}
    27  }
    28  
    29  func (k *Kafka) Brokers() []string {
    30  	return strings.Split(k.config.URL, ",")
    31  }
    32  
    33  func (k *Kafka) Config() (*sarama.Config, error) {
    34  	config := sarama.NewConfig()
    35  
    36  	// consumer config
    37  	config.Consumer.IsolationLevel = sarama.ReadCommitted
    38  	config.Consumer.Offsets.AutoCommit.Enable = false
    39  
    40  	switch k.config.ConsumerGroup.StartOldest {
    41  	case true:
    42  		config.Consumer.Offsets.Initial = sarama.OffsetOldest
    43  	case false:
    44  		config.Consumer.Offsets.Initial = sarama.OffsetNewest
    45  	}
    46  
    47  	switch k.config.ConsumerGroup.RebalanceStrategy {
    48  	case "sticky":
    49  		config.Consumer.Group.Rebalance.GroupStrategies = []sarama.BalanceStrategy{sarama.NewBalanceStrategySticky()}
    50  	case "roundrobin":
    51  		config.Consumer.Group.Rebalance.GroupStrategies = []sarama.BalanceStrategy{sarama.NewBalanceStrategyRoundRobin()}
    52  	default:
    53  		config.Consumer.Group.Rebalance.GroupStrategies = []sarama.BalanceStrategy{sarama.NewBalanceStrategyRange()}
    54  	}
    55  
    56  	// producer config
    57  	config.Producer.Idempotent = true
    58  	config.Producer.RequiredAcks = sarama.WaitForAll
    59  	config.Net.MaxOpenRequests = 1
    60  
    61  	// common config
    62  	if k.config.Version != "" {
    63  		version, err := sarama.ParseKafkaVersion(k.config.Version)
    64  		if err != nil {
    65  			return nil, err
    66  		}
    67  
    68  		config.Version = version
    69  	}
    70  
    71  	// sasl
    72  	if k.config.SASL != nil {
    73  		config.Net.SASL.Enable = true
    74  		config.Net.SASL.Mechanism = sarama.SASLMechanism(k.config.SASL.GetMechanism())
    75  
    76  		switch config.Net.SASL.Mechanism {
    77  		case "SCRAM-SHA-512":
    78  			config.Net.SASL.SCRAMClientGeneratorFunc = func() sarama.SCRAMClient {
    79  				return &common.XDGSCRAMClient{HashGeneratorFcn: common.SHA512New}
    80  			}
    81  		case "SCRAM-SHA-256":
    82  			config.Net.SASL.SCRAMClientGeneratorFunc = func() sarama.SCRAMClient {
    83  				return &common.XDGSCRAMClient{HashGeneratorFcn: common.SHA256New}
    84  			}
    85  		}
    86  
    87  		user, err := common.GetSecretFromVolume(k.config.SASL.UserSecret)
    88  		if err != nil {
    89  			return nil, err
    90  		}
    91  		config.Net.SASL.User = user
    92  
    93  		password, err := common.GetSecretFromVolume(k.config.SASL.PasswordSecret)
    94  		if err != nil {
    95  			return nil, err
    96  		}
    97  		config.Net.SASL.Password = password
    98  	}
    99  
   100  	// tls
   101  	if k.config.TLS != nil {
   102  		tls, err := common.GetTLSConfig(k.config.TLS)
   103  		if err != nil {
   104  			return nil, err
   105  		}
   106  
   107  		config.Net.TLS.Config = tls
   108  		config.Net.TLS.Enable = true
   109  	}
   110  
   111  	return config, nil
   112  }