@@ -37,23 +37,47 @@ import (
37
37
"go.etcd.io/etcd/tests/v3/framework/e2e"
38
38
)
39
39
40
+ type CancellationState int
41
+
42
+ const (
43
+ noCancellation CancellationState = iota
44
+ cancelRightBeforeEnable
45
+ cancelRightAfterEnable
46
+ )
47
+
40
48
func TestDowngradeUpgradeClusterOf1 (t * testing.T ) {
41
- testDowngradeUpgrade (t , 1 , false )
49
+ testDowngradeUpgrade (t , 1 , false , noCancellation )
42
50
}
43
51
44
52
func TestDowngradeUpgradeClusterOf3 (t * testing.T ) {
45
- testDowngradeUpgrade (t , 3 , false )
53
+ testDowngradeUpgrade (t , 3 , false , noCancellation )
46
54
}
47
55
48
56
func TestDowngradeUpgradeClusterOf1WithSnapshot (t * testing.T ) {
49
- testDowngradeUpgrade (t , 1 , true )
57
+ testDowngradeUpgrade (t , 1 , true , noCancellation )
50
58
}
51
59
52
60
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 )
54
74
}
55
75
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 ) {
57
81
currentEtcdBinary := e2e .BinPath .Etcd
58
82
lastReleaseBinary := e2e .BinPath .EtcdLastRelease
59
83
if ! fileutil .Exist (lastReleaseBinary ) {
@@ -107,9 +131,26 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool) {
107
131
require .NoError (t , err )
108
132
beforeMembers , beforeKV := getMembersAndKeys (t , cc )
109
133
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
+ }
110
142
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
+
111
151
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 )
113
154
e2e .AssertProcessLogs (t , leader (t , epc ), "the cluster has been downgraded" )
114
155
115
156
t .Log ("Downgrade complete" )
@@ -135,7 +176,8 @@ func testDowngradeUpgrade(t *testing.T, clusterSize int, triggerSnapshot bool) {
135
176
beforeMembers , beforeKV = getMembersAndKeys (t , cc )
136
177
137
178
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 )
139
181
t .Log ("Upgrade complete" )
140
182
141
183
afterMembers , afterKV = getMembersAndKeys (t , cc )
@@ -233,3 +275,17 @@ func getMembersAndKeys(t *testing.T, cc *e2e.EtcdctlV3) (*clientv3.MemberListRes
233
275
234
276
return members , kvs
235
277
}
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
+ }
0 commit comments