Graduate RemainingItemCount to GA
This commit is contained in:
@@ -265,7 +265,7 @@ fi
|
||||
RUN_CCM_CONTROLLERS="${RUN_CCM_CONTROLLERS:-*,-gkenetworkparamset}"
|
||||
|
||||
# List of the set of feature gates recognized by the GCP CCM
|
||||
export CCM_FEATURE_GATES="APIPriorityAndFairness,APIResponseCompression,APIServerIdentity,APIServerTracing,AllAlpha,AllBeta,CustomResourceValidationExpressions,KMSv2,OpenAPIEnums,OpenAPIV3,RemainingItemCount,ServerSideFieldValidation,StorageVersionAPI,StorageVersionHash"
|
||||
export CCM_FEATURE_GATES="APIPriorityAndFairness,APIResponseCompression,APIServerIdentity,APIServerTracing,AllAlpha,AllBeta,CustomResourceValidationExpressions,KMSv2,OpenAPIEnums,OpenAPIV3,ServerSideFieldValidation,StorageVersionAPI,StorageVersionHash"
|
||||
|
||||
# Optional: set feature gates
|
||||
# shellcheck disable=SC2034 # Variables sourced in other scripts.
|
||||
|
@@ -316,7 +316,7 @@ if [[ -n "${NODE_ACCELERATORS}" ]]; then
|
||||
fi
|
||||
|
||||
# List of the set of feature gates recognized by the GCP CCM
|
||||
export CCM_FEATURE_GATES="APIPriorityAndFairness,APIResponseCompression,APIServerIdentity,APIServerTracing,AllAlpha,AllBeta,CustomResourceValidationExpressions,KMSv2,OpenAPIEnums,OpenAPIV3,RemainingItemCount,ServerSideFieldValidation,StorageVersionAPI,StorageVersionHash"
|
||||
export CCM_FEATURE_GATES="APIPriorityAndFairness,APIResponseCompression,APIServerIdentity,APIServerTracing,AllAlpha,AllBeta,CustomResourceValidationExpressions,KMSv2,OpenAPIEnums,OpenAPIV3,ServerSideFieldValidation,StorageVersionAPI,StorageVersionHash"
|
||||
|
||||
# Optional: Install cluster DNS.
|
||||
# Set CLUSTER_DNS_CORE_DNS to 'false' to install kube-dns instead of CoreDNS.
|
||||
|
@@ -147,6 +147,7 @@ const (
|
||||
// owner: @caesarxuchao
|
||||
// alpha: v1.15
|
||||
// beta: v1.16
|
||||
// stable: 1.29
|
||||
//
|
||||
// Allow apiservers to show a count of remaining items in the response
|
||||
// to a chunking list request.
|
||||
@@ -256,7 +257,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
||||
|
||||
OpenAPIV3: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.29
|
||||
|
||||
RemainingItemCount: {Default: true, PreRelease: featuregate.Beta},
|
||||
RemainingItemCount: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.32
|
||||
|
||||
RemoveSelfLink: {Default: true, PreRelease: featuregate.GA, LockToDefault: true},
|
||||
|
||||
|
@@ -40,11 +40,9 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/watch"
|
||||
"k8s.io/apiserver/pkg/audit"
|
||||
"k8s.io/apiserver/pkg/features"
|
||||
"k8s.io/apiserver/pkg/storage"
|
||||
"k8s.io/apiserver/pkg/storage/etcd3/metrics"
|
||||
"k8s.io/apiserver/pkg/storage/value"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
"k8s.io/component-base/tracing"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
@@ -826,11 +824,9 @@ func (s *store) GetList(ctx context.Context, key string, opts storage.ListOption
|
||||
// getResp.Count counts in objects that do not match the pred.
|
||||
// Instead of returning inaccurate count for non-empty selectors, we return nil.
|
||||
// Only set remainingItemCount if the predicate is empty.
|
||||
if utilfeature.DefaultFeatureGate.Enabled(features.RemainingItemCount) {
|
||||
if pred.Empty() {
|
||||
c := int64(getResp.Count - pred.Limit)
|
||||
remainingItemCount = &c
|
||||
}
|
||||
if pred.Empty() {
|
||||
c := int64(getResp.Count - pred.Limit)
|
||||
remainingItemCount = &c
|
||||
}
|
||||
return s.versioner.UpdateList(listObj, uint64(returnedRV), next, remainingItemCount)
|
||||
}
|
||||
|
@@ -36,11 +36,8 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/watch"
|
||||
"k8s.io/apiserver/pkg/apis/example"
|
||||
"k8s.io/apiserver/pkg/features"
|
||||
"k8s.io/apiserver/pkg/storage"
|
||||
"k8s.io/apiserver/pkg/storage/value"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
utilpointer "k8s.io/utils/pointer"
|
||||
)
|
||||
|
||||
@@ -479,8 +476,6 @@ func RunTestPreconditionalDeleteWithSuggestion(ctx context.Context, t *testing.T
|
||||
}
|
||||
|
||||
func RunTestList(ctx context.Context, t *testing.T, store storage.Interface, compaction Compaction, ignoreWatchCacheTests bool) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemainingItemCount, true)()
|
||||
|
||||
initialRV, preset, err := seedMultiLevelData(ctx, store)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -1113,8 +1108,6 @@ func RunTestList(ctx context.Context, t *testing.T, store storage.Interface, com
|
||||
}
|
||||
|
||||
func RunTestListWithoutPaging(ctx context.Context, t *testing.T, store storage.Interface) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RemainingItemCount, true)()
|
||||
|
||||
_, preset, err := seedMultiLevelData(ctx, store)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
@@ -30,18 +30,12 @@ import (
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
"k8s.io/apiserver/pkg/features"
|
||||
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
"k8s.io/client-go/util/workqueue"
|
||||
"k8s.io/kubernetes/test/e2e/framework"
|
||||
admissionapi "k8s.io/pod-security-admission/api"
|
||||
)
|
||||
|
||||
func shouldCheckRemainingItem() bool {
|
||||
return utilfeature.DefaultFeatureGate.Enabled(features.RemainingItemCount)
|
||||
}
|
||||
|
||||
const numberOfTotalResources = 400
|
||||
|
||||
var _ = SIGDescribe("Servers with support for API chunking", func() {
|
||||
@@ -96,13 +90,11 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
|
||||
lastRV = list.ResourceVersion
|
||||
}
|
||||
framework.ExpectEqual(list.ResourceVersion, lastRV)
|
||||
if shouldCheckRemainingItem() {
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
for _, item := range list.Items {
|
||||
framework.ExpectEqual(item.Name, fmt.Sprintf("template-%04d", found))
|
||||
@@ -136,13 +128,11 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
|
||||
framework.ExpectNoError(err, "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
|
||||
firstToken := list.Continue
|
||||
firstRV := list.ResourceVersion
|
||||
if shouldCheckRemainingItem() {
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items)).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items)).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, firstToken)
|
||||
|
||||
@@ -179,13 +169,11 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
|
||||
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("==", opts.Limit))
|
||||
found := int(oneTenth)
|
||||
|
||||
if shouldCheckRemainingItem() {
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
for _, item := range list.Items {
|
||||
framework.ExpectEqual(item.Name, fmt.Sprintf("template-%04d", found))
|
||||
@@ -198,13 +186,11 @@ var _ = SIGDescribe("Servers with support for API chunking", func() {
|
||||
for {
|
||||
list, err := client.List(ctx, opts)
|
||||
framework.ExpectNoError(err, "failed to list pod templates in namespace: %s, given limit: %d", ns, opts.Limit)
|
||||
if shouldCheckRemainingItem() {
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
if list.GetContinue() == "" {
|
||||
gomega.Expect(list.GetRemainingItemCount()).To(gomega.BeNil())
|
||||
} else {
|
||||
gomega.Expect(list.GetRemainingItemCount()).ToNot(gomega.BeNil())
|
||||
gomega.Expect(int(*list.GetRemainingItemCount()) + len(list.Items) + found).To(gomega.BeNumerically("==", numberOfTotalResources))
|
||||
}
|
||||
framework.Logf("Retrieved %d/%d results with rv %s and continue %s", len(list.Items), opts.Limit, list.ResourceVersion, list.Continue)
|
||||
gomega.Expect(len(list.Items)).To(gomega.BeNumerically("<=", opts.Limit))
|
||||
|
Reference in New Issue
Block a user