From e318f96bd9a535c7c4fd850f11a130c287800bb1 Mon Sep 17 00:00:00 2001 From: Erik Godding Boye Date: Fri, 29 Sep 2023 19:27:51 +0200 Subject: [PATCH] feat: add DisablePropagateGenerated feature gate --- cmd/accurate-controller/sub/root.go | 3 +++ controllers/propagate.go | 6 ++++-- go.mod | 3 ++- go.sum | 2 ++ pkg/config/feature_gate.go | 13 +++++++++++++ pkg/feature/feature.go | 20 ++++++++++++++++++++ 6 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 pkg/config/feature_gate.go create mode 100644 pkg/feature/feature.go diff --git a/cmd/accurate-controller/sub/root.go b/cmd/accurate-controller/sub/root.go index 0ce470a..3d4bae3 100644 --- a/cmd/accurate-controller/sub/root.go +++ b/cmd/accurate-controller/sub/root.go @@ -9,6 +9,7 @@ import ( "strconv" "github.com/cybozu-go/accurate" + "github.com/cybozu-go/accurate/pkg/config" "github.com/spf13/cobra" klog "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/log/zap" @@ -73,6 +74,8 @@ func init() { fs.StringVar(&options.certDir, "cert-dir", "", "webhook certificate directory") fs.IntVar(&options.qps, "apiserver-qps-throttle", defaultQPS, "The maximum QPS to the API server.") + config.DefaultMutableFeatureGate.AddFlag(fs) + goflags := flag.NewFlagSet("klog", flag.ExitOnError) klog.InitFlags(goflags) options.zapOpts.BindFlags(goflags) diff --git a/controllers/propagate.go b/controllers/propagate.go index 665a717..ede4a63 100644 --- a/controllers/propagate.go +++ b/controllers/propagate.go @@ -5,7 +5,9 @@ import ( "fmt" "strings" + "github.com/cybozu-go/accurate/pkg/config" "github.com/cybozu-go/accurate/pkg/constants" + "github.com/cybozu-go/accurate/pkg/feature" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -132,7 +134,7 @@ func (r *PropagateController) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, err } case "": - if ann[constants.AnnGenerated] != notGenerated { + if !config.DefaultFeatureGate.Enabled(feature.DisablePropagateGenerated) && ann[constants.AnnGenerated] != notGenerated { if err := r.checkController(ctx, obj); err != nil { logger.Error(err, "failed to check the controller reference") return ctrl.Result{}, err @@ -361,7 +363,7 @@ func (r *PropagateController) SetupWithManager(mgr ctrl.Manager) error { if _, ok := ann[constants.AnnPropagate]; ok { return true } - if ann[constants.AnnGenerated] == notGenerated { + if config.DefaultFeatureGate.Enabled(feature.DisablePropagateGenerated) || ann[constants.AnnGenerated] == notGenerated { return false } if metav1.GetControllerOfNoCopy(obj) != nil { diff --git a/go.mod b/go.mod index 4050f39..893e7c8 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( k8s.io/apimachinery v0.28.2 k8s.io/cli-runtime v0.28.2 k8s.io/client-go v0.28.2 + k8s.io/component-base v0.28.2 k8s.io/klog/v2 v2.100.1 sigs.k8s.io/controller-runtime v0.16.2 sigs.k8s.io/yaml v1.3.0 @@ -20,6 +21,7 @@ require ( require ( github.com/beorn7/perks v1.0.1 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -79,7 +81,6 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiextensions-apiserver v0.28.2 // indirect - k8s.io/component-base v0.28.2 // indirect k8s.io/kube-openapi v0.0.0-20230918164632-68afd615200d // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index 21e51e6..7e8773b 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= diff --git a/pkg/config/feature_gate.go b/pkg/config/feature_gate.go new file mode 100644 index 0000000..4f9c512 --- /dev/null +++ b/pkg/config/feature_gate.go @@ -0,0 +1,13 @@ +package config + +import "k8s.io/component-base/featuregate" + +var ( + // DefaultMutableFeatureGate is a mutable version of DefaultFeatureGate. + // Only top-level commands/options setup should make use of this. + DefaultMutableFeatureGate featuregate.MutableFeatureGate = featuregate.NewFeatureGate() + + // DefaultFeatureGate is a shared global FeatureGate. + // Top-level commands/options setup that needs to modify this feature gate should use DefaultMutableFeatureGate. + DefaultFeatureGate featuregate.FeatureGate = DefaultMutableFeatureGate +) diff --git a/pkg/feature/feature.go b/pkg/feature/feature.go new file mode 100644 index 0000000..1f7cf32 --- /dev/null +++ b/pkg/feature/feature.go @@ -0,0 +1,20 @@ +package feature + +import ( + "github.com/cybozu-go/accurate/pkg/config" + "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/component-base/featuregate" +) + +// DisablePropagateGenerated will disable watch for owners with propagate-generated +// annotation. This could be useful to avoid Accurate from attempting to modify resources +// in namespaces that should be out-of-scope for Accurate. +const DisablePropagateGenerated featuregate.Feature = "DisablePropagateGenerated" + +func init() { + runtime.Must(config.DefaultMutableFeatureGate.Add(defaultFeatureGates)) +} + +var defaultFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{ + DisablePropagateGenerated: {Default: false, PreRelease: featuregate.Alpha}, +}