package embed_test import ( "context" "os" "testing" "time" "github.com/go-logr/logr/testr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ctrl "sigs.k8s.io/controller-runtime" "edge-infra.dev/pkg/sds/lib/etcd/client" "edge-infra.dev/pkg/sds/lib/etcd/client/retry" "edge-infra.dev/pkg/sds/lib/etcd/server/embed" ) func setupTestCtx(t *testing.T) context.Context { logOptions := testr.Options{ LogTimestamp: true, Verbosity: -1, } ctx := ctrl.LoggerInto(context.Background(), testr.NewWithOptions(t, logOptions)) return ctx } func TestMain(m *testing.M) { os.Exit(m.Run()) } func TestCluster(t *testing.T) { ctx := setupTestCtx(t) c, err := initialCluster() require.NoError(t, err) require.NoError(t, c.Start(ctx)) defer c.Close(ctx) require.Equal(t, 2, c.Size(), "The two initial members should be present in the initial cluster") cli, err := createClient(c.ClientURLs()...) require.NoError(t, err) require.NoError(t, addNewMember(ctx, cli, c)) require.NoError(t, c.Stop(ctx)) require.NoError(t, c.Start(ctx)) for _, endpoint := range c.ClientURLs() { _, err := cli.SafeStatus(ctx, endpoint) assert.NoError(t, err) } } func initialCluster() (*embed.Cluster, error) { m1, err := embed.NewMember(&embed.Config{Name: "member-1"}) if err != nil { return nil, err } m2, err := embed.NewMember(&embed.Config{Name: "member-2"}) if err != nil { return nil, err } c, err := embed.NewCluster(m1, m2) if err != nil { return nil, err } return c, nil } func createClient(clientURLs ...string) (retry.Retrier, error) { cli, err := client.New(nil, 5*time.Second, clientURLs...) if err != nil { return nil, err } config := retry.Config{ RequestTimeout: 500 * time.Millisecond, InitialBackoff: 500 * time.Millisecond, BackoffFactor: 1, MaxRetries: 10, } return retry.New(*cli, config), nil } func addNewMember(ctx context.Context, cli retry.Retrier, c *embed.Cluster) error { m3, err := embed.NewMember(&embed.Config{Name: "member-3"}) if err != nil { return err } startFn, err := c.AddMember(m3) if err != nil { return err } maresp, err := cli.SafeMemberAddAsLearner(ctx, []string{m3.PeerURL().String()}) if err != nil { return err } if err := startFn(); err != nil { return err } _, err = cli.SafeMemberPromote(ctx, maresp.Member.ID) if err != nil { return err } return nil }