Skip to content

Commit 35d20d1

Browse files
authored
Merge pull request #19244 from henrybear327/e2e/downgrade_cancellation_e2e
Add downgrade cancellation e2e tests
2 parents 291353b + 2e41777 commit 35d20d1

File tree

4 files changed

+87
-8
lines changed

4 files changed

+87
-8
lines changed

etcdctl/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,7 @@ DOWNGRADE ENABLE starts a downgrade action to cluster.
11191119
Downgrade enable success, cluster version 3.6
11201120
```
11211121

1122-
### DOWNGRADE CANCEL \<TARGET_VERSION\>
1122+
### DOWNGRADE CANCEL
11231123

11241124
DOWNGRADE CANCEL cancels the ongoing downgrade action to cluster.
11251125

tests/e2e/cluster_downgrade_test.go

+63-7
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,47 @@ import (
3737
"go.etcd.io/etcd/tests/v3/framework/e2e"
3838
)
3939

40+
type CancellationState int
41+
42+
const (
43+
noCancellation CancellationState = iota
44+
cancelRightBeforeEnable
45+
cancelRightAfterEnable
46+
)
47+
4048
func TestDowngradeUpgradeClusterOf1(t *testing.T) {
41-
testDowngradeUpgrade(t, 1, false)
49+
testDowngradeUpgrade(t, 1, false, noCancellation)
4250
}
4351

4452
func TestDowngradeUpgradeClusterOf3(t *testing.T) {
45-
testDowngradeUpgrade(t, 3, false)
53+
testDowngradeUpgrade(t, 3, false, noCancellation)
4654
}
4755

4856
func TestDowngradeUpgradeClusterOf1WithSnapshot(t *testing.T) {
49-
testDowngradeUpgrade(t, 1, true)
57+
testDowngradeUpgrade(t, 1, true, noCancellation)
5058
}
5159

5260
func TestDowngradeUpgradeClusterOf3WithSnapshot(t *testing.T) {
53-
testDowngradeUpgrade(t, 3, true)
61+
testDowngradeUpgrade(t, 3, true, noCancellation)
62+
}
63+
64+
func TestDowngradeCancellationWithoutEnablingClusterOf1(t *testing.T) {
65+
testDowngradeUpgrade(t, 1, false, cancelRightBeforeEnable)
66+
}
67+
68+
func TestDowngradeCancellationRightAfterEnablingClusterOf1(t *testing.T) {
69+
testDowngradeUpgrade(t, 1, false, cancelRightAfterEnable)
70+
}
71+
72+
func TestDowngradeCancellationWithoutEnablingClusterOf3(t *testing.T) {
73+
testDowngradeUpgrade(t, 3, false, cancelRightBeforeEnable)
5474
}
5575

56-
func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool) {
76+
func TestDowngradeCancellationRightAfterEnablingClusterOf3(t *testing.T) {
77+
testDowngradeUpgrade(t, 3, false, cancelRightAfterEnable)
78+
}
79+
80+
func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool, triggerCancellation CancellationState) {
5781
currentEtcdBinary := e2e.BinPath.Etcd
5882
lastReleaseBinary := e2e.BinPath.EtcdLastRelease
5983
if !fileutil.Exist(lastReleaseBinary) {
@@ -107,9 +131,26 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool) {
107131
require.NoError(t, err)
108132
beforeMembers, beforeKV := getMembersAndKeys(t, cc)
109133

134+
if triggerCancellation == cancelRightBeforeEnable {
135+
t.Logf("Cancelling downgrade before enabling")
136+
e2e.DowngradeCancel(t, epc)
137+
t.Log("Downgrade cancelled, validating if cluster is in the right state")
138+
e2e.ValidateMemberVersions(t, epc, generateIdenticalVersions(clusterSize, currentVersionStr))
139+
140+
return // No need to perform downgrading, end the test here
141+
}
110142
e2e.DowngradeEnable(t, epc, lastVersion)
143+
if triggerCancellation == cancelRightAfterEnable {
144+
t.Logf("Cancelling downgrade right after enabling (no node is downgraded yet)")
145+
e2e.DowngradeCancel(t, epc)
146+
t.Log("Downgrade cancelled, validating if cluster is in the right state")
147+
e2e.ValidateMemberVersions(t, epc, generateIdenticalVersions(clusterSize, currentVersionStr))
148+
return // No need to perform downgrading, end the test here
149+
}
150+
111151
t.Logf("Starting downgrade process to %q", lastVersionStr)
112-
e2e.DowngradeUpgradeMembers(t, nil, epc, len(epc.Procs), currentVersion, lastClusterVersion)
152+
err = e2e.DowngradeUpgradeMembers(t, nil, epc, len(epc.Procs), currentVersion, lastClusterVersion)
153+
require.NoError(t, err)
113154
e2e.AssertProcessLogs(t, leader(t, epc), "the cluster has been downgraded")
114155

115156
t.Log("Downgrade complete")
@@ -135,7 +176,8 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool) {
135176
beforeMembers, beforeKV = getMembersAndKeys(t, cc)
136177

137178
t.Logf("Starting upgrade process to %q", currentVersionStr)
138-
e2e.DowngradeUpgradeMembers(t, nil, epc, len(epc.Procs), lastClusterVersion, currentVersion)
179+
err = e2e.DowngradeUpgradeMembers(t, nil, epc, len(epc.Procs), lastClusterVersion, currentVersion)
180+
require.NoError(t, err)
139181
t.Log("Upgrade complete")
140182

141183
afterMembers, afterKV = getMembersAndKeys(t, cc)
@@ -233,3 +275,17 @@ func getMembersAndKeys(t *testing.T, cc *e2e.EtcdctlV3) (*clientv3.MemberListRes
233275

234276
return members, kvs
235277
}
278+
279+
func generateIdenticalVersions(clusterSize int, currentVersion string) []*version.Versions {
280+
ret := make([]*version.Versions, clusterSize)
281+
282+
for i := range clusterSize {
283+
ret[i] = &version.Versions{
284+
Cluster: currentVersion,
285+
Server: currentVersion,
286+
Storage: currentVersion,
287+
}
288+
}
289+
290+
return ret
291+
}

tests/framework/e2e/downgrade.go

+18
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ func DowngradeEnable(t *testing.T, epc *EtcdProcessCluster, ver *semver.Version)
5353
t.Log("Cluster is ready for downgrade")
5454
}
5555

56+
func DowngradeCancel(t *testing.T, epc *EtcdProcessCluster) {
57+
t.Logf("etcdctl downgrade cancel")
58+
c := epc.Etcdctl()
59+
testutils.ExecuteWithTimeout(t, 20*time.Second, func() {
60+
err := c.DowngradeCancel(context.TODO())
61+
require.NoError(t, err)
62+
})
63+
64+
t.Log("Cluster downgrade cancellation is completed")
65+
}
66+
5667
func DowngradeUpgradeMembers(t *testing.T, lg *zap.Logger, clus *EtcdProcessCluster, numberOfMembersToChange int, currentVersion, targetVersion *semver.Version) error {
5768
if lg == nil {
5869
lg = clus.lg
@@ -104,6 +115,13 @@ func DowngradeUpgradeMembers(t *testing.T, lg *zap.Logger, clus *EtcdProcessClus
104115
return nil
105116
}
106117

118+
func ValidateMemberVersions(t *testing.T, epc *EtcdProcessCluster, expect []*version.Versions) {
119+
for i := 0; i < len(epc.Procs); i++ {
120+
ValidateVersion(t, epc.Cfg, epc.Procs[i], *expect[i])
121+
}
122+
t.Log("Cluster member version validation after downgrade cancellation is completed")
123+
}
124+
107125
func ValidateVersion(t *testing.T, cfg *EtcdProcessClusterConfig, member EtcdProcess, expect version.Versions) {
108126
testutils.ExecuteWithTimeout(t, 30*time.Second, func() {
109127
for {

tests/framework/e2e/etcdctl.go

+5
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ func (ctl *EtcdctlV3) DowngradeEnable(ctx context.Context, version string) error
8686
return err
8787
}
8888

89+
func (ctl *EtcdctlV3) DowngradeCancel(ctx context.Context) error {
90+
_, err := SpawnWithExpectLines(ctx, ctl.cmdArgs("downgrade", "cancel"), nil, expect.ExpectedResponse{Value: "Downgrade cancel success"})
91+
return err
92+
}
93+
8994
func (ctl *EtcdctlV3) Get(ctx context.Context, key string, o config.GetOptions) (*clientv3.GetResponse, error) {
9095
resp := clientv3.GetResponse{}
9196
var args []string

0 commit comments

Comments
 (0)