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 }