Merge pull request #125551 from p0lyn0mial/upstream-hack-for-test-that-request-watch-progress

storage/cacher/cacher_whitebox_test.go: deflake tests that require storage.RequestWatchProgress
This commit is contained in:
Kubernetes Prow Robot 2024-06-19 07:38:41 -07:00 committed by GitHub
commit ccbe92982d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -46,6 +46,7 @@ import (
"k8s.io/apiserver/pkg/features"
"k8s.io/apiserver/pkg/storage"
etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
etcdfeature "k8s.io/apiserver/pkg/storage/feature"
utilfeature "k8s.io/apiserver/pkg/util/feature"
featuregatetesting "k8s.io/component-base/featuregate/testing"
"k8s.io/utils/clock"
@ -221,6 +222,15 @@ func TestGetListCacheBypass(t *testing.T) {
})
t.Run("ConsistentListFromCache", func(t *testing.T) {
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ConsistentListFromCache, true)
// TODO(p0lyn0mial): the following tests assume that etcdfeature.DefaultFeatureSupportChecker.Supports(storage.RequestWatchProgress)
// evaluates to true. Otherwise the cache will be bypassed and the test will fail.
//
// If you were to run only TestGetListCacheBypass you would see that the test fail.
// However in CI all test are run and there must be a test(s) that properly
// initialize the storage layer so that the mentioned method evaluates to true
forceRequestWatchProgressSupport(t)
testCases := append(commonTestCases,
testCase{opts: storage.ListOptions{ResourceVersion: ""}, expectBypass: false},
)
@ -1741,6 +1751,7 @@ func TestCacheIntervalInvalidationStopsWatch(t *testing.T) {
func TestWaitUntilWatchCacheFreshAndForceAllEvents(t *testing.T) {
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.WatchList, true)
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ConsistentListFromCache, true)
forceRequestWatchProgressSupport(t)
scenarios := []struct {
name string
@ -2584,3 +2595,22 @@ func watchAndWaitForBookmark(t *testing.T, ctx context.Context, etcdStorage stor
return rv
}
}
// TODO(p0lyn0mial): forceRequestWatchProgressSupport inits the storage layer
// so that tests that require storage.RequestWatchProgress pass
//
// In the future we could have a function that would allow for setting the feature
// only for duration of a test.
func forceRequestWatchProgressSupport(t *testing.T) {
if etcdfeature.DefaultFeatureSupportChecker.Supports(storage.RequestWatchProgress) {
return
}
server, _ := newEtcdTestStorage(t, etcd3testing.PathPrefix())
defer server.Terminate(t)
if err := wait.PollUntilContextTimeout(context.Background(), 100*time.Millisecond, wait.ForeverTestTimeout, true, func(_ context.Context) (bool, error) {
return etcdfeature.DefaultFeatureSupportChecker.Supports(storage.RequestWatchProgress), nil
}); err != nil {
t.Fatalf("failed to wait for required %v storage feature to initialize", storage.RequestWatchProgress)
}
}