package kafka import ( "context" "fmt" "time" "fiskerinc.com/modules/utils/envtool" "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/pkg/errors" ) // AdminClient interface type AdminClient interface { CreateTopics(ctx context.Context, topics []kafka.TopicSpecification, options ...kafka.CreateTopicsAdminOption) ([]kafka.TopicResult, error) } // Global var ( Admin AdminClient kafkaHosts string = envtool.GetEnv("KAFKA_HOSTS", "localhost:9093") ) func init() { Admin, _ = kafka.NewAdminClient(&kafka.ConfigMap{"bootstrap.servers": kafkaHosts}) } // EnsureTopicsExist checks Kafka for topic, if it doesn't exist it creates topic func EnsureTopicsExist(topics []string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() s := fmt.Sprintf("%vs", envtool.GetEnvInt("KAFKA_TIMEOUT", 30)) maxDur, err := time.ParseDuration(s) if err != nil { return errors.WithStack(err) } ts := make([]kafka.TopicSpecification, len(topics)) for i, t := range topics { ts[i] = kafka.TopicSpecification{ Topic: t, NumPartitions: envtool.GetEnvInt("KAFKA_TOPIC_PARTITIONS", 1), ReplicationFactor: envtool.GetEnvInt("KAFKA_TOPIC_REPLICATION_FACTOR", 1), } } _, err = Admin.CreateTopics(ctx, ts, kafka.SetAdminOperationTimeout(maxDur)) if err != nil { return errors.WithStack(err) } return nil }