Skip to content

Commit 7a5a09e

Browse files
committed
FIXME: break this up
1 parent a05f1e5 commit 7a5a09e

File tree

11 files changed

+44
-20
lines changed

11 files changed

+44
-20
lines changed

cmd/kube-controller-manager/app/storageversionmigrator.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ import (
2626
"k8s.io/controller-manager/controller"
2727
"k8s.io/kubernetes/cmd/kube-controller-manager/names"
2828
"k8s.io/kubernetes/pkg/features"
29+
"k8s.io/utils/feature"
2930

30-
utilfeature "k8s.io/apiserver/pkg/util/feature"
31+
oldutilfeature "k8s.io/apiserver/pkg/util/feature"
3132
clientgofeaturegate "k8s.io/client-go/features"
3233
svm "k8s.io/kubernetes/pkg/controller/storageversionmigrator"
3334
)
@@ -45,8 +46,8 @@ func startSVMController(
4546
controllerContext ControllerContext,
4647
controllerName string,
4748
) (controller.Interface, bool, error) {
48-
if !utilfeature.DefaultFeatureGate.Enabled(features.StorageVersionMigrator) ||
49-
!clientgofeaturegate.FeatureGates().Enabled(clientgofeaturegate.InformerResourceVersion) {
49+
if !oldutilfeature.DefaultFeatureGate.Enabled(features.StorageVersionMigrator) &&
50+
!feature.Enabled(clientgofeaturegate.InformerResourceVersion3) {
5051
return nil, false, nil
5152
}
5253

cmd/kube-controller-manager/controller-manager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import (
2424
"os"
2525
_ "time/tzdata" // for CronJob Time Zone support
2626

27+
clientfeatures "k8s.io/client-go/features"
28+
2729
"k8s.io/component-base/cli"
2830
_ "k8s.io/component-base/logs/json/register" // for JSON log format registration
2931
_ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugin
@@ -32,6 +34,9 @@ import (
3234
)
3335

3436
func main() {
37+
// FIXME: Example, do not merge
38+
clientfeatures.WatchListClient3.Set(true)
39+
3540
command := app.NewControllerManagerCommand()
3641
code := cli.Run(command)
3742
os.Exit(code)

pkg/api/pod/util.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/kubernetes/pkg/apis/core/helper"
3030
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
3131
"k8s.io/kubernetes/pkg/features"
32+
"k8s.io/utils/feature"
3233
)
3334

3435
// ContainerType signifies container type
@@ -685,7 +686,8 @@ func dropDisabledFields(
685686
// For other types of containers, validateContainers will handle them.
686687
}
687688

688-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) && !rroInUse(oldPodSpec) {
689+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
690+
!feature.Enabled(features.RecursiveReadOnlyMounts3) && !rroInUse(oldPodSpec) {
689691
for i := range podSpec.Containers {
690692
for j := range podSpec.Containers[i].VolumeMounts {
691693
podSpec.Containers[i].VolumeMounts[j].RecursiveReadOnly = nil
@@ -809,7 +811,8 @@ func dropDisabledPodStatusFields(podStatus, oldPodStatus *api.PodStatus, podSpec
809811
podStatus.HostIPs = nil
810812
}
811813

812-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) && !rroInUse(oldPodSpec) {
814+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
815+
!feature.Enabled(features.RecursiveReadOnlyMounts3) && !rroInUse(oldPodSpec) {
813816
for i := range podStatus.ContainerStatuses {
814817
podStatus.ContainerStatuses[i].VolumeMounts = nil
815818
}

pkg/controlplane/apiserver/options/options.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"strings"
2525
"time"
2626

27-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
peerreconcilers "k8s.io/apiserver/pkg/reconcilers"
2928
genericoptions "k8s.io/apiserver/pkg/server/options"
3029
"k8s.io/apiserver/pkg/storage/storagebackend"
@@ -34,6 +33,7 @@ import (
3433
logsapi "k8s.io/component-base/logs/api/v1"
3534
"k8s.io/component-base/metrics"
3635
"k8s.io/klog/v2"
36+
"k8s.io/kubernetes/pkg/features"
3737
netutil "k8s.io/utils/net"
3838

3939
_ "k8s.io/kubernetes/pkg/features"
@@ -101,7 +101,7 @@ type CompletedOptions struct {
101101
// NewOptions creates a new ServerRunOptions object with default parameters
102102
func NewOptions() *Options {
103103
s := Options{
104-
GenericServerRunOptions: genericoptions.NewServerRunOptions(),
104+
GenericServerRunOptions: genericoptions.NewServerRunOptions(features.KubernetesGates()),
105105
Etcd: genericoptions.NewEtcdOptions(storagebackend.NewDefaultConfig(kubeoptions.DefaultEtcdPathPrefix, nil)),
106106
SecureServing: kubeoptions.NewSecureServingOptions(),
107107
Audit: genericoptions.NewAuditOptions(),

pkg/kubelet/kubelet_pods.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import (
6969
"k8s.io/kubernetes/pkg/volume/util/volumepathhandler"
7070
volumevalidation "k8s.io/kubernetes/pkg/volume/validation"
7171
"k8s.io/kubernetes/third_party/forked/golang/expansion"
72+
"k8s.io/utils/feature"
7273
utilnet "k8s.io/utils/net"
7374
)
7475

@@ -348,7 +349,8 @@ func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, h
348349
if err != nil {
349350
return nil, cleanupAction, fmt.Errorf("failed to resolve recursive read-only mode: %w", err)
350351
}
351-
if rro && !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
352+
if rro && !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
353+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
352354
return nil, cleanupAction, fmt.Errorf("recursive read-only mount needs feature gate %q to be enabled", features.RecursiveReadOnlyMounts)
353355
}
354356

@@ -2136,7 +2138,8 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
21362138
}
21372139
// status.VolumeMounts cannot be propagated from kubecontainer.Status
21382140
// because the CRI API is unaware of the volume names.
2139-
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
2141+
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) ||
2142+
feature.Enabled(features.RecursiveReadOnlyMounts3) {
21402143
for _, vol := range container.VolumeMounts {
21412144
volStatus := v1.VolumeMountStatus{
21422145
Name: vol.Name,
@@ -2148,7 +2151,8 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon
21482151
if b, err := resolveRecursiveReadOnly(vol, supportsRRO); err != nil {
21492152
klog.ErrorS(err, "failed to resolve recursive read-only mode", "mode", *vol.RecursiveReadOnly)
21502153
} else if b {
2151-
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
2154+
if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) ||
2155+
feature.Enabled(features.RecursiveReadOnlyMounts3) {
21522156
rroMode = v1.RecursiveReadOnlyEnabled
21532157
} else {
21542158
klog.ErrorS(nil, "recursive read-only mount needs feature gate to be enabled",

pkg/kubelet/nodestatus/setters.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import (
4343
"k8s.io/kubernetes/pkg/kubelet/cm"
4444
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
4545
"k8s.io/kubernetes/pkg/kubelet/events"
46+
"k8s.io/utils/feature"
4647
netutils "k8s.io/utils/net"
4748

4849
"k8s.io/klog/v2"
@@ -485,7 +486,8 @@ func GoRuntime() Setter {
485486
// RuntimeHandlers returns a Setter that sets RuntimeHandlers on the node.
486487
func RuntimeHandlers(fn func() []kubecontainer.RuntimeHandler) Setter {
487488
return func(ctx context.Context, node *v1.Node) error {
488-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
489+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
490+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
489491
return nil
490492
}
491493
handlers := fn()

pkg/registry/core/node/strategy.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"k8s.io/kubernetes/pkg/apis/core/validation"
4141
"k8s.io/kubernetes/pkg/features"
4242
"k8s.io/kubernetes/pkg/kubelet/client"
43+
"k8s.io/utils/feature"
4344
"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
4445
)
4546

@@ -103,7 +104,8 @@ func dropDisabledFields(node *api.Node, oldNode *api.Node) {
103104
node.Spec.ConfigSource = nil
104105
}
105106

106-
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) {
107+
if !utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) &&
108+
!feature.Enabled(features.RecursiveReadOnlyMounts3) {
107109
node.Status.RuntimeHandlers = nil
108110
}
109111
}

staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/options.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ type CustomResourceDefinitionsServerOptions struct {
6060
// NewCustomResourceDefinitionsServerOptions creates default options of an apiextensions-apiserver.
6161
func NewCustomResourceDefinitionsServerOptions(out, errOut io.Writer) *CustomResourceDefinitionsServerOptions {
6262
o := &CustomResourceDefinitionsServerOptions{
63-
ServerRunOptions: genericoptions.NewServerRunOptions(),
63+
ServerRunOptions: genericoptions.NewServerRunOptions(features.FeatureGates()),
6464
RecommendedOptions: genericoptions.NewRecommendedOptions(
6565
defaultEtcdPathPrefix,
6666
apiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion),

staging/src/k8s.io/apiserver/pkg/server/options/server_run_options.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ import (
2323
"strings"
2424
"time"
2525

26+
"github.com/spf13/pflag"
2627
"k8s.io/apimachinery/pkg/runtime/serializer"
2728
"k8s.io/apimachinery/pkg/util/errors"
2829
"k8s.io/apiserver/pkg/server"
29-
utilfeature "k8s.io/apiserver/pkg/util/feature"
30+
"k8s.io/utils/feature"
3031

3132
"github.com/spf13/pflag"
3233
)
@@ -89,9 +90,11 @@ type ServerRunOptions struct {
8990
// This grace period is orthogonal to other grace periods, and
9091
// it is not overridden by any other grace period.
9192
ShutdownWatchTerminationGracePeriod time.Duration
93+
94+
FeatureGates *feature.GateSet
9295
}
9396

94-
func NewServerRunOptions() *ServerRunOptions {
97+
func NewServerRunOptions(featureGates *feature.GateSet) *ServerRunOptions {
9598
defaults := server.NewConfig(serializer.CodecFactory{})
9699
return &ServerRunOptions{
97100
MaxRequestsInFlight: defaults.MaxRequestsInFlight,
@@ -104,6 +107,7 @@ func NewServerRunOptions() *ServerRunOptions {
104107
JSONPatchMaxCopyBytes: defaults.JSONPatchMaxCopyBytes,
105108
MaxRequestBodyBytes: defaults.MaxRequestBodyBytes,
106109
ShutdownSendRetryAfter: false,
110+
FeatureGates: featureGates,
107111
}
108112
}
109113

@@ -337,5 +341,6 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) {
337341
"This option, if set, represents the maximum amount of grace period the apiserver will wait "+
338342
"for active watch request(s) to drain during the graceful server shutdown window.")
339343

340-
utilfeature.DefaultMutableFeatureGate.AddFlag(fs)
344+
s.FeatureGates.EnableFlagControl("new-feature-gates", fs)
345+
s.FeatureGates.EnableEnvControl("KUBE_FEATURE_")
341346
}

staging/src/k8s.io/client-go/tools/cache/shared_informer.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/client-go/tools/cache/synctrack"
3030
"k8s.io/utils/buffer"
3131
"k8s.io/utils/clock"
32+
"k8s.io/utils/feature"
3233

3334
"k8s.io/klog/v2"
3435

@@ -411,7 +412,8 @@ func (v *dummyController) HasSynced() bool {
411412
}
412413

413414
func (v *dummyController) LastSyncResourceVersion() string {
414-
if clientgofeaturegate.FeatureGates().Enabled(clientgofeaturegate.InformerResourceVersion) {
415+
if clientgofeaturegate.FeatureGates().Enabled(clientgofeaturegate.InformerResourceVersion) ||
416+
feature.Enabled(clientgofeaturegate.InformerResourceVersion3) {
415417
return v.informer.LastSyncResourceVersion()
416418
}
417419

test/integration/storageversionmigrator/storageversionmigrator_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ import (
3030
encryptionconfigcontroller "k8s.io/apiserver/pkg/server/options/encryptionconfig/controller"
3131
utilfeature "k8s.io/apiserver/pkg/util/feature"
3232
clientgofeaturegate "k8s.io/client-go/features"
33-
"k8s.io/component-base/featuregate"
3433
featuregatetesting "k8s.io/component-base/featuregate/testing"
3534
"k8s.io/kubernetes/pkg/features"
35+
"k8s.io/utils/feature"
3636
)
3737

3838
// TestStorageVersionMigration is an integration test that verifies storage version migration works.
@@ -47,7 +47,7 @@ import (
4747
// 8. Verify that the resource version of the secret is not updated. i.e. it was a no-op update
4848
func TestStorageVersionMigration(t *testing.T) {
4949
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StorageVersionMigrator, true)
50-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, featuregate.Feature(clientgofeaturegate.InformerResourceVersion), true)
50+
feature.SetForTesting(clientgofeaturegate.InformerResourceVersion3, t, true)
5151

5252
// this makes the test super responsive. It's set to a default of 1 minute.
5353
encryptionconfigcontroller.EncryptionConfigFileChangePollDuration = time.Millisecond
@@ -149,7 +149,7 @@ func TestStorageVersionMigration(t *testing.T) {
149149
// 11. Verify the list of CRs at v2 works
150150
func TestStorageVersionMigrationWithCRD(t *testing.T) {
151151
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StorageVersionMigrator, true)
152-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, featuregate.Feature(clientgofeaturegate.InformerResourceVersion), true)
152+
feature.SetForTesting(clientgofeaturegate.InformerResourceVersion3, t, true)
153153
// decode errors are expected when using conversation webhooks
154154
etcd3watcher.TestOnlySetFatalOnDecodeError(false)
155155
defer etcd3watcher.TestOnlySetFatalOnDecodeError(true)

0 commit comments

Comments
 (0)