github.com/rudderlabs/rudder-go-kit@v0.30.0/testhelper/docker/resource/etcd/etcd.go (about)

     1  package etcd
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  	"time"
     7  
     8  	"github.com/ory/dockertest/v3"
     9  	etcd "go.etcd.io/etcd/client/v3"
    10  	"google.golang.org/grpc"
    11  
    12  	"github.com/rudderlabs/rudder-go-kit/testhelper/docker/resource"
    13  )
    14  
    15  type Resource struct {
    16  	Client *etcd.Client
    17  	Hosts  []string
    18  	Port   int
    19  }
    20  
    21  func Setup(pool *dockertest.Pool, cln resource.Cleaner) (*Resource, error) {
    22  	etcdImage := "bitnami/etcd"
    23  	container, err := pool.Run(etcdImage, "3.5", []string{
    24  		"ALLOW_NONE_AUTHENTICATION=yes",
    25  	})
    26  	if err != nil {
    27  		return nil, fmt.Errorf("could not create container: %v", err)
    28  	}
    29  	cln.Cleanup(func() {
    30  		if err := pool.Purge(container); err != nil {
    31  			cln.Log(fmt.Errorf("could not purge ETCD resource: %v", err))
    32  		}
    33  	})
    34  
    35  	var (
    36  		etcdClient *etcd.Client
    37  		etcdHosts  []string
    38  		etcdPort   int
    39  
    40  		etcdPortStr = container.GetPort("2379/tcp")
    41  	)
    42  	etcdPort, err = strconv.Atoi(etcdPortStr)
    43  	if err != nil {
    44  		return nil, fmt.Errorf("could not convert port %q to int: %v", etcdPortStr, err)
    45  	}
    46  
    47  	etcdHosts = []string{"http://localhost:" + etcdPortStr}
    48  	err = pool.Retry(func() (err error) {
    49  		etcdClient, err = etcd.New(etcd.Config{
    50  			Endpoints: etcdHosts,
    51  			DialOptions: []grpc.DialOption{
    52  				grpc.WithBlock(), // block until the underlying connection is up
    53  			},
    54  			DialTimeout: 10 * time.Second,
    55  		})
    56  		return err
    57  	})
    58  	if err != nil {
    59  		return nil, fmt.Errorf("could not connect to dockerized ETCD: %v", err)
    60  	}
    61  
    62  	return &Resource{
    63  		Client: etcdClient,
    64  		Hosts:  etcdHosts,
    65  		Port:   etcdPort,
    66  	}, nil
    67  }