@@ -27,6 +27,7 @@ import (
27
27
"go.etcd.io/etcd/api/v3/version"
28
28
"go.etcd.io/etcd/client/pkg/v3/fileutil"
29
29
"go.etcd.io/etcd/pkg/v3/expect"
30
+ "go.etcd.io/etcd/tests/v3/framework/config"
30
31
"go.etcd.io/etcd/tests/v3/framework/e2e"
31
32
)
32
33
@@ -166,3 +167,59 @@ func TestReleaseUpgradeWithRestart(t *testing.T) {
166
167
167
168
require .NoError (t , ctlV3Get (cx , []string {kvs [0 ].key }, []kv {kvs [0 ]}... ))
168
169
}
170
+
171
+ func TestClusterUpgradeAfterPromotingMembers (t * testing.T ) {
172
+ if ! fileutil .Exist (e2e .BinPath .EtcdLastRelease ) {
173
+ t .Skipf ("%q does not exist" , e2e .BinPath .EtcdLastRelease )
174
+ }
175
+
176
+ e2e .BeforeTest (t )
177
+
178
+ currentVersion , err := e2e .GetVersionFromBinary (e2e .BinPath .Etcd )
179
+ require .NoErrorf (t , err , "failed to get version from binary" )
180
+
181
+ lastClusterVersion , err := e2e .GetVersionFromBinary (e2e .BinPath .EtcdLastRelease )
182
+ require .NoErrorf (t , err , "failed to get version from last release binary" )
183
+
184
+ clusterSize := 3
185
+
186
+ for _ , tc := range []struct {
187
+ name string
188
+ snapshot int
189
+ }{
190
+ {
191
+ name : "create snapshot after promoted" ,
192
+ snapshot : 10 ,
193
+ },
194
+ {
195
+ name : "no snapshot after promoted" ,
196
+ },
197
+ } {
198
+ t .Run (tc .name , func (t * testing.T ) {
199
+ ctx := context .Background ()
200
+
201
+ epc , _ := mustCreateNewClusterByPromotingMembers (t , e2e .LastVersion , clusterSize ,
202
+ e2e .WithSnapshotCount (uint64 (tc .snapshot )))
203
+ defer func () {
204
+ require .NoError (t , epc .Close ())
205
+ }()
206
+
207
+ for i := 0 ; i < tc .snapshot ; i ++ {
208
+ err = epc .Etcdctl ().Put (ctx , "foo" , "bar" , config.PutOptions {})
209
+ require .NoError (t , err )
210
+ }
211
+
212
+ err = e2e .DowngradeUpgradeMembers (t , nil , epc , clusterSize , false , lastClusterVersion , currentVersion )
213
+ require .NoError (t , err )
214
+
215
+ t .Logf ("Checking all members' status after upgrading" )
216
+ ensureAllMembersAreVotingMembers (t , epc )
217
+
218
+ t .Logf ("Checking all members are ready to serve client requests" )
219
+ for i := 0 ; i < clusterSize ; i ++ {
220
+ err = epc .Procs [i ].Etcdctl ().Put (context .Background (), "foo" , "bar" , config.PutOptions {})
221
+ require .NoError (t , err )
222
+ }
223
+ })
224
+ }
225
+ }
0 commit comments