diff --git a/tests/e2e/cluster_downgrade_test.go b/tests/e2e/cluster_downgrade_test.go index a36a7b403bae..d4d76416e97a 100644 --- a/tests/e2e/cluster_downgrade_test.go +++ b/tests/e2e/cluster_downgrade_test.go @@ -30,6 +30,7 @@ import ( "go.etcd.io/etcd/api/v3/version" "go.etcd.io/etcd/client/pkg/v3/fileutil" clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/e2e" "go.etcd.io/etcd/tests/v3/framework/testutils" ) @@ -68,7 +69,7 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int) { e2e.BeforeTest(t) t.Logf("Create cluster with version %s", currentVersionStr) - epc := newCluster(t, clusterSize) + epc := newCluster(t, clusterSize, 10, t.TempDir()) for i := 0; i < len(epc.Procs); i++ { validateVersion(t, epc.Cfg, epc.Procs[i], version.Versions{ Cluster: currentVersionStr, @@ -77,6 +78,8 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int) { }) } t.Logf("Cluster created") + generateSnapshot(t, 10, epc) + bm, bkv := getMembersAndKeys(t, epc) t.Logf("etcdctl downgrade enable %s", lastVersionStr) downgradeEnable(t, epc, lastVersion) @@ -109,6 +112,12 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int) { } t.Log("Downgrade complete") + am, akv := getMembersAndKeys(t, epc) + + //compare membership and kv info before and after downgrade + assert.Equal(t, bkv.Kvs, akv.Kvs) + assert.Equal(t, bm.Members, am.Members) + t.Logf("Starting upgrade process to %q", currentVersionStr) for i := 0; i < len(epc.Procs); i++ { t.Logf("Upgrading member %d", i) @@ -130,9 +139,11 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int) { t.Log("Upgrade complete") } -func newCluster(t *testing.T, clusterSize int) *e2e.EtcdProcessCluster { +func newCluster(t *testing.T, clusterSize int, snapshotCount uint64, dataDir string) *e2e.EtcdProcessCluster { epc, err := e2e.NewEtcdProcessCluster(context.TODO(), t, e2e.WithClusterSize(clusterSize), + e2e.WithDataDirPath(dataDir), + e2e.WithSnapshotCount(snapshotCount), e2e.WithKeepDataDir(true), ) if err != nil { @@ -245,3 +256,34 @@ func getMemberVersionByCurl(cfg *e2e.EtcdProcessClusterConfig, member e2e.EtcdPr } return result, nil } + +func generateSnapshot(t *testing.T, snapshotCount uint64, epc *e2e.EtcdProcessCluster) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + t.Log("Adding and removing keys") + cc, err := e2e.NewEtcdctl(epc.Cfg.Client, epc.EndpointsGRPC()) + assert.NoError(t, err) + + var i uint64 + for i = 0; i < snapshotCount*3; i++ { + err := cc.Put(ctx, fmt.Sprintf("%d", i), "1", config.PutOptions{}) + assert.NoError(t, err) + } +} + +func getMembersAndKeys(t *testing.T, epc *e2e.EtcdProcessCluster) (*clientv3.MemberListResponse, *clientv3.GetResponse) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + cc, err := e2e.NewEtcdctl(epc.Cfg.Client, epc.EndpointsGRPC()) + assert.NoError(t, err) + + kvs, err := cc.Get(ctx, "", config.GetOptions{Prefix: true}) + assert.NoError(t, err) + + members, err := cc.MemberList(ctx, false) + assert.NoError(t, err) + + return members, kvs +}