github.com/Psiphon-Inc/goarista@v0.0.0-20160825065156-d002785f4c67/cmd/ockafka/main.go (about) 1 // Copyright (C) 2016 Arista Networks, Inc. 2 // Use of this source code is governed by the Apache License 2.0 3 // that can be found in the COPYING file. 4 5 // The occlient tool is a client for the gRPC service for getting and setting the 6 // OpenConfig configuration and state of a network device. 7 package main 8 9 import ( 10 "flag" 11 "fmt" 12 "strings" 13 "sync" 14 15 "github.com/Shopify/sarama" 16 "github.com/aristanetworks/glog" 17 "github.com/aristanetworks/goarista/kafka" 18 "github.com/aristanetworks/goarista/kafka/openconfig" 19 "github.com/aristanetworks/goarista/kafka/producer" 20 pb "github.com/aristanetworks/goarista/openconfig" 21 "github.com/aristanetworks/goarista/openconfig/client" 22 ) 23 24 var keysFlag = flag.String("kafkakeys", "", 25 "Keys for kafka messages (comma-separated, default: the value of -addrs") 26 27 func newProducer(addresses []string, topic, key string) (producer.Producer, error) { 28 client, err := kafka.NewClient(addresses) 29 if err != nil { 30 return nil, fmt.Errorf("Failed to create Kafka client: %s", err) 31 } 32 encodedKey := sarama.StringEncoder(key) 33 p, err := producer.New(topic, nil, client, encodedKey, openconfig.ElasticsearchMessageEncoder) 34 if err != nil { 35 return nil, fmt.Errorf("Failed to create Kafka producer: %s", err) 36 } 37 return p, nil 38 } 39 40 func main() { 41 username, password, subscriptions, grpcAddrs, opts := client.ParseFlags() 42 43 if *keysFlag == "" { 44 *keysFlag = strings.Join(grpcAddrs, ",") 45 } 46 keys := strings.Split(*keysFlag, ",") 47 if len(grpcAddrs) != len(keys) { 48 glog.Fatal("Please provide the same number of addresses and Kafka keys") 49 } 50 addresses := strings.Split(*kafka.Addresses, ",") 51 wg := new(sync.WaitGroup) 52 for i, grpcAddr := range grpcAddrs { 53 key := keys[i] 54 p, err := newProducer(addresses, *kafka.Topic, key) 55 if err != nil { 56 glog.Fatal(err) 57 } else { 58 glog.Infof("Initialized Kafka producer for %s", grpcAddr) 59 } 60 publish := func(notif *pb.SubscribeResponse) { 61 p.Write(notif) 62 } 63 wg.Add(1) 64 go p.Run() 65 go client.Run(publish, wg, username, password, grpcAddr, subscriptions, opts) 66 } 67 wg.Wait() 68 }