@@ -29,10 +29,11 @@ import (
29
29
"time"
30
30
31
31
apps "k8s.io/api/apps/v1"
32
- "k8s.io/api/core/v1"
32
+ v1 "k8s.io/api/core/v1"
33
33
apierrors "k8s.io/apimachinery/pkg/api/errors"
34
34
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35
35
"k8s.io/apimachinery/pkg/labels"
36
+ utilerrors "k8s.io/apimachinery/pkg/util/errors"
36
37
"k8s.io/client-go/informers"
37
38
appsinformers "k8s.io/client-go/informers/apps/v1"
38
39
coreinformers "k8s.io/client-go/informers/core/v1"
@@ -302,7 +303,7 @@ func CreatePodFailure(t *testing.T, set *apps.StatefulSet, invariants invariantF
302
303
defer close (stop )
303
304
spc .SetCreateStatefulPodError (apierrors .NewInternalError (errors .New ("API server failed" )), 2 )
304
305
305
- if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); ! apierrors . IsInternalError (err ) {
306
+ if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); err != nil && isOrHasInternalError (err ) {
306
307
t .Errorf ("StatefulSetControl did not return InternalError found %s" , err )
307
308
}
308
309
if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); err != nil {
@@ -362,7 +363,7 @@ func UpdatePodFailure(t *testing.T, set *apps.StatefulSet, invariants invariantF
362
363
spc .podsIndexer .Update (pods [0 ])
363
364
364
365
// now it should fail
365
- if err := ssc .UpdateStatefulSet (set , pods ); ! apierrors . IsInternalError (err ) {
366
+ if err := ssc .UpdateStatefulSet (set , pods ); err != nil && isOrHasInternalError (err ) {
366
367
t .Errorf ("StatefulSetControl did not return InternalError found %s" , err )
367
368
}
368
369
}
@@ -373,7 +374,7 @@ func UpdateSetStatusFailure(t *testing.T, set *apps.StatefulSet, invariants inva
373
374
defer close (stop )
374
375
ssu .SetUpdateStatefulSetStatusError (apierrors .NewInternalError (errors .New ("API server failed" )), 2 )
375
376
376
- if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); ! apierrors . IsInternalError (err ) {
377
+ if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); err != nil && isOrHasInternalError (err ) {
377
378
t .Errorf ("StatefulSetControl did not return InternalError found %s" , err )
378
379
}
379
380
if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); err != nil {
@@ -421,7 +422,7 @@ func PodRecreateDeleteFailure(t *testing.T, set *apps.StatefulSet, invariants in
421
422
pods [0 ].Status .Phase = v1 .PodFailed
422
423
spc .podsIndexer .Update (pods [0 ])
423
424
spc .SetDeleteStatefulPodError (apierrors .NewInternalError (errors .New ("API server failed" )), 0 )
424
- if err := ssc .UpdateStatefulSet (set , pods ); ! apierrors . IsInternalError (err ) {
425
+ if err := ssc .UpdateStatefulSet (set , pods ); err != nil && isOrHasInternalError (err ) {
425
426
t .Errorf ("StatefulSet failed to %s" , err )
426
427
}
427
428
if err := invariants (set , spc ); err != nil {
@@ -459,7 +460,7 @@ func TestStatefulSetControlScaleDownDeleteError(t *testing.T) {
459
460
}
460
461
* set .Spec .Replicas = 0
461
462
spc .SetDeleteStatefulPodError (apierrors .NewInternalError (errors .New ("API server failed" )), 2 )
462
- if err := scaleDownStatefulSetControl (set , ssc , spc , invariants ); ! apierrors . IsInternalError (err ) {
463
+ if err := scaleDownStatefulSetControl (set , ssc , spc , invariants ); err != nil && isOrHasInternalError (err ) {
463
464
t .Errorf ("StatefulSetControl failed to throw error on delete %s" , err )
464
465
}
465
466
if err := scaleDownStatefulSetControl (set , ssc , spc , invariants ); err != nil {
@@ -1201,6 +1202,42 @@ func TestStatefulSetControlRollingUpdateWithPartition(t *testing.T) {
1201
1202
}
1202
1203
}
1203
1204
1205
+ func TestStatefulSetHonorRevisionHistoryLimit (t * testing.T ) {
1206
+ invariants := assertMonotonicInvariants
1207
+ set := newStatefulSet (3 )
1208
+ client := fake .NewSimpleClientset (set )
1209
+ spc , ssu , ssc , stop := setupController (client )
1210
+ defer close (stop )
1211
+
1212
+ if err := scaleUpStatefulSetControl (set , ssc , spc , invariants ); err != nil {
1213
+ t .Errorf ("Failed to turn up StatefulSet : %s" , err )
1214
+ }
1215
+ var err error
1216
+ set , err = spc .setsLister .StatefulSets (set .Namespace ).Get (set .Name )
1217
+ if err != nil {
1218
+ t .Fatalf ("Error getting updated StatefulSet: %v" , err )
1219
+ }
1220
+
1221
+ for i := 0 ; i < int (* set .Spec .RevisionHistoryLimit )+ 5 ; i ++ {
1222
+ set .Spec .Template .Spec .Containers [0 ].Image = fmt .Sprintf ("foo-%d" , i )
1223
+ ssu .SetUpdateStatefulSetStatusError (apierrors .NewInternalError (errors .New ("API server failed" )), 2 )
1224
+ updateStatefulSetControl (set , ssc , spc , assertUpdateInvariants )
1225
+ set , err = spc .setsLister .StatefulSets (set .Namespace ).Get (set .Name )
1226
+ if err != nil {
1227
+ t .Fatalf ("Error getting updated StatefulSet: %v" , err )
1228
+ }
1229
+ revisions , err := ssc .ListRevisions (set )
1230
+ if err != nil {
1231
+ t .Fatalf ("Error listing revisions: %v" , err )
1232
+ }
1233
+ // the extra 2 revisions are `currentRevision` and `updateRevision`
1234
+ // They're considered as `live`, and truncateHistory only cleans up non-live revisions
1235
+ if len (revisions ) > int (* set .Spec .RevisionHistoryLimit )+ 2 {
1236
+ t .Fatalf ("%s: %d greater than limit %d" , "" , len (revisions ), * set .Spec .RevisionHistoryLimit )
1237
+ }
1238
+ }
1239
+ }
1240
+
1204
1241
func TestStatefulSetControlLimitsHistory (t * testing.T ) {
1205
1242
type testcase struct {
1206
1243
name string
@@ -2135,3 +2172,8 @@ func newRevisionOrDie(set *apps.StatefulSet, revision int64) *apps.ControllerRev
2135
2172
}
2136
2173
return rev
2137
2174
}
2175
+
2176
+ func isOrHasInternalError (err error ) bool {
2177
+ agg , ok := err .(utilerrors.Aggregate )
2178
+ return ! ok && ! apierrors .IsInternalError (err ) || ok && len (agg .Errors ()) > 0 && ! apierrors .IsInternalError (agg .Errors ()[0 ])
2179
+ }
0 commit comments