client-go/util/consistencydetector: make the detector public

Kubernetes-commit: e421046f64c90b58577a79f92dd463ab03479d79
This commit is contained in:
Lukasz Szaszkiewicz 2024-05-27 11:16:17 +02:00 committed by Kubernetes Publisher
parent 92f0985ce1
commit e6e45e172b
2 changed files with 9 additions and 9 deletions

View File

@ -39,9 +39,9 @@ func init() {
dataConsistencyDetectionForWatchListEnabled, _ = strconv.ParseBool(os.Getenv("KUBE_WATCHLIST_INCONSISTENCY_DETECTOR")) dataConsistencyDetectionForWatchListEnabled, _ = strconv.ParseBool(os.Getenv("KUBE_WATCHLIST_INCONSISTENCY_DETECTOR"))
} }
type retrieveItemsFunc[U any] func() []U type RetrieveItemsFunc[U any] func() []U
type listFunc[T runtime.Object] func(ctx context.Context, options metav1.ListOptions) (T, error) type ListFunc[T runtime.Object] func(ctx context.Context, options metav1.ListOptions) (T, error)
// checkWatchListDataConsistencyIfRequested performs a data consistency check only when // checkWatchListDataConsistencyIfRequested performs a data consistency check only when
// the KUBE_WATCHLIST_INCONSISTENCY_DETECTOR environment variable was set during a binary startup. // the KUBE_WATCHLIST_INCONSISTENCY_DETECTOR environment variable was set during a binary startup.
@ -52,21 +52,21 @@ type listFunc[T runtime.Object] func(ctx context.Context, options metav1.ListOpt
// //
// Note that this function will panic when data inconsistency is detected. // Note that this function will panic when data inconsistency is detected.
// This is intentional because we want to catch it in the CI. // This is intentional because we want to catch it in the CI.
func checkWatchListDataConsistencyIfRequested[T runtime.Object, U any](ctx context.Context, identity string, lastSyncedResourceVersion string, listFn listFunc[T], retrieveItemsFn retrieveItemsFunc[U]) { func checkWatchListDataConsistencyIfRequested[T runtime.Object, U any](ctx context.Context, identity string, lastSyncedResourceVersion string, listFn ListFunc[T], retrieveItemsFn RetrieveItemsFunc[U]) {
if !dataConsistencyDetectionForWatchListEnabled { if !dataConsistencyDetectionForWatchListEnabled {
return return
} }
// for informers we pass an empty ListOptions because // for informers we pass an empty ListOptions because
// listFn might be wrapped for filtering during informer construction. // listFn might be wrapped for filtering during informer construction.
checkDataConsistency(ctx, identity, lastSyncedResourceVersion, listFn, metav1.ListOptions{}, retrieveItemsFn) CheckDataConsistency(ctx, identity, lastSyncedResourceVersion, listFn, metav1.ListOptions{}, retrieveItemsFn)
} }
// checkDataConsistency exists solely for testing purposes. // CheckDataConsistency exists solely for testing purposes.
// we cannot use checkWatchListDataConsistencyIfRequested because // we cannot use checkWatchListDataConsistencyIfRequested because
// it is guarded by an environmental variable. // it is guarded by an environmental variable.
// we cannot manipulate the environmental variable because // we cannot manipulate the environmental variable because
// it will affect other tests in this package. // it will affect other tests in this package.
func checkDataConsistency[T runtime.Object, U any](ctx context.Context, identity string, lastSyncedResourceVersion string, listFn listFunc[T], listOptions metav1.ListOptions, retrieveItemsFn retrieveItemsFunc[U]) { func CheckDataConsistency[T runtime.Object, U any](ctx context.Context, identity string, lastSyncedResourceVersion string, listFn ListFunc[T], listOptions metav1.ListOptions, retrieveItemsFn RetrieveItemsFunc[U]) {
klog.Warningf("data consistency check for %s is enabled, this will result in an additional call to the API server.", identity) klog.Warningf("data consistency check for %s is enabled, this will result in an additional call to the API server.", identity)
listOptions.ResourceVersion = lastSyncedResourceVersion listOptions.ResourceVersion = lastSyncedResourceVersion
listOptions.ResourceVersionMatch = metav1.ResourceVersionMatchExact listOptions.ResourceVersionMatch = metav1.ResourceVersionMatchExact

View File

@ -106,10 +106,10 @@ func TestDataConsistencyChecker(t *testing.T) {
if scenario.expectPanic { if scenario.expectPanic {
require.Panics(t, func() { require.Panics(t, func() {
checkDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc) CheckDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
}) })
} else { } else {
checkDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc) CheckDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
} }
require.Equal(t, fakeLister.counter, scenario.expectedListRequests) require.Equal(t, fakeLister.counter, scenario.expectedListRequests)
@ -131,7 +131,7 @@ func TestDataConsistencyCheckerRetry(t *testing.T) {
stopListErrorAfter := 5 stopListErrorAfter := 5
fakeErrLister := &errorLister{stopErrorAfter: stopListErrorAfter} fakeErrLister := &errorLister{stopErrorAfter: stopListErrorAfter}
checkDataConsistency(ctx, "", "", fakeErrLister.List, metav1.ListOptions{}, retrievedItemsFunc) CheckDataConsistency(ctx, "", "", fakeErrLister.List, metav1.ListOptions{}, retrievedItemsFunc)
require.Equal(t, fakeErrLister.listCounter, fakeErrLister.stopErrorAfter) require.Equal(t, fakeErrLister.listCounter, fakeErrLister.stopErrorAfter)
} }