github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/usagestats/seed_test.go (about)

     1  package usagestats
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/go-kit/log"
    11  	"github.com/grafana/dskit/flagext"
    12  	"github.com/grafana/dskit/kv"
    13  	"github.com/grafana/dskit/kv/codec"
    14  	"github.com/grafana/dskit/kv/memberlist"
    15  	"github.com/grafana/dskit/services"
    16  	"github.com/stretchr/testify/require"
    17  
    18  	"github.com/grafana/loki/pkg/storage/chunk/client/local"
    19  )
    20  
    21  type dnsProviderMock struct {
    22  	resolved []string
    23  }
    24  
    25  func (p *dnsProviderMock) Resolve(ctx context.Context, addrs []string) error {
    26  	p.resolved = addrs
    27  	return nil
    28  }
    29  
    30  func (p dnsProviderMock) Addresses() []string {
    31  	return p.resolved
    32  }
    33  
    34  func createMemberlist(t *testing.T, port, memberID int) *memberlist.KV {
    35  	t.Helper()
    36  	var cfg memberlist.KVConfig
    37  	flagext.DefaultValues(&cfg)
    38  	cfg.TCPTransport = memberlist.TCPTransportConfig{
    39  		BindAddrs: []string{"localhost"},
    40  		BindPort:  0,
    41  	}
    42  	cfg.GossipInterval = 100 * time.Millisecond
    43  	cfg.GossipNodes = 3
    44  	cfg.PushPullInterval = 5 * time.Second
    45  	cfg.NodeName = fmt.Sprintf("Member-%d", memberID)
    46  	cfg.Codecs = []codec.Codec{JSONCodec}
    47  
    48  	mkv := memberlist.NewKV(cfg, log.NewNopLogger(), &dnsProviderMock{}, nil)
    49  	require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv))
    50  	if port != 0 {
    51  		_, err := mkv.JoinMembers([]string{fmt.Sprintf("127.0.0.1:%d", port)})
    52  		require.NoError(t, err, "%s failed to join the cluster: %v", memberID, err)
    53  	}
    54  	t.Cleanup(func() {
    55  		_ = services.StopAndAwaitTerminated(context.TODO(), mkv)
    56  	})
    57  	return mkv
    58  }
    59  
    60  func Test_Memberlist(t *testing.T) {
    61  	stabilityCheckInterval = time.Second
    62  
    63  	objectClient, err := local.NewFSObjectClient(local.FSConfig{
    64  		Directory: t.TempDir(),
    65  	})
    66  	require.NoError(t, err)
    67  	result := make(chan *ClusterSeed, 10)
    68  
    69  	// create a first memberlist to get a valid listening port.
    70  	initMKV := createMemberlist(t, 0, -1)
    71  
    72  	for i := 0; i < 10; i++ {
    73  		go func(i int) {
    74  			leader, err := NewReporter(Config{
    75  				Leader:  true,
    76  				Enabled: true,
    77  			}, kv.Config{
    78  				Store: "memberlist",
    79  				StoreConfig: kv.StoreConfig{
    80  					MemberlistKV: func() (*memberlist.KV, error) {
    81  						return createMemberlist(t, initMKV.GetListeningPort(), i), nil
    82  					},
    83  				},
    84  			}, objectClient, log.NewLogfmtLogger(os.Stdout), nil)
    85  			require.NoError(t, err)
    86  			leader.init(context.Background())
    87  			result <- leader.cluster
    88  		}(i)
    89  	}
    90  
    91  	var UID []string
    92  	for i := 0; i < 10; i++ {
    93  		cluster := <-result
    94  		require.NotNil(t, cluster)
    95  		UID = append(UID, cluster.UID)
    96  	}
    97  	first := UID[0]
    98  	for _, uid := range UID {
    99  		require.Equal(t, first, uid)
   100  	}
   101  }