diff --git a/Dockerfile b/Dockerfile index 4c9cf872..22f87820 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # and cross-compiles to $TARGETOS/$TARGETARCH. This makes multi-arch builds # (linux/amd64, linux/arm64) fast under buildx without requiring QEMU emulation # for the build itself. -FROM --platform=$BUILDPLATFORM golang:1.24 AS builder +FROM --platform=$BUILDPLATFORM golang:1.25 AS builder # Provided automatically by BuildKit when using buildx with --platform. ARG TARGETOS diff --git a/cmd/milo/apiserver/config.go b/cmd/milo/apiserver/config.go index 71861831..1c99c9b7 100644 --- a/cmd/milo/apiserver/config.go +++ b/cmd/milo/apiserver/config.go @@ -15,6 +15,7 @@ import ( "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/endpoints/filterlatency" genericapifilters "k8s.io/apiserver/pkg/endpoints/filters" + impersonationfilters "k8s.io/apiserver/pkg/endpoints/filters/impersonation" "k8s.io/apiserver/pkg/endpoints/request" genericfeatures "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/server" @@ -25,7 +26,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/rest" "k8s.io/component-base/tracing" - utilversion "k8s.io/component-base/version" + apiservercompat "k8s.io/apiserver/pkg/util/compatibility" "k8s.io/klog/v2" aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver" aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme" @@ -387,7 +388,7 @@ func NewConfig(opts options.CompletedOptions) (*Config, error) { return nil, err } c.ControlPlane = kubeAPIs - c.ControlPlane.Generic.EffectiveVersion = utilversion.DefaultKubeEffectiveVersion() + c.ControlPlane.Generic.EffectiveVersion = apiservercompat.DefaultBuildEffectiveVersion() if kubeAPIs.Generic.LoopbackClientConfig != nil && kubeAPIs.Generic.TracerProvider != nil { kubeAPIs.Generic.LoopbackClientConfig.Wrap(tracing.WrapperFor(kubeAPIs.Generic.TracerProvider)) @@ -437,7 +438,7 @@ func NewConfig(opts options.CompletedOptions) (*Config, error) { } c.Aggregator = aggregator c.Aggregator.ExtraConfig.DisableRemoteAvailableConditionController = true - c.Aggregator.GenericConfig.EffectiveVersion = utilversion.DefaultKubeEffectiveVersion() + c.Aggregator.GenericConfig.EffectiveVersion = apiservercompat.DefaultBuildEffectiveVersion() return c, nil } @@ -475,7 +476,7 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *server.Config, loopbac failedHandler = genericapifilters.WithFailedAuthenticationAudit(failedHandler, c.AuditBackend, c.AuditPolicyRuleEvaluator) handler = filterlatency.TrackCompleted(handler) - handler = genericapifilters.WithImpersonation(handler, c.Authorization.Authorizer, c.Serializer) + handler = impersonationfilters.WithImpersonation(handler, c.Authorization.Authorizer, c.Serializer) handler = filterlatency.TrackStarted(handler, c.TracerProvider, "impersonation") failedHandler = filterlatency.TrackCompleted(failedHandler) diff --git a/cmd/milo/apiserver/server.go b/cmd/milo/apiserver/server.go index abd4a145..c8e8f01c 100644 --- a/cmd/milo/apiserver/server.go +++ b/cmd/milo/apiserver/server.go @@ -27,14 +27,14 @@ import ( "k8s.io/client-go/rest" cliflag "k8s.io/component-base/cli/flag" "k8s.io/component-base/cli/globalflag" - "k8s.io/component-base/featuregate" "k8s.io/component-base/logs" logsapi "k8s.io/component-base/logs/api/v1" _ "k8s.io/component-base/metrics/prometheus/workqueue" "k8s.io/component-base/term" "k8s.io/component-base/version" - utilversion "k8s.io/component-base/version" "k8s.io/component-base/version/verflag" + basecompatibility "k8s.io/component-base/compatibility" + apiservercompat "k8s.io/apiserver/pkg/util/compatibility" "k8s.io/klog/v2" aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver" @@ -106,7 +106,7 @@ func NewCommand() *cobra.Command { cliflag.PrintFlags(fs) s.SystemNamespaces = []string{metav1.NamespaceSystem, metav1.NamespaceDefault, SystemNamespace} - completedOptions, err := s.Complete(cmd.Context(), namedFlagSets, []string{}, []net.IP{}) + completedOptions, err := s.Complete(cmd.Context(), []string{}, []net.IP{}) if err != nil { return err } @@ -132,9 +132,9 @@ func NewCommand() *cobra.Command { }, } - s.GenericServerRunOptions.ComponentGlobalsRegistry = featuregate.NewComponentGlobalsRegistry() + s.GenericServerRunOptions.ComponentGlobalsRegistry = basecompatibility.NewComponentGlobalsRegistry() s.GenericServerRunOptions.ComponentGlobalsRegistry.ComponentGlobalsOrRegister( - featuregate.DefaultKubeComponent, utilversion.DefaultKubeEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) + basecompatibility.DefaultKubeComponent, apiservercompat.DefaultBuildEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) s.GenericServerRunOptions.AddUniversalFlags(namedFlagSets.FlagSet("generic")) s.Etcd.AddFlags(namedFlagSets.FlagSet("etcd")) s.SecureServing.AddFlags(namedFlagSets.FlagSet("secure serving")) diff --git a/cmd/milo/apiserver/serviceaccounts.go b/cmd/milo/apiserver/serviceaccounts.go index a446ef82..09cc9f6d 100644 --- a/cmd/milo/apiserver/serviceaccounts.go +++ b/cmd/milo/apiserver/serviceaccounts.go @@ -3,8 +3,8 @@ package app import ( "context" - "gopkg.in/square/go-jose.v2" - "gopkg.in/square/go-jose.v2/jwt" + "gopkg.in/go-jose/go-jose.v2" + "gopkg.in/go-jose/go-jose.v2/jwt" v1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/client-go/informers" diff --git a/cmd/milo/controller-manager/controllermanager.go b/cmd/milo/controller-manager/controllermanager.go index 2bd0d962..099f1cc6 100644 --- a/cmd/milo/controller-manager/controllermanager.go +++ b/cmd/milo/controller-manager/controllermanager.go @@ -52,8 +52,9 @@ import ( "k8s.io/component-base/metrics/prometheus/slis" "k8s.io/component-base/term" "k8s.io/component-base/version" - utilversion "k8s.io/component-base/version" "k8s.io/component-base/version/verflag" + basecompatibility "k8s.io/component-base/compatibility" + apiservercompat "k8s.io/apiserver/pkg/util/compatibility" genericcontrollermanager "k8s.io/controller-manager/app" "k8s.io/controller-manager/controller" "k8s.io/controller-manager/pkg/clientbuilder" @@ -204,8 +205,8 @@ const ( // NewCommand creates a *cobra.Command object with default parameters func NewCommand() *cobra.Command { - _, _ = featuregate.DefaultComponentGlobalsRegistry.ComponentGlobalsOrRegister( - featuregate.DefaultKubeComponent, utilversion.DefaultBuildEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) + _, _ = apiservercompat.DefaultComponentGlobalsRegistry.ComponentGlobalsOrRegister( + basecompatibility.DefaultKubeComponent, apiservercompat.DefaultBuildEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) s, err := NewOptions() if err != nil { @@ -245,13 +246,13 @@ func NewCommand() *cobra.Command { ProjectOwnerRoleNamespace = SystemNamespace } - c, err := s.Config(KnownControllers(), nil, ControllerAliases()) + c, err := s.Config(cmd.Context(), KnownControllers(), nil, ControllerAliases()) if err != nil { return err } // add feature enablement metrics - fg := s.ComponentGlobalsRegistry.FeatureGateFor(featuregate.DefaultKubeComponent) + fg := s.ComponentGlobalsRegistry.FeatureGateFor(basecompatibility.DefaultKubeComponent) fg.(featuregate.MutableFeatureGate).AddMetrics() return Run(context.Background(), c.Complete(), s) }, @@ -675,15 +676,8 @@ func Run(ctx context.Context, c *config.CompletedConfig, opts *Options) error { klog.FlushAndExit(klog.ExitFlushTimeout, 1) } - // Start concurrently to resolve circular dependency between provider and manager - go func() { - logger.Info("Starting Datum cluster provider") - if err := provider.Run(ctx, mcMgr); err != nil { - logger.Error(err, "Datum cluster provider failed") - panic(err) - } - }() - + // The multicluster manager automatically starts the provider because + // Provider implements multicluster.ProviderRunnable (Start method). go func() { logger.Info("Starting multicluster manager for quota system") if err := mcMgr.Start(ctx); err != nil { @@ -837,11 +831,11 @@ func Run(ctx context.Context, c *config.CompletedConfig, opts *Options) error { } if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CoordinatedLeaderElection) { - binaryVersion, err := semver.ParseTolerant(featuregate.DefaultComponentGlobalsRegistry.EffectiveVersionFor(featuregate.DefaultKubeComponent).BinaryVersion().String()) + binaryVersion, err := semver.ParseTolerant(apiservercompat.DefaultComponentGlobalsRegistry.EffectiveVersionFor(basecompatibility.DefaultKubeComponent).BinaryVersion().String()) if err != nil { return err } - emulationVersion, err := semver.ParseTolerant(featuregate.DefaultComponentGlobalsRegistry.EffectiveVersionFor(featuregate.DefaultKubeComponent).EmulationVersion().String()) + emulationVersion, err := semver.ParseTolerant(apiservercompat.DefaultComponentGlobalsRegistry.EffectiveVersionFor(basecompatibility.DefaultKubeComponent).EmulationVersion().String()) if err != nil { return err } diff --git a/go.mod b/go.mod index d9ab77e2..8a050358 100644 --- a/go.mod +++ b/go.mod @@ -1,56 +1,57 @@ module go.miloapis.com/milo -go 1.23.1 +go 1.25.0 require ( github.com/blang/semver/v4 v4.0.0 github.com/go-logr/logr v1.4.3 - github.com/google/cel-go v0.22.0 - github.com/spf13/cobra v1.9.1 - github.com/spf13/pflag v1.0.7 + github.com/google/cel-go v0.26.0 + github.com/spf13/cobra v1.10.0 + github.com/spf13/pflag v1.0.9 github.com/stretchr/testify v1.11.1 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 - go.opentelemetry.io/otel v1.35.0 - go.opentelemetry.io/otel/trace v1.35.0 - golang.org/x/sync v0.16.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 + go.opentelemetry.io/otel v1.36.0 + go.opentelemetry.io/otel/trace v1.36.0 + golang.org/x/sync v0.18.0 golang.org/x/time v0.12.0 - gopkg.in/square/go-jose.v2 v2.6.0 - k8s.io/api v0.32.3 - k8s.io/apiextensions-apiserver v0.32.3 - k8s.io/apimachinery v0.32.3 - k8s.io/apiserver v0.32.3 - k8s.io/client-go v0.32.3 - k8s.io/component-base v0.32.3 - k8s.io/controller-manager v0.32.0 + gopkg.in/go-jose/go-jose.v2 v2.6.3 + k8s.io/api v0.35.0 + k8s.io/apiextensions-apiserver v0.35.0 + k8s.io/apimachinery v0.35.0 + k8s.io/apiserver v0.35.0 + k8s.io/client-go v0.35.0 + k8s.io/component-base v0.35.0 + k8s.io/controller-manager v0.35.0 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-aggregator v0.32.0 - k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f - k8s.io/kubernetes v1.32.0 - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - sigs.k8s.io/controller-runtime v0.20.4 - sigs.k8s.io/multicluster-runtime v0.20.4-alpha.6 - sigs.k8s.io/yaml v1.4.0 + k8s.io/kube-aggregator v0.35.0 + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 + k8s.io/kubernetes v1.35.0 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 + sigs.k8s.io/controller-runtime v0.23.3 + sigs.k8s.io/multicluster-runtime v0.23.3 + sigs.k8s.io/yaml v1.6.0 ) require ( - cel.dev/expr v0.19.1 // indirect + cel.dev/expr v0.24.0 // indirect + cyphar.com/go-pathrs v0.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/coreos/go-oidc v2.2.1+incompatible // indirect + github.com/coreos/go-oidc v2.3.0+incompatible // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/cyphar/filepath-securejoin v0.6.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/emicklei/go-restful/v3 v3.12.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -59,83 +60,85 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.9 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/moby/spdystream v0.5.0 // indirect github.com/moby/sys/mountinfo v0.7.2 // indirect - github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/selinux v1.11.1 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/opencontainers/selinux v1.13.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/x448/float16 v0.8.4 // indirect - go.etcd.io/etcd/api/v3 v3.6.4 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.6.4 // indirect - go.etcd.io/etcd/client/v3 v3.6.4 // indirect - go.etcd.io/etcd/pkg/v3 v3.6.4 // indirect + go.etcd.io/etcd/api/v3 v3.6.5 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.6.5 // indirect + go.etcd.io/etcd/client/v3 v3.6.5 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk v1.36.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.37.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect - golang.org/x/tools v0.30.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/tools v0.38.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/grpc v1.71.1 // indirect - google.golang.org/protobuf v1.36.6 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect + google.golang.org/grpc v1.72.2 // indirect + google.golang.org/protobuf v1.36.8 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/cloud-provider v0.32.0 // indirect - k8s.io/cluster-bootstrap v0.32.0 // indirect - k8s.io/component-helpers v0.32.0 // indirect - k8s.io/cri-client v0.32.0 // indirect - k8s.io/csi-translation-lib v0.32.0 // indirect - k8s.io/dynamic-resource-allocation v0.32.0 // indirect - k8s.io/externaljwt v0.32.0 // indirect - k8s.io/kms v0.32.3 // indirect - k8s.io/kube-controller-manager v0.32.0 // indirect - k8s.io/kubelet v0.32.0 // indirect - k8s.io/mount-utils v0.32.0 // indirect - k8s.io/pod-security-admission v0.32.0 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + k8s.io/cloud-provider v0.35.0 // indirect + k8s.io/cluster-bootstrap v0.35.0 // indirect + k8s.io/component-helpers v0.35.0 // indirect + k8s.io/cri-client v0.35.0 // indirect + k8s.io/csi-translation-lib v0.35.0 // indirect + k8s.io/dynamic-resource-allocation v0.35.0 // indirect + k8s.io/endpointslice v0.35.0 // indirect + k8s.io/externaljwt v0.35.0 // indirect + k8s.io/kms v0.35.0 // indirect + k8s.io/kube-controller-manager v0.35.0 // indirect + k8s.io/kube-proxy v0.35.0 // indirect + k8s.io/kube-scheduler v0.35.0 // indirect + k8s.io/kubectl v0.35.0 // indirect + k8s.io/kubelet v0.35.0 // indirect + k8s.io/metrics v0.35.0 // indirect + k8s.io/mount-utils v0.35.0 // indirect + k8s.io/pod-security-admission v0.35.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 // indirect ) diff --git a/go.sum b/go.sum index a919bbaa..ba4eb680 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,11 @@ -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cyphar.com/go-pathrs v0.2.1 h1:9nx1vOgwVvX1mNBWDu93+vaceedpbsDqo+XuBGL40b8= +cyphar.com/go-pathrs v0.2.1/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= @@ -10,8 +14,6 @@ github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8 github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 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= @@ -20,8 +22,8 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3 github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= -github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.3.0+incompatible h1:+5vEsrgprdLjjQ9FzIKAzQz1wwPD+83hQRfUIPh7rO0= +github.com/coreos/go-oidc v2.3.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= @@ -29,6 +31,8 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is= +github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -37,18 +41,18 @@ github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5Qvfr github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= -github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -67,48 +71,47 @@ github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.0 h1:b3FJZxpiv1vTMo2/5RDUqAHPxkT8mmMfJIrq1llbf7g= -github.com/google/cel-go v0.22.0/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= +github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= +github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -121,27 +124,26 @@ github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= -github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= -github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= -github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= -github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= +github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/selinux v1.11.1 h1:nHFvthhM0qY8/m+vfhJylliSshm8G1jJ2jDMcgULaH8= -github.com/opencontainers/selinux v1.11.1/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/opencontainers/selinux v1.13.0 h1:Zza88GWezyT7RLql12URvoxsbLfjFx988+LGaWfbL84= +github.com/opencontainers/selinux v1.13.0/go.mod h1:XxWTed+A/s5NNq4GmYScVy+9jzXhGBVEOAyucdRUY8s= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -149,33 +151,35 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= -github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.0 h1:a5/WeUlSDCvV5a45ljW2ZFtV0bTDpkfSAj3uqB6Sc+0= +github.com/spf13/cobra v1.10.0/go.mod h1:9dhySC7dnTtEiqzmqfkLj47BslqLCUPMXjG2lj/NgoE= +github.com/spf13/pflag v1.0.8/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -191,183 +195,195 @@ github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chq github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= -go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= -go.etcd.io/etcd/api/v3 v3.6.4 h1:7F6N7toCKcV72QmoUKa23yYLiiljMrT4xCeBL9BmXdo= -go.etcd.io/etcd/api/v3 v3.6.4/go.mod h1:eFhhvfR8Px1P6SEuLT600v+vrhdDTdcfMzmnxVXXSbk= -go.etcd.io/etcd/client/pkg/v3 v3.6.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= -go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= -go.etcd.io/etcd/client/v2 v2.305.16 h1:kQrn9o5czVNaukf2A2At43cE9ZtWauOtf9vRZuiKXow= -go.etcd.io/etcd/client/v2 v2.305.16/go.mod h1:h9YxWCzcdvZENbfzBTFCnoNumr2ax3F19sKMqHFmXHE= -go.etcd.io/etcd/client/v3 v3.6.4 h1:YOMrCfMhRzY8NgtzUsHl8hC2EBSnuqbR3dh84Uryl7A= -go.etcd.io/etcd/client/v3 v3.6.4/go.mod h1:jaNNHCyg2FdALyKWnd7hxZXZxZANb0+KGY+YQaEMISo= -go.etcd.io/etcd/pkg/v3 v3.6.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= -go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= -go.etcd.io/etcd/raft/v3 v3.5.16 h1:zBXA3ZUpYs1AwiLGPafYAKKl/CORn/uaxYDwlNwndAk= -go.etcd.io/etcd/raft/v3 v3.5.16/go.mod h1:P4UP14AxofMJ/54boWilabqqWoW9eLodl6I5GdGzazI= -go.etcd.io/etcd/server/v3 v3.5.16 h1:d0/SAdJ3vVsZvF8IFVb1k8zqMZ+heGcNfft71ul9GWE= -go.etcd.io/etcd/server/v3 v3.5.16/go.mod h1:ynhyZZpdDp1Gq49jkUg5mfkDWZwXnn3eIqCqtJnrD/s= +go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= +go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= +go.etcd.io/etcd/api/v3 v3.6.5 h1:pMMc42276sgR1j1raO/Qv3QI9Af/AuyQUW6CBAWuntA= +go.etcd.io/etcd/api/v3 v3.6.5/go.mod h1:ob0/oWA/UQQlT1BmaEkWQzI0sJ1M0Et0mMpaABxguOQ= +go.etcd.io/etcd/client/pkg/v3 v3.6.5 h1:Duz9fAzIZFhYWgRjp/FgNq2gO1jId9Yae/rLn3RrBP8= +go.etcd.io/etcd/client/pkg/v3 v3.6.5/go.mod h1:8Wx3eGRPiy0qOFMZT/hfvdos+DjEaPxdIDiCDUv/FQk= +go.etcd.io/etcd/client/v3 v3.6.5 h1:yRwZNFBx/35VKHTcLDeO7XVLbCBFbPi+XV4OC3QJf2U= +go.etcd.io/etcd/client/v3 v3.6.5/go.mod h1:ZqwG/7TAFZ0BJ0jXRPoJjKQJtbFo/9NIY8uoFFKcCyo= +go.etcd.io/etcd/pkg/v3 v3.6.5 h1:byxWB4AqIKI4SBmquZUG1WGtvMfMaorXFoCcFbVeoxM= +go.etcd.io/etcd/pkg/v3 v3.6.5/go.mod h1:uqrXrzmMIJDEy5j00bCqhVLzR5jEJIwDp5wTlLwPGOU= +go.etcd.io/etcd/server/v3 v3.6.5 h1:4RbUb1Bd4y1WkBHmuF+cZII83JNQMuNXzyjwigQ06y0= +go.etcd.io/etcd/server/v3 v3.6.5/go.mod h1:PLuhyVXz8WWRhzXDsl3A3zv/+aK9e4A9lpQkqawIaH0= +go.etcd.io/raft/v3 v3.6.0 h1:5NtvbDVYpnfZWcIHgGRk9DyzkBIXOi8j+DDp1IcnUWQ= +go.etcd.io/raft/v3 v3.6.0/go.mod h1:nLvLevg6+xrVtHUmVaTcTz603gQPHfh7kUAwV6YpfGo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 h1:Df6WuGvthPzc+JiQ/G+m+sNX24kc0aTBqoDN/0yyykE= -google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= +google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= +gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= -k8s.io/cloud-provider v0.32.0 h1:QXYJGmwME2q2rprymbmw2GroMChQYc/MWN6l/I4Kgp8= -k8s.io/cloud-provider v0.32.0/go.mod h1:cz3gVodkhgwi2ugj/JUPglIruLSdDaThxawuDyCHfr8= -k8s.io/cluster-bootstrap v0.32.0 h1:xfaL0a5MfX3CfZlbUDN1EaSkDAOYIshOiWGIo7n/2Dc= -k8s.io/cluster-bootstrap v0.32.0/go.mod h1:DgKZNB6DhBsEf8bp7RqMqGFGR4jq2JGcmyQgssAb5/I= -k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k= -k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= -k8s.io/component-helpers v0.32.0 h1:pQEEBmRt3pDJJX98cQvZshDgJFeKRM4YtYkMmfOlczw= -k8s.io/component-helpers v0.32.0/go.mod h1:9RuClQatbClcokXOcDWSzFKQm1huIf0FzQlPRpizlMc= -k8s.io/controller-manager v0.32.0 h1:tpQl1rvH4huFB6Avl1nhowZHtZoCNWqn6OYdZPl7Ybc= -k8s.io/controller-manager v0.32.0/go.mod h1:JRuYnYCkKj3NgBTy+KNQKIUm/lJRoDAvGbfdEmk9LhY= -k8s.io/cri-api v0.32.0 h1:pzXJfyG7Tm4acrEt5HPqAq3r4cN5guLeapAN/NM2b70= -k8s.io/cri-api v0.32.0/go.mod h1:DCzMuTh2padoinefWME0G678Mc3QFbLMF2vEweGzBAI= -k8s.io/cri-client v0.32.0 h1:K6aTYDyS2AS8O4h79eI5r26562xstdybprtaaszjn+E= -k8s.io/cri-client v0.32.0/go.mod h1:FB8qZNj8KrwIFfVIR2zBGb+l6KUhrp+k8YFsVp3D+kw= -k8s.io/csi-translation-lib v0.32.0 h1:RAn9RGgYXHJQtDSb6qQ7zvq6QObOejzmsXDARI+f4OQ= -k8s.io/csi-translation-lib v0.32.0/go.mod h1:TjCJzkTNstdOESAXNnEImrYOMIEzP14aqM7H+vkehqw= -k8s.io/dynamic-resource-allocation v0.32.0 h1:0ZLSCKzlLZLVwKHxg6vafpd2U8b7jPMO3k8bbMFodis= -k8s.io/dynamic-resource-allocation v0.32.0/go.mod h1:MfoAUi0vCJtchNirAVk7c3IYfGGB3n+zbZ9GuyX4eeo= -k8s.io/externaljwt v0.32.0 h1:XblxKdGy937DArBgW/G2QCI55P2e69UxR/aLffOa+wY= -k8s.io/externaljwt v0.32.0/go.mod h1:P9TZ/u+o3CG//KNc/2HJmKgnuvawWS75IosS9dlGlxI= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/apiserver v0.35.0 h1:CUGo5o+7hW9GcAEF3x3usT3fX4f9r8xmgQeCBDaOgX4= +k8s.io/apiserver v0.35.0/go.mod h1:QUy1U4+PrzbJaM3XGu2tQ7U9A4udRRo5cyxkFX0GEds= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= +k8s.io/cloud-provider v0.35.0 h1:syiBCQbKh2gho/S1BkIl006Dc44pV8eAtGZmv5NMe7M= +k8s.io/cloud-provider v0.35.0/go.mod h1:7grN+/Nt5Hf7tnSGPT3aErt4K7aQpygyCrGpbrQbzNc= +k8s.io/cluster-bootstrap v0.35.0 h1:VXnil8zw+FikqvytJYLB8wcvjxbUCyqMkiC//k426Y0= +k8s.io/cluster-bootstrap v0.35.0/go.mod h1:X6sjEjVUFSfFNIzJ6VAIuwwh2QiDtsVX1xZgcGX4gD8= +k8s.io/component-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= +k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= +k8s.io/component-helpers v0.35.0 h1:wcXv7HJRksgVjM4VlXJ1CNFBpyDHruRI99RrBtrJceA= +k8s.io/component-helpers v0.35.0/go.mod h1:ahX0m/LTYmu7fL3W8zYiIwnQ/5gT28Ex4o2pymF63Co= +k8s.io/controller-manager v0.35.0 h1:KteodmfVIRzfZ3RDaxhnHb72rswBxEngvdL9vuZOA9A= +k8s.io/controller-manager v0.35.0/go.mod h1:1bVuPNUG6/dpWpevsJpXioS0E0SJnZ7I/Wqc9Awyzm4= +k8s.io/cri-api v0.35.0 h1:fxLSKyJHqbyCSUsg1rW4DRpmjSEM/elZ1GXzYTSLoDQ= +k8s.io/cri-api v0.35.0/go.mod h1:Cnt29u/tYl1Se1cBRL30uSZ/oJ5TaIp4sZm1xDLvcMc= +k8s.io/cri-client v0.35.0 h1:U1K4bteO93yioUS38804ybN+kWaon9zrzVtB37I3fCs= +k8s.io/cri-client v0.35.0/go.mod h1:XG5GkuuSpxvungsJVzW58NyWBoGSQhMMJmE5c66m9N8= +k8s.io/csi-translation-lib v0.35.0 h1:jdVC/9rv3lfHl5/MFQXqIVcEZEOXPbl4IPI8cczPdWw= +k8s.io/csi-translation-lib v0.35.0/go.mod h1:/6R70QdDxBCrMkrLhIBLP4mdtL35hEoJ5a/c2s1k9z8= +k8s.io/dynamic-resource-allocation v0.35.0 h1:St6dsCCylLg3HiFPcyHzFF8YQO6yziUDaVRLGdkrNH8= +k8s.io/dynamic-resource-allocation v0.35.0/go.mod h1:uaFga3VJtwyfpfZwpuJG7mlurWGQaaiGUa+QZmooz2U= +k8s.io/endpointslice v0.35.0 h1:zLcYAHUhAApGld1kHS4klp6HTRIkn3r4uxitHJiN7PU= +k8s.io/endpointslice v0.35.0/go.mod h1:mHF/Zw1jYWpLWb2MRBrcmZlYvYXQuCcEgK+5TMaQiUE= +k8s.io/externaljwt v0.35.0 h1:t2y/WYpxBB9/90DnLAB4cKmi7BdgaVCQZrwwASHjMsU= +k8s.io/externaljwt v0.35.0/go.mod h1:BbmVxkdvNrL2ukF4m/AN2D2FBD3vp2df497nfcVl2Nc= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.32.3 h1:HhHw5+pRCzEJp3oFFJ1q5W2N6gAI7YkUg4ay4Z0dgwM= -k8s.io/kms v0.32.3/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM= -k8s.io/kube-aggregator v0.32.0 h1:5ZyMW3QwAbmkasQrROcpa5we3et938DQuyUYHeXSPao= -k8s.io/kube-aggregator v0.32.0/go.mod h1:6OKivf6Ypx44qu2v1ZUMrxH8kRp/8LKFKeJU72J18lU= -k8s.io/kube-controller-manager v0.32.0 h1:GXQz5GtyvtyFRFpIZmPUgdLPyrvVKNA72JHAW5jLIL0= -k8s.io/kube-controller-manager v0.32.0/go.mod h1:9Z9qDFMJJv5RikzQdGSjq4J+qMm8Kg1bR+kEs/+COQA= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/kubelet v0.32.0 h1:uLyiKlz195Wo4an/K2tyge8o3QHx0ZkhVN3pevvp59A= -k8s.io/kubelet v0.32.0/go.mod h1:lAwuVZT/Hm7EdLn0jW2D+WdrJoorjJL2rVSdhOFnegw= -k8s.io/kubernetes v1.32.0 h1:4BDBWSolqPrv8GC3YfZw0CJvh5kA1TPnoX0FxDVd+qc= -k8s.io/kubernetes v1.32.0/go.mod h1:tiIKO63GcdPRBHW2WiUFm3C0eoLczl3f7qi56Dm1W8I= -k8s.io/mount-utils v0.32.0 h1:KOQAhPzJICATXnc6XCkWoexKbkOexRnMCUW8APFfwg4= -k8s.io/mount-utils v0.32.0/go.mod h1:Kun5c2svjAPx0nnvJKYQWhfeNW+O0EpzHgRhDcYoSY0= -k8s.io/pod-security-admission v0.32.0 h1:I+Og0uZIiMpIgTgPrTbW4jlwRI5RWazi8y+jrx1v10w= -k8s.io/pod-security-admission v0.32.0/go.mod h1:RvrcY0+5UAoCIJ7BscgDF3nbmXprgfnjTW+byCyXDvA= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= -sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/multicluster-runtime v0.20.4-alpha.6 h1:xaBJoiYZY+DlaHBIXfS+ZUH+L5GOD6A+klL46vekggE= -sigs.k8s.io/multicluster-runtime v0.20.4-alpha.6/go.mod h1:2N2/c3p08bYC9eDaRs0dllTxgAm5xiLDSkmGZpWKyw4= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +k8s.io/kms v0.35.0 h1:/x87FED2kDSo66csKtcYCEHsxF/DBlNl7LfJ1fVQs1o= +k8s.io/kms v0.35.0/go.mod h1:VT+4ekZAdrZDMgShK37vvlyHUVhwI9t/9tvh0AyCWmQ= +k8s.io/kube-aggregator v0.35.0 h1:FBtbuRFA7Ohe2QKirFZcJf8rgimC8oSaNiCi4pdU5xw= +k8s.io/kube-aggregator v0.35.0/go.mod h1:vKBRpQUfDryb7udwUwF3eCSvv3AJNgHtL4PGl6PqAg8= +k8s.io/kube-controller-manager v0.35.0 h1:NRMhS5mz6E/D2beojOj2/HcCa2thRPVf4vp4QxmFkjo= +k8s.io/kube-controller-manager v0.35.0/go.mod h1:M32fFkRScIW9KSPYUQBVqdjYrja5F2s4v5NrHEUVIJ8= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/kube-proxy v0.35.0 h1:erv2wYmGZ6nyu/FtmaIb+ORD3q2rfZ4Fhn7VXs/8cPQ= +k8s.io/kube-proxy v0.35.0/go.mod h1:bd9lpN3uLLOOWc/CFZbkPEi9DTkzQQymbE8FqSU4bWk= +k8s.io/kube-scheduler v0.35.0 h1:1uzns+SQl1ols3RXH/oxhOPd4fuicXliqWTBLbqIVRM= +k8s.io/kube-scheduler v0.35.0/go.mod h1:/56k23VdXC19Pa7Mx6uQ2YW0gsw5VJ30RgGGZUeeyD8= +k8s.io/kubectl v0.35.0 h1:cL/wJKHDe8E8+rP3G7avnymcMg6bH6JEcR5w5uo06wc= +k8s.io/kubectl v0.35.0/go.mod h1:VR5/TSkYyxZwrRwY5I5dDq6l5KXmiCb+9w8IKplk3Qo= +k8s.io/kubelet v0.35.0 h1:8cgJHCBCKLYuuQ7/Pxb/qWbJfX1LXIw7790ce9xHq7c= +k8s.io/kubelet v0.35.0/go.mod h1:ciRzAXn7C4z5iB7FhG1L2CGPPXLTVCABDlbXt/Zz8YA= +k8s.io/kubernetes v1.35.0 h1:PUOojD8c8E3csMP5NX+nLLne6SGqZjrYCscptyBfWMY= +k8s.io/kubernetes v1.35.0/go.mod h1:Tzk9Y9W/XUFFFgTUVg+BAowoFe+Pc7koGLuaiLHdcFg= +k8s.io/metrics v0.35.0 h1:xVFoqtAGm2dMNJAcB5TFZJPCen0uEqqNt52wW7ABbX8= +k8s.io/metrics v0.35.0/go.mod h1:g2Up4dcBygZi2kQSEQVDByFs+VUwepJMzzQLJJLpq4M= +k8s.io/mount-utils v0.35.0 h1:UDE8RDeqmQh1u/yRd+GZC2EpDibiyAfmMEsm43lKNQI= +k8s.io/mount-utils v0.35.0/go.mod h1:ppC4d+mUpfbAJr/V2E8vvxeCEckNM+S5b0kQBQjd3Pw= +k8s.io/pod-security-admission v0.35.0 h1:tT3UHC+Q1mpFRe4IoVTu20ZAx+kqgKBZnewRnsDcyfc= +k8s.io/pod-security-admission v0.35.0/go.mod h1:S+57PAqNo6DaUYjmtINiiXlYnEdShrOVMwSc7C4oYPg= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/controller-runtime v0.23.3 h1:VjB/vhoPoA9l1kEKZHBMnQF33tdCLQKJtydy4iqwZ80= +sigs.k8s.io/controller-runtime v0.23.3/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/multicluster-runtime v0.23.3 h1:vrzlXRzHTDsjspUAfoW2rCtr0agoI4q20p9x4Fz4png= +sigs.k8s.io/multicluster-runtime v0.23.3/go.mod h1:r/UA4GHgFoXCcR4tcvlZz7SiLx3l1kJKDuBAhILNIHs= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482 h1:2WOzJpHUBVrrkDjU4KBT8n5LDcj824eX0I5UKcgeRUs= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2-0.20260122202528-d9cc6641c482/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/apiserver/storage/project/mux.go b/internal/apiserver/storage/project/mux.go index 5f2a1a70..89ae23e5 100644 --- a/internal/apiserver/storage/project/mux.go +++ b/internal/apiserver/storage/project/mux.go @@ -173,14 +173,23 @@ func (i *instrumentedStorage) GuaranteedUpdate(ctx context.Context, key string, i.markSuccess() return nil } -func (i *instrumentedStorage) Count(key string) (int64, error) { return i.inner.Count(key) } -func (i *instrumentedStorage) ReadinessCheck() error { return i.inner.ReadinessCheck() } +func (i *instrumentedStorage) ReadinessCheck() error { return i.inner.ReadinessCheck() } func (i *instrumentedStorage) RequestWatchProgress(ctx context.Context) error { if err := i.inner.RequestWatchProgress(ctx); err != nil { return i.markReinit("watch_progress", err) } return nil } +func (i *instrumentedStorage) Stats(ctx context.Context) (storage.Stats, error) { + return i.inner.Stats(ctx) +} +func (i *instrumentedStorage) GetCurrentResourceVersion(ctx context.Context) (uint64, error) { + return i.inner.GetCurrentResourceVersion(ctx) +} +func (i *instrumentedStorage) EnableResourceSizeEstimation(fn storage.KeysFunc) error { + return i.inner.EnableResourceSizeEstimation(fn) +} +func (i *instrumentedStorage) CompactRevision() int64 { return i.inner.CompactRevision() } // -------------------- mux -------------------- @@ -365,22 +374,6 @@ func (m *projectMux) GuaranteedUpdate(ctx context.Context, key string, out runti return s.GuaranteedUpdate(ctx, key, out, ignoreNotFound, precond, tryUpdate, suggestion) } -// If your k8s minor *doesn't* include Count in storage.Interface, delete this. -func (m *projectMux) Count(key string) (int64, error) { - m.mu.RLock() - c := m.children[""] - m.mu.RUnlock() - if c == nil { - if _, err := m.childForProject(""); err != nil { - return 0, err - } - m.mu.RLock() - c = m.children[""] - m.mu.RUnlock() - } - return c.s.Count(key) -} - // ReadinessCheck proxies to the appropriate child (defaults to the "" project). func (m *projectMux) ReadinessCheck() error { m.mu.RLock() @@ -404,3 +397,40 @@ func (m *projectMux) RequestWatchProgress(ctx context.Context) error { } return s.RequestWatchProgress(ctx) } + +func (m *projectMux) Stats(ctx context.Context) (storage.Stats, error) { + s, err := m.pick(ctx) + if err != nil { + return storage.Stats{}, err + } + return s.Stats(ctx) +} + +func (m *projectMux) GetCurrentResourceVersion(ctx context.Context) (uint64, error) { + s, err := m.pick(ctx) + if err != nil { + return 0, err + } + return s.GetCurrentResourceVersion(ctx) +} + +func (m *projectMux) EnableResourceSizeEstimation(fn storage.KeysFunc) error { + m.mu.RLock() + defer m.mu.RUnlock() + for _, c := range m.children { + if err := c.s.EnableResourceSizeEstimation(fn); err != nil { + return err + } + } + return nil +} + +func (m *projectMux) CompactRevision() int64 { + m.mu.RLock() + c := m.children[""] + m.mu.RUnlock() + if c == nil { + return 0 + } + return c.s.CompactRevision() +} diff --git a/internal/quota/controllers/core/registration.go b/internal/quota/controllers/core/registration.go index a158c4aa..7638ecae 100644 --- a/internal/quota/controllers/core/registration.go +++ b/internal/quota/controllers/core/registration.go @@ -140,7 +140,7 @@ func (r *ResourceRegistrationController) SetupWithManager(mgr mcmanager.Manager) return mcbuilder.ControllerManagedBy(mgr). For("av1alpha1.ResourceRegistration{}, mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true)). + mcbuilder.WithEngageWithProviderClusters(false)). Named("resource-registration"). Complete(r) } diff --git a/internal/quota/controllers/lifecycle/cleanup_test.go b/internal/quota/controllers/lifecycle/cleanup_test.go index 784f7747..d44f7d0f 100644 --- a/internal/quota/controllers/lifecycle/cleanup_test.go +++ b/internal/quota/controllers/lifecycle/cleanup_test.go @@ -12,6 +12,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/events" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/cache" @@ -39,6 +40,7 @@ func (c *testCluster) GetConfig() *rest.Config { return func (c *testCluster) GetCache() cache.Cache { return nil } func (c *testCluster) GetFieldIndexer() client.FieldIndexer { return nil } func (c *testCluster) GetEventRecorderFor(string) record.EventRecorder { return nil } +func (c *testCluster) GetEventRecorder(string) events.EventRecorder { return nil } func (c *testCluster) GetRESTMapper() meta.RESTMapper { return nil } func (c *testCluster) GetAPIReader() client.Reader { return nil } func (c *testCluster) Start(context.Context) error { return nil } @@ -46,7 +48,7 @@ func (c *testCluster) Start(context.Context) error { return // testManager implements mcmanager.Manager with only GetCluster functional. type testManager struct{ cluster cluster.Cluster } -func (m *testManager) GetCluster(_ context.Context, _ string) (cluster.Cluster, error) { +func (m *testManager) GetCluster(_ context.Context, _ multicluster.ClusterName) (cluster.Cluster, error) { return m.cluster, nil } func (m *testManager) Add(mcmanager.Runnable) error { return nil } @@ -61,13 +63,15 @@ func (m *testManager) GetControllerOptions() config.Controller { func (m *testManager) ClusterFromContext(context.Context) (cluster.Cluster, error) { return nil, nil } -func (m *testManager) GetManager(context.Context, string) (manager.Manager, error) { +func (m *testManager) GetManager(context.Context, multicluster.ClusterName) (manager.Manager, error) { return nil, nil } func (m *testManager) GetLocalManager() manager.Manager { return nil } func (m *testManager) GetProvider() multicluster.Provider { return nil } func (m *testManager) GetFieldIndexer() client.FieldIndexer { return nil } -func (m *testManager) Engage(context.Context, string, cluster.Cluster) error { return nil } +func (m *testManager) Engage(context.Context, multicluster.ClusterName, cluster.Cluster) error { + return nil +} func testScheme(t *testing.T) *runtime.Scheme { t.Helper() diff --git a/internal/quota/controllers/policy/claim_creation.go b/internal/quota/controllers/policy/claim_creation.go index 771386f4..dd18ee69 100644 --- a/internal/quota/controllers/policy/claim_creation.go +++ b/internal/quota/controllers/policy/claim_creation.go @@ -176,7 +176,7 @@ func (r *ClaimCreationPolicyReconciler) SetupWithManager(mgr mcmanager.Manager) return mcbuilder.ControllerManagedBy(mgr). For("av1alpha1.ClaimCreationPolicy{}, mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true)). + mcbuilder.WithEngageWithProviderClusters(false)). // Watch ResourceRegistrations to revalidate policies when registrations change Watches( "av1alpha1.ResourceRegistration{}, @@ -186,7 +186,7 @@ func (r *ClaimCreationPolicyReconciler) SetupWithManager(mgr mcmanager.Manager) }, ), mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true), + mcbuilder.WithEngageWithProviderClusters(false), ). Named("claim-creation-policy"). Complete(r) diff --git a/internal/quota/controllers/policy/grant_creation.go b/internal/quota/controllers/policy/grant_creation.go index ec2c4f00..0cff0db6 100644 --- a/internal/quota/controllers/policy/grant_creation.go +++ b/internal/quota/controllers/policy/grant_creation.go @@ -194,7 +194,7 @@ func (r *GrantCreationPolicyReconciler) SetupWithManager(mgr mcmanager.Manager) return mcbuilder.ControllerManagedBy(mgr). For("av1alpha1.GrantCreationPolicy{}, mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true)). + mcbuilder.WithEngageWithProviderClusters(false)). // Watch ResourceRegistrations to revalidate policies when registrations change Watches( "av1alpha1.ResourceRegistration{}, @@ -204,7 +204,7 @@ func (r *GrantCreationPolicyReconciler) SetupWithManager(mgr mcmanager.Manager) }, ), mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true), + mcbuilder.WithEngageWithProviderClusters(false), ). Named("grant-creation-policy"). Complete(r) diff --git a/internal/quota/controllers/policy/grant_creation_executor.go b/internal/quota/controllers/policy/grant_creation_executor.go index 0d62ad74..de465750 100644 --- a/internal/quota/controllers/policy/grant_creation_executor.go +++ b/internal/quota/controllers/policy/grant_creation_executor.go @@ -445,7 +445,7 @@ func (r *GrantCreationController) SetupWithManager(mgr mcmanager.Manager) error controller := mcbuilder.ControllerManagedBy(mgr). For("av1alpha1.GrantCreationPolicy{}, mcbuilder.WithEngageWithLocalCluster(true), - mcbuilder.WithEngageWithProviderClusters(true)). + mcbuilder.WithEngageWithProviderClusters(false)). Named("grant-creation-controller") r.logger.Info("GrantCreationController setup completed successfully") diff --git a/internal/quota/controllers/policy/reconciler_test.go b/internal/quota/controllers/policy/reconciler_test.go index fab36438..3d89fcae 100644 --- a/internal/quota/controllers/policy/reconciler_test.go +++ b/internal/quota/controllers/policy/reconciler_test.go @@ -21,6 +21,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" "github.com/go-logr/logr" + "k8s.io/client-go/tools/events" "k8s.io/client-go/tools/record" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" @@ -49,6 +50,7 @@ func (c *testCluster) GetConfig() *rest.Config { return n func (c *testCluster) GetCache() cache.Cache { return nil } func (c *testCluster) GetFieldIndexer() client.FieldIndexer { return nil } func (c *testCluster) GetEventRecorderFor(string) record.EventRecorder { return nil } +func (c *testCluster) GetEventRecorder(string) events.EventRecorder { return nil } func (c *testCluster) GetRESTMapper() meta.RESTMapper { return nil } func (c *testCluster) GetAPIReader() client.Reader { return nil } func (c *testCluster) Start(context.Context) error { return nil } @@ -58,7 +60,7 @@ type testManager struct { cluster cluster.Cluster } -func (m *testManager) GetCluster(_ context.Context, _ string) (cluster.Cluster, error) { +func (m *testManager) GetCluster(_ context.Context, _ multicluster.ClusterName) (cluster.Cluster, error) { return m.cluster, nil } @@ -75,13 +77,15 @@ func (m *testManager) GetControllerOptions() config.Controller { func (m *testManager) ClusterFromContext(context.Context) (cluster.Cluster, error) { return nil, nil } -func (m *testManager) GetManager(context.Context, string) (manager.Manager, error) { +func (m *testManager) GetManager(context.Context, multicluster.ClusterName) (manager.Manager, error) { return nil, nil } func (m *testManager) GetLocalManager() manager.Manager { return nil } func (m *testManager) GetProvider() multicluster.Provider { return nil } func (m *testManager) GetFieldIndexer() client.FieldIndexer { return nil } -func (m *testManager) Engage(context.Context, string, cluster.Cluster) error { return nil } +func (m *testManager) Engage(context.Context, multicluster.ClusterName, cluster.Cluster) error { + return nil +} // newFakeClient creates a fake client builder with the test scheme and status subresource support. func newFakeClient(scheme *runtime.Scheme, objs ...client.Object) client.Client { diff --git a/internal/webhooks/iam/v1alpha1/platformaccessapproval_webhook.go b/internal/webhooks/iam/v1alpha1/platformaccessapproval_webhook.go index 83371869..64b7c1da 100644 --- a/internal/webhooks/iam/v1alpha1/platformaccessapproval_webhook.go +++ b/internal/webhooks/iam/v1alpha1/platformaccessapproval_webhook.go @@ -7,7 +7,6 @@ import ( "strings" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -52,8 +51,7 @@ func SetupPlatformAccessApprovalWebhooksWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to index user email key: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.PlatformAccessApproval{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.PlatformAccessApproval{}). WithDefaulter(&PlatformAccessApprovalMutator{ client: mgr.GetClient(), }). @@ -70,11 +68,7 @@ type PlatformAccessApprovalMutator struct { client client.Client } -func (m *PlatformAccessApprovalMutator) Default(ctx context.Context, obj runtime.Object) error { - paa, ok := obj.(*iamv1alpha1.PlatformAccessApproval) - if !ok { - return errors.NewInternalError(fmt.Errorf("failed to cast object to PlatformAccessApproval")) - } +func (m *PlatformAccessApprovalMutator) Default(ctx context.Context, paa *iamv1alpha1.PlatformAccessApproval) error { log := logf.FromContext(ctx).WithValues("Defaulting PlatformAccessApproval", "name", paa.GetName()) // Approver is the user who is approving the access request. @@ -117,8 +111,7 @@ type PlatformAccessApprovalValidator struct { client client.Client } -func (v *PlatformAccessApprovalValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - paa := obj.(*iamv1alpha1.PlatformAccessApproval) +func (v *PlatformAccessApprovalValidator) ValidateCreate(ctx context.Context, paa *iamv1alpha1.PlatformAccessApproval) (admission.Warnings, error) { log := logf.FromContext(ctx).WithValues("Validating PlatformAccessApproval", "name", paa.GetName()) var errs field.ErrorList @@ -193,10 +186,10 @@ func (v *PlatformAccessApprovalValidator) ValidateCreate(ctx context.Context, ob return nil, nil } -func (v *PlatformAccessApprovalValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *PlatformAccessApprovalValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *iamv1alpha1.PlatformAccessApproval) (admission.Warnings, error) { return nil, nil } -func (v *PlatformAccessApprovalValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *PlatformAccessApprovalValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.PlatformAccessApproval) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/iam/v1alpha1/platformaccessarejection_webhook.go b/internal/webhooks/iam/v1alpha1/platformaccessarejection_webhook.go index 0b677e0b..e8a3bb9d 100644 --- a/internal/webhooks/iam/v1alpha1/platformaccessarejection_webhook.go +++ b/internal/webhooks/iam/v1alpha1/platformaccessarejection_webhook.go @@ -5,7 +5,6 @@ import ( "fmt" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -18,8 +17,7 @@ import ( const platformAccessRejectionIndexKey = "iam.miloapis.com/platformaccessrejection" func SetupPlatformAccessRejectionWebhooksWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.PlatformAccessRejection{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.PlatformAccessRejection{}). WithDefaulter(&PlatformAccessRejectionMutator{ client: mgr.GetClient(), }). @@ -36,11 +34,7 @@ type PlatformAccessRejectionMutator struct { client client.Client } -func (m *PlatformAccessRejectionMutator) Default(ctx context.Context, obj runtime.Object) error { - par, ok := obj.(*iamv1alpha1.PlatformAccessRejection) - if !ok { - return errors.NewInternalError(fmt.Errorf("failed to cast object to PlatformAccessRejection")) - } +func (m *PlatformAccessRejectionMutator) Default(ctx context.Context, par *iamv1alpha1.PlatformAccessRejection) error { log := logf.FromContext(ctx).WithValues("Defaulting PlatformAccessRejection", "name", par.GetName()) // Rejecter is the user who is rejecting the access request. @@ -73,8 +67,7 @@ type PlatformAccessRejectionValidator struct { client client.Client } -func (v *PlatformAccessRejectionValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - par := obj.(*iamv1alpha1.PlatformAccessRejection) +func (v *PlatformAccessRejectionValidator) ValidateCreate(ctx context.Context, par *iamv1alpha1.PlatformAccessRejection) (admission.Warnings, error) { log := logf.FromContext(ctx).WithValues("Validating PlatformAccessRejection", "name", par.GetName()) var errs field.ErrorList @@ -121,10 +114,10 @@ func (v *PlatformAccessRejectionValidator) ValidateCreate(ctx context.Context, o return nil, nil } -func (v *PlatformAccessRejectionValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *PlatformAccessRejectionValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *iamv1alpha1.PlatformAccessRejection) (admission.Warnings, error) { return nil, nil } -func (v *PlatformAccessRejectionValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *PlatformAccessRejectionValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.PlatformAccessRejection) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/iam/v1alpha1/platforminvitation_webhook.go b/internal/webhooks/iam/v1alpha1/platforminvitation_webhook.go index cadc5e06..d3ada574 100644 --- a/internal/webhooks/iam/v1alpha1/platforminvitation_webhook.go +++ b/internal/webhooks/iam/v1alpha1/platforminvitation_webhook.go @@ -9,7 +9,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -44,8 +43,7 @@ func SetupPlatformInvitationWebhooksWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to index platforminvitation email key: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.PlatformInvitation{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.PlatformInvitation{}). WithDefaulter(&PlatformInvitationMutator{client: mgr.GetClient()}). WithValidator(&PlatformInvitationValidator{client: mgr.GetClient()}). Complete() @@ -59,12 +57,7 @@ type PlatformInvitationMutator struct { } // Default sets the InvitedBy field to the requesting user. -func (m *PlatformInvitationMutator) Default(ctx context.Context, obj runtime.Object) error { - pi, ok := obj.(*iamv1alpha1.PlatformInvitation) - if !ok { - return fmt.Errorf("failed to cast object to PlatformInvitation") - } - +func (m *PlatformInvitationMutator) Default(ctx context.Context, pi *iamv1alpha1.PlatformInvitation) error { req, err := admission.RequestFromContext(ctx) if err != nil { platforminvitationlog.Error(err, "failed to get admission request from context", "name", pi.GetName()) @@ -91,11 +84,7 @@ type PlatformInvitationValidator struct { client client.Client } -func (v *PlatformInvitationValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - pi, ok := obj.(*iamv1alpha1.PlatformInvitation) - if !ok { - return nil, fmt.Errorf("failed to cast object to PlatformInvitation") - } +func (v *PlatformInvitationValidator) ValidateCreate(ctx context.Context, pi *iamv1alpha1.PlatformInvitation) (admission.Warnings, error) { platforminvitationlog.Info("Validating PlatformInvitation", "name", pi.Name) var errs field.ErrorList @@ -142,10 +131,10 @@ func (v *PlatformInvitationValidator) ValidateCreate(ctx context.Context, obj ru return nil, nil } -func (v *PlatformInvitationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *PlatformInvitationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *iamv1alpha1.PlatformInvitation) (admission.Warnings, error) { return nil, nil } -func (v *PlatformInvitationValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *PlatformInvitationValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.PlatformInvitation) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/iam/v1alpha1/user_webhook.go b/internal/webhooks/iam/v1alpha1/user_webhook.go index b114963f..13393d1d 100644 --- a/internal/webhooks/iam/v1alpha1/user_webhook.go +++ b/internal/webhooks/iam/v1alpha1/user_webhook.go @@ -29,8 +29,7 @@ var userlog = logf.Log.WithName("user-resource") func SetupUserWebhooksWithManager(mgr ctrl.Manager, systemNamespace string, userSelfManageRoleName string) error { userlog.Info("Setting up iam.miloapis.com user webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.User{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.User{}). WithValidator(&UserValidator{ client: mgr.GetClient(), restConfig: mgr.GetConfig(), @@ -51,8 +50,7 @@ type UserValidator struct { userSelfManageRoleName string } -func (v *UserValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - user := obj.(*iamv1alpha1.User) +func (v *UserValidator) ValidateCreate(ctx context.Context, user *iamv1alpha1.User) (admission.Warnings, error) { userlog.Info("Validating User", "name", user.Name) req, err := admission.RequestFromContext(ctx) @@ -83,10 +81,7 @@ func (v *UserValidator) ValidateCreate(ctx context.Context, obj runtime.Object) return nil, nil } -func (v *UserValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - oldUser := oldObj.(*iamv1alpha1.User) - newUser := newObj.(*iamv1alpha1.User) - +func (v *UserValidator) ValidateUpdate(ctx context.Context, oldUser, newUser *iamv1alpha1.User) (admission.Warnings, error) { // If email hasn't changed, allow the update if oldUser.Spec.Email == newUser.Spec.Email { return nil, nil @@ -179,7 +174,7 @@ func (v *UserValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runti availableEmails)) } -func (v *UserValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *UserValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.User) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/iam/v1alpha1/userdeactivation_webhook.go b/internal/webhooks/iam/v1alpha1/userdeactivation_webhook.go index 18b557e1..a2be91c2 100644 --- a/internal/webhooks/iam/v1alpha1/userdeactivation_webhook.go +++ b/internal/webhooks/iam/v1alpha1/userdeactivation_webhook.go @@ -21,8 +21,7 @@ var userdeactivationlog = logf.Log.WithName("userdeactivation-resource") func SetupUserDeactivationWebhooksWithManager(mgr ctrl.Manager, systemNamespace string) error { userdeactivationlog.Info("Setting up iam.miloapis.com userdeactivation webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.UserDeactivation{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.UserDeactivation{}). WithDefaulter(&UserDeactivationMutator{client: mgr.GetClient(), scheme: mgr.GetScheme()}). WithValidator(&UserDeactivationValidator{ client: mgr.GetClient(), @@ -40,11 +39,7 @@ type UserDeactivationMutator struct { } // Default sets the deactivatedBy field to the username of the requesting user if it is not already set. -func (m *UserDeactivationMutator) Default(ctx context.Context, obj runtime.Object) error { - ud, ok := obj.(*iamv1alpha1.UserDeactivation) - if !ok { - return fmt.Errorf("failed to cast object to UserDeactivation") - } +func (m *UserDeactivationMutator) Default(ctx context.Context, ud *iamv1alpha1.UserDeactivation) error { userdeactivationlog.Info("Defaulting UserDeactivation", "name", ud.GetName()) req, err := admission.RequestFromContext(ctx) @@ -79,8 +74,7 @@ type UserDeactivationValidator struct { systemNamespace string } -func (v *UserDeactivationValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - userDeactivation := obj.(*iamv1alpha1.UserDeactivation) +func (v *UserDeactivationValidator) ValidateCreate(ctx context.Context, userDeactivation *iamv1alpha1.UserDeactivation) (admission.Warnings, error) { userdeactivationlog.Info("Validating UserDeactivation", "name", userDeactivation.Name) var errs field.ErrorList @@ -124,10 +118,10 @@ func (v *UserDeactivationValidator) ValidateCreate(ctx context.Context, obj runt return nil, nil } -func (v *UserDeactivationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *UserDeactivationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *iamv1alpha1.UserDeactivation) (admission.Warnings, error) { return nil, nil } -func (v *UserDeactivationValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *UserDeactivationValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.UserDeactivation) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/iam/v1alpha1/userinvitation_webhook.go b/internal/webhooks/iam/v1alpha1/userinvitation_webhook.go index 8358fb9a..65910f6e 100644 --- a/internal/webhooks/iam/v1alpha1/userinvitation_webhook.go +++ b/internal/webhooks/iam/v1alpha1/userinvitation_webhook.go @@ -9,7 +9,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -64,8 +63,7 @@ func SetupUserInvitationWebhooksWithManager(mgr ctrl.Manager, systemNamespace, a return fmt.Errorf("failed to set field index on User by email: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(&iamv1alpha1.UserInvitation{}). + return ctrl.NewWebhookManagedBy(mgr, &iamv1alpha1.UserInvitation{}). WithDefaulter(&UserInvitationMutator{ client: mgr.GetClient(), }). @@ -85,12 +83,7 @@ type UserInvitationMutator struct { } // Default sets the InvitedBy field to the requesting user if not already set. -func (m *UserInvitationMutator) Default(ctx context.Context, obj runtime.Object) error { - ui, ok := obj.(*iamv1alpha1.UserInvitation) - if !ok { - return fmt.Errorf("failed to cast object to UserInvitation") - } - +func (m *UserInvitationMutator) Default(ctx context.Context, ui *iamv1alpha1.UserInvitation) error { req, err := admission.RequestFromContext(ctx) if err != nil { userinvitationlog.Error(err, "failed to get admission request from context", "name", ui.GetName()) @@ -120,11 +113,7 @@ type UserInvitationValidator struct { } // ValidateCreate ensures the expiration date, if provided, is not already expired. -func (v *UserInvitationValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - ui, ok := obj.(*iamv1alpha1.UserInvitation) - if !ok { - return nil, fmt.Errorf("failed to cast object to UserInvitation") - } +func (v *UserInvitationValidator) ValidateCreate(ctx context.Context, ui *iamv1alpha1.UserInvitation) (admission.Warnings, error) { userinvitationlog.Info("Validating UserInvitation", "name", ui.Name) req, err := admission.RequestFromContext(ctx) @@ -200,11 +189,11 @@ func (v *UserInvitationValidator) ValidateCreate(ctx context.Context, obj runtim return nil, nil } -func (v *UserInvitationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *UserInvitationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *iamv1alpha1.UserInvitation) (admission.Warnings, error) { return nil, nil } -func (v *UserInvitationValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *UserInvitationValidator) ValidateDelete(ctx context.Context, obj *iamv1alpha1.UserInvitation) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/identity/v1alpha1/useridentity_webhook.go b/internal/webhooks/identity/v1alpha1/useridentity_webhook.go index 962f41b9..2ff4e568 100644 --- a/internal/webhooks/identity/v1alpha1/useridentity_webhook.go +++ b/internal/webhooks/identity/v1alpha1/useridentity_webhook.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -20,8 +19,7 @@ var useridentitylog = logf.Log.WithName("useridentity-resource") func SetupUserIdentityWebhooksWithManager(mgr ctrl.Manager) error { useridentitylog.Info("Setting up identity.miloapis.com useridentity webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(&identityv1alpha1.UserIdentity{}). + return ctrl.NewWebhookManagedBy(mgr, &identityv1alpha1.UserIdentity{}). WithValidator(&UserIdentityValidator{}). Complete() } @@ -29,16 +27,15 @@ func SetupUserIdentityWebhooksWithManager(mgr ctrl.Manager) error { // UserIdentityValidator validates UserIdentity resources type UserIdentityValidator struct{} -func (v *UserIdentityValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *UserIdentityValidator) ValidateCreate(ctx context.Context, obj *identityv1alpha1.UserIdentity) (admission.Warnings, error) { return nil, nil } -func (v *UserIdentityValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *UserIdentityValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *identityv1alpha1.UserIdentity) (admission.Warnings, error) { return nil, nil } -func (v *UserIdentityValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - userIdentity := obj.(*identityv1alpha1.UserIdentity) +func (v *UserIdentityValidator) ValidateDelete(ctx context.Context, userIdentity *identityv1alpha1.UserIdentity) (admission.Warnings, error) { useridentitylog.Info("Blocking UserIdentity deletion", "name", userIdentity.Name) return nil, fmt.Errorf( diff --git a/internal/webhooks/notes/v1alpha1/clusternote_webhook.go b/internal/webhooks/notes/v1alpha1/clusternote_webhook.go index 689b3d64..5b4aaf2e 100644 --- a/internal/webhooks/notes/v1alpha1/clusternote_webhook.go +++ b/internal/webhooks/notes/v1alpha1/clusternote_webhook.go @@ -27,8 +27,7 @@ var clusterNoteLog = logf.Log.WithName("clusternote-resource") func SetupClusterNoteWebhooksWithManager(mgr ctrl.Manager, mcMgr mcmanager.Manager) error { clusterNoteLog.Info("Setting up notes.miloapis.com clusternote webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(¬esv1alpha1.ClusterNote{}). + return ctrl.NewWebhookManagedBy(mgr, ¬esv1alpha1.ClusterNote{}). WithDefaulter(&ClusterNoteMutator{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), @@ -50,13 +49,9 @@ type ClusterNoteMutator struct { ClusterManager mcmanager.Manager } -var _ admission.CustomDefaulter = &ClusterNoteMutator{} +var _ admission.Defaulter[*notesv1alpha1.ClusterNote] = &ClusterNoteMutator{} -func (m *ClusterNoteMutator) Default(ctx context.Context, obj runtime.Object) error { - clusterNote, ok := obj.(*notesv1alpha1.ClusterNote) - if !ok { - return errors.NewInternalError(fmt.Errorf("failed to cast object to ClusterNote")) - } +func (m *ClusterNoteMutator) Default(ctx context.Context, clusterNote *notesv1alpha1.ClusterNote) error { clusterNoteLog.Info("Defaulting ClusterNote", "name", clusterNote.Name) req, err := admission.RequestFromContext(ctx) @@ -137,27 +132,15 @@ type ClusterNoteValidator struct { Client client.Client } -var _ admission.CustomValidator = &ClusterNoteValidator{} +var _ admission.Validator[*notesv1alpha1.ClusterNote] = &ClusterNoteValidator{} -func (v *ClusterNoteValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - clusterNote, ok := obj.(*notesv1alpha1.ClusterNote) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ClusterNote")) - } +func (v *ClusterNoteValidator) ValidateCreate(ctx context.Context, clusterNote *notesv1alpha1.ClusterNote) (admission.Warnings, error) { clusterNoteLog.Info("Validating ClusterNote creation", "name", clusterNote.Name) return nil, v.validateClusterNote(ctx, clusterNote, false) } -func (v *ClusterNoteValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - clusterNote, ok := newObj.(*notesv1alpha1.ClusterNote) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ClusterNote")) - } - oldClusterNote, ok := oldObj.(*notesv1alpha1.ClusterNote) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast old object to ClusterNote")) - } +func (v *ClusterNoteValidator) ValidateUpdate(ctx context.Context, oldClusterNote, clusterNote *notesv1alpha1.ClusterNote) (admission.Warnings, error) { clusterNoteLog.Info("Validating ClusterNote update", "name", clusterNote.Name) skipNextActionTimeValidation := oldClusterNote.Spec.NextActionTime != nil && @@ -167,7 +150,7 @@ func (v *ClusterNoteValidator) ValidateUpdate(ctx context.Context, oldObj, newOb return nil, v.validateClusterNote(ctx, clusterNote, skipNextActionTimeValidation) } -func (v *ClusterNoteValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ClusterNoteValidator) ValidateDelete(ctx context.Context, obj *notesv1alpha1.ClusterNote) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/notes/v1alpha1/note_webhook.go b/internal/webhooks/notes/v1alpha1/note_webhook.go index c0ce545f..8d34746b 100644 --- a/internal/webhooks/notes/v1alpha1/note_webhook.go +++ b/internal/webhooks/notes/v1alpha1/note_webhook.go @@ -27,8 +27,7 @@ var noteLog = logf.Log.WithName("note-resource") func SetupNoteWebhooksWithManager(mgr ctrl.Manager, mcMgr mcmanager.Manager) error { noteLog.Info("Setting up notes.miloapis.com note webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(¬esv1alpha1.Note{}). + return ctrl.NewWebhookManagedBy(mgr, ¬esv1alpha1.Note{}). WithDefaulter(&NoteMutator{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), @@ -50,13 +49,9 @@ type NoteMutator struct { ClusterManager mcmanager.Manager } -var _ admission.CustomDefaulter = &NoteMutator{} +var _ admission.Defaulter[*notesv1alpha1.Note] = &NoteMutator{} -func (m *NoteMutator) Default(ctx context.Context, obj runtime.Object) error { - note, ok := obj.(*notesv1alpha1.Note) - if !ok { - return errors.NewInternalError(fmt.Errorf("failed to cast object to Note")) - } +func (m *NoteMutator) Default(ctx context.Context, note *notesv1alpha1.Note) error { noteLog.Info("Defaulting Note", "name", note.Name, "namespace", note.Namespace) req, err := admission.RequestFromContext(ctx) @@ -138,27 +133,15 @@ type NoteValidator struct { Client client.Client } -var _ admission.CustomValidator = &NoteValidator{} +var _ admission.Validator[*notesv1alpha1.Note] = &NoteValidator{} -func (v *NoteValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - note, ok := obj.(*notesv1alpha1.Note) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to Note")) - } +func (v *NoteValidator) ValidateCreate(ctx context.Context, note *notesv1alpha1.Note) (admission.Warnings, error) { noteLog.Info("Validating Note creation", "name", note.Name, "namespace", note.Namespace) return nil, v.validateNote(ctx, note, false) } -func (v *NoteValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - note, ok := newObj.(*notesv1alpha1.Note) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to Note")) - } - oldNote, ok := oldObj.(*notesv1alpha1.Note) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast old object to Note")) - } +func (v *NoteValidator) ValidateUpdate(ctx context.Context, oldNote, note *notesv1alpha1.Note) (admission.Warnings, error) { noteLog.Info("Validating Note update", "name", note.Name, "namespace", note.Namespace) skipNextActionTimeValidation := oldNote.Spec.NextActionTime != nil && @@ -168,7 +151,7 @@ func (v *NoteValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runti return nil, v.validateNote(ctx, note, skipNextActionTimeValidation) } -func (v *NoteValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *NoteValidator) ValidateDelete(ctx context.Context, obj *notesv1alpha1.Note) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/notification/v1alpha1/contact_webhook.go b/internal/webhooks/notification/v1alpha1/contact_webhook.go index c8e7a4f1..7047de88 100644 --- a/internal/webhooks/notification/v1alpha1/contact_webhook.go +++ b/internal/webhooks/notification/v1alpha1/contact_webhook.go @@ -61,8 +61,7 @@ func SetupContactWebhooksWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to index contactEmailKey: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.Contact{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.Contact{}). WithDefaulter(&ContactMutator{ client: mgr.GetClient(), scheme: mgr.GetScheme(), @@ -81,11 +80,7 @@ type ContactMutator struct { scheme *runtime.Scheme } -func (m *ContactMutator) Default(ctx context.Context, obj runtime.Object) error { - contact, ok := obj.(*notificationv1alpha1.Contact) - if !ok { - return errors.NewInternalError(fmt.Errorf("failed to cast object to Contact")) - } +func (m *ContactMutator) Default(ctx context.Context, contact *notificationv1alpha1.Contact) error { contactLog.Info("Defaulting Contact", "name", contact.Name) if contact.Spec.SubjectRef != nil { @@ -111,12 +106,8 @@ type ContactValidator struct { Client client.Client } -func (v *ContactValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ContactValidator) ValidateCreate(ctx context.Context, contact *notificationv1alpha1.Contact) (admission.Warnings, error) { errs := field.ErrorList{} - contact, ok := obj.(*notificationv1alpha1.Contact) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to Contact")) - } contactLog.Info("Validating Contact", "name", contact.Name) // Validate Email format @@ -251,17 +242,12 @@ func contactValidationResult(errs field.ErrorList, contact *notificationv1alpha1 } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *ContactValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ContactValidator) ValidateDelete(ctx context.Context, obj *notificationv1alpha1.Contact) (admission.Warnings, error) { return nil, nil } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *ContactValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - contactNew, okNew := newObj.(*notificationv1alpha1.Contact) - contactOld, okOld := oldObj.(*notificationv1alpha1.Contact) - if !okNew || !okOld { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object(s) to Contact")) - } +func (v *ContactValidator) ValidateUpdate(ctx context.Context, contactOld, contactNew *notificationv1alpha1.Contact) (admission.Warnings, error) { errs := field.ErrorList{} // If the SubjectRef changed, reject the update. diff --git a/internal/webhooks/notification/v1alpha1/contactgroup_webhook.go b/internal/webhooks/notification/v1alpha1/contactgroup_webhook.go index 7d98fea7..ed5d54fd 100644 --- a/internal/webhooks/notification/v1alpha1/contactgroup_webhook.go +++ b/internal/webhooks/notification/v1alpha1/contactgroup_webhook.go @@ -6,7 +6,6 @@ import ( notificationv1alpha1 "go.miloapis.com/milo/pkg/apis/notification/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -35,8 +34,7 @@ func SetupContactGroupWebhooksWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to set contactgroup field index: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.ContactGroup{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.ContactGroup{}). WithValidator(&ContactGroupValidator{ Client: mgr.GetClient(), }). @@ -50,12 +48,7 @@ type ContactGroupValidator struct { } // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *ContactGroupValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - cg, ok := obj.(*notificationv1alpha1.ContactGroup) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ContactGroup")) - } - +func (v *ContactGroupValidator) ValidateCreate(ctx context.Context, cg *notificationv1alpha1.ContactGroup) (admission.Warnings, error) { contactGroupLog.Info("Validating ContactGroup", "name", cg.Name) var errs field.ErrorList @@ -78,11 +71,11 @@ func (v *ContactGroupValidator) ValidateCreate(ctx context.Context, obj runtime. } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (v *ContactGroupValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *ContactGroupValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *notificationv1alpha1.ContactGroup) (admission.Warnings, error) { return nil, nil } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *ContactGroupValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ContactGroupValidator) ValidateDelete(ctx context.Context, obj *notificationv1alpha1.ContactGroup) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/notification/v1alpha1/contactgroupmembership_webhook.go b/internal/webhooks/notification/v1alpha1/contactgroupmembership_webhook.go index f110845f..c4b4f6f9 100644 --- a/internal/webhooks/notification/v1alpha1/contactgroupmembership_webhook.go +++ b/internal/webhooks/notification/v1alpha1/contactgroupmembership_webhook.go @@ -6,7 +6,6 @@ import ( notificationv1alpha1 "go.miloapis.com/milo/pkg/apis/notification/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -45,8 +44,7 @@ func SetupContactGroupMembershipWebhooksWithManager(mgr ctrl.Manager) error { return fmt.Errorf("failed to index contactgroupmembershipremoval composite key: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.ContactGroupMembership{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.ContactGroupMembership{}). WithValidator(&ContactGroupMembershipValidator{Client: mgr.GetClient()}). Complete() } @@ -58,12 +56,7 @@ type ContactGroupMembershipValidator struct { } // ValidateCreate implements webhook.Validator for ContactGroupMembership -func (v *ContactGroupMembershipValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - cgm, ok := obj.(*notificationv1alpha1.ContactGroupMembership) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ContactGroupMembership")) - } - +func (v *ContactGroupMembershipValidator) ValidateCreate(ctx context.Context, cgm *notificationv1alpha1.ContactGroupMembership) (admission.Warnings, error) { cgmLog.Info("Validating ContactGroupMembership", "name", cgm.Name) var errs field.ErrorList @@ -118,10 +111,10 @@ func (v *ContactGroupMembershipValidator) ValidateCreate(ctx context.Context, ob return nil, nil } -func (v *ContactGroupMembershipValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *ContactGroupMembershipValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *notificationv1alpha1.ContactGroupMembership) (admission.Warnings, error) { return nil, nil } -func (v *ContactGroupMembershipValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ContactGroupMembershipValidator) ValidateDelete(ctx context.Context, obj *notificationv1alpha1.ContactGroupMembership) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/notification/v1alpha1/contactgroupmembershipremoval_webhook.go b/internal/webhooks/notification/v1alpha1/contactgroupmembershipremoval_webhook.go index 2f77f9d9..40135dcb 100644 --- a/internal/webhooks/notification/v1alpha1/contactgroupmembershipremoval_webhook.go +++ b/internal/webhooks/notification/v1alpha1/contactgroupmembershipremoval_webhook.go @@ -6,7 +6,6 @@ import ( notificationv1alpha1 "go.miloapis.com/milo/pkg/apis/notification/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -30,8 +29,7 @@ func SetupContactGroupMembershipRemovalWebhooksWithManager(mgr ctrl.Manager) err return fmt.Errorf("failed to index contactgroupmembershipremoval by contact name: %w", err) } - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.ContactGroupMembershipRemoval{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.ContactGroupMembershipRemoval{}). WithValidator(&ContactGroupMembershipRemovalValidator{Client: mgr.GetClient()}). Complete() } @@ -42,11 +40,7 @@ type ContactGroupMembershipRemovalValidator struct { Client client.Client } -func (v *ContactGroupMembershipRemovalValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - removal, ok := obj.(*notificationv1alpha1.ContactGroupMembershipRemoval) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ContactGroupMembershipRemoval")) - } +func (v *ContactGroupMembershipRemovalValidator) ValidateCreate(ctx context.Context, removal *notificationv1alpha1.ContactGroupMembershipRemoval) (admission.Warnings, error) { var errs field.ErrorList // Ensure Contact exists @@ -88,16 +82,11 @@ func (v *ContactGroupMembershipRemovalValidator) ValidateCreate(ctx context.Cont return nil, nil } -func (v *ContactGroupMembershipRemovalValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *ContactGroupMembershipRemovalValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *notificationv1alpha1.ContactGroupMembershipRemoval) (admission.Warnings, error) { return nil, errors.NewBadRequest("ContactGroupMembershipRemoval is immutable; delete and recreate to modify") } -func (v *ContactGroupMembershipRemovalValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - removal, ok := obj.(*notificationv1alpha1.ContactGroupMembershipRemoval) - if !ok { - return nil, errors.NewInternalError(fmt.Errorf("failed to cast object to ContactGroupMembershipRemoval")) - } - +func (v *ContactGroupMembershipRemovalValidator) ValidateDelete(ctx context.Context, removal *notificationv1alpha1.ContactGroupMembershipRemoval) (admission.Warnings, error) { // Validate contact ownership when in user context // Retrieve the referenced Contact to check its ownership contact := ¬ificationv1alpha1.Contact{} diff --git a/internal/webhooks/notification/v1alpha1/email_webhook.go b/internal/webhooks/notification/v1alpha1/email_webhook.go index 9d2dd7ca..6706d91d 100644 --- a/internal/webhooks/notification/v1alpha1/email_webhook.go +++ b/internal/webhooks/notification/v1alpha1/email_webhook.go @@ -9,7 +9,6 @@ import ( notificationv1alpha1 "go.miloapis.com/milo/pkg/apis/notification/v1alpha1" "go.miloapis.com/milo/pkg/email/templating" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -23,8 +22,7 @@ var emailLog = logf.Log.WithName("email-resource") func SetupEmailWebhooksWithManager(mgr ctrl.Manager) error { emailLog.Info("Setting up notification.miloapis.com email webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.Email{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.Email{}). WithValidator(&EmailValidator{ Client: mgr.GetClient(), }). @@ -39,11 +37,7 @@ type EmailValidator struct { } // ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (v *EmailValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - email, ok := obj.(*notificationv1alpha1.Email) - if !ok { - return nil, fmt.Errorf("failed to cast object to Email") - } +func (v *EmailValidator) ValidateCreate(ctx context.Context, email *notificationv1alpha1.Email) (admission.Warnings, error) { emailLog.Info("validate create", "name", email.Name) var errs field.ErrorList @@ -111,15 +105,11 @@ func (v *EmailValidator) ValidateCreate(ctx context.Context, obj runtime.Object) // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type // We do not allow updates to Email resources as they are immutable. -func (v *EmailValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - _, ok := newObj.(*notificationv1alpha1.Email) - if !ok { - return nil, fmt.Errorf("failed to cast object to Email") - } +func (v *EmailValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *notificationv1alpha1.Email) (admission.Warnings, error) { return nil, errors.NewMethodNotSupported(notificationv1alpha1.SchemeGroupVersion.WithResource("emails").GroupResource(), "update") } // ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (v *EmailValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *EmailValidator) ValidateDelete(ctx context.Context, obj *notificationv1alpha1.Email) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/notification/v1alpha1/emailtemplate_webhook.go b/internal/webhooks/notification/v1alpha1/emailtemplate_webhook.go index 09d47413..76a5c1f8 100644 --- a/internal/webhooks/notification/v1alpha1/emailtemplate_webhook.go +++ b/internal/webhooks/notification/v1alpha1/emailtemplate_webhook.go @@ -4,7 +4,6 @@ import ( "context" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" ctrl "sigs.k8s.io/controller-runtime" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" @@ -19,8 +18,7 @@ var emailTemplateLog = logf.Log.WithName("emailtemplate-resource") func SetupEmailTemplateWebhooksWithManager(mgr ctrl.Manager, _ string) error { emailTemplateLog.Info("Setting up notification.miloapis.com emailtemplates webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(¬ificationv1alpha1.EmailTemplate{}). + return ctrl.NewWebhookManagedBy(mgr, ¬ificationv1alpha1.EmailTemplate{}). WithValidator(&EmailTemplateValidator{}). Complete() } @@ -29,8 +27,7 @@ func SetupEmailTemplateWebhooksWithManager(mgr ctrl.Manager, _ string) error { type EmailTemplateValidator struct{} -func (v *EmailTemplateValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - emailTemplate := obj.(*notificationv1alpha1.EmailTemplate) +func (v *EmailTemplateValidator) ValidateCreate(ctx context.Context, emailTemplate *notificationv1alpha1.EmailTemplate) (admission.Warnings, error) { emailTemplateLog.Info("Validating EmailTemplate", "name", emailTemplate.Name) errs := field.ErrorList{} @@ -51,12 +48,12 @@ func (v *EmailTemplateValidator) ValidateCreate(ctx context.Context, obj runtime return nil, nil } -func (v *EmailTemplateValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { +func (v *EmailTemplateValidator) ValidateUpdate(ctx context.Context, oldObj, newObj *notificationv1alpha1.EmailTemplate) (admission.Warnings, error) { // For updates we simply re-run the same validation against the new object. return v.ValidateCreate(ctx, newObj) } -func (v *EmailTemplateValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *EmailTemplateValidator) ValidateDelete(ctx context.Context, obj *notificationv1alpha1.EmailTemplate) (admission.Warnings, error) { // No special validation on delete. return nil, nil } diff --git a/internal/webhooks/resourcemanager/v1alpha1/organization_webhook.go b/internal/webhooks/resourcemanager/v1alpha1/organization_webhook.go index 247ddee1..f0d8f96d 100644 --- a/internal/webhooks/resourcemanager/v1alpha1/organization_webhook.go +++ b/internal/webhooks/resourcemanager/v1alpha1/organization_webhook.go @@ -8,7 +8,6 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -28,8 +27,7 @@ var organizationlog = logf.Log.WithName("organization-resource") func SetupOrganizationWebhooksWithManager(mgr ctrl.Manager, systemNamespace string, organizationOwnerRoleName string, organizationOwnerRoleNamespace string) error { organizationlog.Info("Setting up resourcemanager.miloapis.com organization webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(&resourcemanagerv1alpha1.Organization{}). + return ctrl.NewWebhookManagedBy(mgr, &resourcemanagerv1alpha1.Organization{}). WithValidator(&OrganizationValidator{ client: mgr.GetClient(), systemNamespace: systemNamespace, @@ -48,8 +46,7 @@ type OrganizationValidator struct { ownerRoleNamespace string } -func (v *OrganizationValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - org := obj.(*resourcemanagerv1alpha1.Organization) +func (v *OrganizationValidator) ValidateCreate(ctx context.Context, org *resourcemanagerv1alpha1.Organization) (admission.Warnings, error) { organizationlog.Info("Validating Organization", "name", org.Name) // Validate organization name length @@ -110,9 +107,7 @@ func (v *OrganizationValidator) ValidateCreate(ctx context.Context, obj runtime. return nil, nil } -func (v *OrganizationValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - newOrg := newObj.(*resourcemanagerv1alpha1.Organization) - +func (v *OrganizationValidator) ValidateUpdate(ctx context.Context, oldObj, newOrg *resourcemanagerv1alpha1.Organization) (admission.Warnings, error) { // Validate organization name length if len(newOrg.Name) > 50 { return nil, apierrors.NewInvalid( @@ -131,7 +126,7 @@ func (v *OrganizationValidator) ValidateUpdate(ctx context.Context, oldObj, newO return nil, nil } -func (v *OrganizationValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *OrganizationValidator) ValidateDelete(ctx context.Context, obj *resourcemanagerv1alpha1.Organization) (admission.Warnings, error) { return nil, nil } diff --git a/internal/webhooks/resourcemanager/v1alpha1/organizationmembership_webhook.go b/internal/webhooks/resourcemanager/v1alpha1/organizationmembership_webhook.go index f80fb41f..309d594a 100644 --- a/internal/webhooks/resourcemanager/v1alpha1/organizationmembership_webhook.go +++ b/internal/webhooks/resourcemanager/v1alpha1/organizationmembership_webhook.go @@ -7,7 +7,6 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -26,8 +25,7 @@ var organizationmembershiplog = logf.Log.WithName("organizationmembership-resour func SetupOrganizationMembershipWebhooksWithManager(mgr ctrl.Manager, organizationOwnerRoleName string, organizationOwnerRoleNamespace string) error { organizationmembershiplog.Info("Setting up resourcemanager.miloapis.com organizationmembership webhooks") - return ctrl.NewWebhookManagedBy(mgr). - For(&resourcemanagerv1alpha1.OrganizationMembership{}). + return ctrl.NewWebhookManagedBy(mgr, &resourcemanagerv1alpha1.OrganizationMembership{}). WithValidator(&OrganizationMembershipValidator{ client: mgr.GetClient(), apiReader: mgr.GetAPIReader(), @@ -46,8 +44,7 @@ type OrganizationMembershipValidator struct { ownerRoleNamespace string } -func (v *OrganizationMembershipValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - membership := obj.(*resourcemanagerv1alpha1.OrganizationMembership) +func (v *OrganizationMembershipValidator) ValidateCreate(ctx context.Context, membership *resourcemanagerv1alpha1.OrganizationMembership) (admission.Warnings, error) { organizationmembershiplog.Info("Validating OrganizationMembership create", "name", membership.Name, "namespace", membership.Namespace) // Validate roles if specified @@ -60,9 +57,7 @@ func (v *OrganizationMembershipValidator) ValidateCreate(ctx context.Context, ob return nil, nil } -func (v *OrganizationMembershipValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - oldMembership := oldObj.(*resourcemanagerv1alpha1.OrganizationMembership) - newMembership := newObj.(*resourcemanagerv1alpha1.OrganizationMembership) +func (v *OrganizationMembershipValidator) ValidateUpdate(ctx context.Context, oldMembership, newMembership *resourcemanagerv1alpha1.OrganizationMembership) (admission.Warnings, error) { organizationmembershiplog.Info("Validating OrganizationMembership update", "name", newMembership.Name, "namespace", newMembership.Namespace) // Validate roles if specified @@ -79,8 +74,7 @@ func (v *OrganizationMembershipValidator) ValidateUpdate(ctx context.Context, ol return nil, nil } -func (v *OrganizationMembershipValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - membership := obj.(*resourcemanagerv1alpha1.OrganizationMembership) +func (v *OrganizationMembershipValidator) ValidateDelete(ctx context.Context, membership *resourcemanagerv1alpha1.OrganizationMembership) (admission.Warnings, error) { organizationmembershiplog.Info("Validating OrganizationMembership delete", "name", membership.Name, "namespace", membership.Namespace) if !v.isOwnerMembership(membership) { diff --git a/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go b/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go index 35caf644..a5460903 100644 --- a/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go +++ b/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go @@ -2,13 +2,13 @@ package v1alpha1 import ( "context" + stderrors "errors" "fmt" iamv1alpha1 "go.miloapis.com/milo/pkg/apis/iam/v1alpha1" "go.miloapis.com/milo/pkg/apis/resourcemanager/v1alpha1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" @@ -23,8 +23,7 @@ var projectlog = logf.Log.WithName("project-resource") func SetupProjectWebhooksWithManager(mgr ctrl.Manager, systemNamespace string, projectOwnerRoleName string, projectOwnerRoleNamespace string) error { projectlog.Info("Setting up resourcemanager.miloapis.com project webhooks") - ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.Project{}). + ctrl.NewWebhookManagedBy(mgr, &v1alpha1.Project{}). WithValidator(&ProjectValidator{ Client: mgr.GetClient(), SystemNamespace: systemNamespace, @@ -46,12 +45,7 @@ type ProjectMutator struct { client client.Client } -func (m *ProjectMutator) Default(ctx context.Context, obj runtime.Object) error { - project, ok := obj.(*v1alpha1.Project) - if !ok { - return fmt.Errorf("failed to cast object to Project") - } - +func (m *ProjectMutator) Default(ctx context.Context, project *v1alpha1.Project) error { req, err := admission.RequestFromContext(ctx) if err != nil { return fmt.Errorf("failed to get request from context: %w", err) @@ -65,15 +59,15 @@ func (m *ProjectMutator) Default(ctx context.Context, obj runtime.Object) error parentAPIGroup, parentAPIGroupOk := req.UserInfo.Extra[iamv1alpha1.ParentAPIGroupExtraKey] if !parentNameOk || !parentKindOk || !parentAPIGroupOk { - errMsg := "request context does not have the required parent information" - projectlog.Error(fmt.Errorf(errMsg), errMsg) - return fmt.Errorf(errMsg) + const errMsg = "request context does not have the required parent information" + projectlog.Error(stderrors.New(errMsg), errMsg) + return stderrors.New(errMsg) } if len(parentKind) != 1 || parentKind[0] != "Organization" || parentAPIGroup[0] != v1alpha1.GroupVersion.Group { - errMsg := "request context has invalid parent information, must be Organization from the resourcemanager.miloapis.com API group" - projectlog.Error(fmt.Errorf(errMsg), errMsg) - return fmt.Errorf(errMsg) + const errMsg = "request context has invalid parent information, must be Organization from the resourcemanager.miloapis.com API group" + projectlog.Error(stderrors.New(errMsg), errMsg) + return stderrors.New(errMsg) } requestContextOrgID := parentName[0] @@ -119,12 +113,7 @@ type ProjectValidator struct { // ValidateCreate validates the Project and creates the associated PolicyBinding // to provide the authenticated user with ownership access to the project. -func (v *ProjectValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - project, ok := obj.(*v1alpha1.Project) - if !ok { - return nil, fmt.Errorf("failed to cast object to Project") - } - +func (v *ProjectValidator) ValidateCreate(ctx context.Context, project *v1alpha1.Project) (admission.Warnings, error) { projectlog.Info("Validating Project", "name", project.Name) errs := field.ErrorList{} @@ -170,17 +159,7 @@ func (v *ProjectValidator) ValidateCreate(ctx context.Context, obj runtime.Objec return nil, nil } -func (v *ProjectValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - oldProject, ok := oldObj.(*v1alpha1.Project) - if !ok { - return nil, fmt.Errorf("failed to cast old object to Project") - } - - newProject, ok := newObj.(*v1alpha1.Project) - if !ok { - return nil, fmt.Errorf("failed to cast new object to Project") - } - +func (v *ProjectValidator) ValidateUpdate(ctx context.Context, oldProject, newProject *v1alpha1.Project) (admission.Warnings, error) { projectlog.Info("Validating Project update", "name", newProject.Name) errs := field.ErrorList{} @@ -210,7 +189,7 @@ func (v *ProjectValidator) ValidateUpdate(ctx context.Context, oldObj, newObj ru return nil, nil } -func (v *ProjectValidator) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { +func (v *ProjectValidator) ValidateDelete(ctx context.Context, obj *v1alpha1.Project) (admission.Warnings, error) { return nil, nil } diff --git a/pkg/apis/identity/v1alpha1/zz_generated.openapi.go b/pkg/apis/identity/v1alpha1/zz_generated.openapi.go index 42c056cb..300bcfc2 100644 --- a/pkg/apis/identity/v1alpha1/zz_generated.openapi.go +++ b/pkg/apis/identity/v1alpha1/zz_generated.openapi.go @@ -51,7 +51,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKey(ref common.ReferenceCal "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"), }, }, "spec": { @@ -70,7 +70,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKey(ref common.ReferenceCal }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKeySpec", "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKeyStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKeySpec", "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKeyStatus", "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"}, } } @@ -98,7 +98,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeyList(ref common.Referenc "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"), }, }, "items": { @@ -119,7 +119,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeyList(ref common.Referenc }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKey", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.ServiceAccountKey", "io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"}, } } @@ -141,7 +141,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeySpec(ref common.Referenc "expirationDate": { SchemaProps: spec.SchemaProps{ Description: "ExpirationDate is the date and time when the ServiceAccountKey will expire. If not specified, the ServiceAccountKey will never expire.", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.Time"), }, }, "publicKey": { @@ -156,7 +156,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeySpec(ref common.Referenc }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + "io.k8s.apimachinery.pkg.apis.meta.v1.Time"}, } } @@ -197,7 +197,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeyStatus(ref common.Refere Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Condition"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.Condition"), }, }, }, @@ -207,7 +207,7 @@ func schema_pkg_apis_identity_v1alpha1_ServiceAccountKeyStatus(ref common.Refere }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Condition"}, + "io.k8s.apimachinery.pkg.apis.meta.v1.Condition"}, } } @@ -234,7 +234,7 @@ func schema_pkg_apis_identity_v1alpha1_Session(ref common.ReferenceCallback) com "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"), }, }, "status": { @@ -247,7 +247,7 @@ func schema_pkg_apis_identity_v1alpha1_Session(ref common.ReferenceCallback) com }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.SessionStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.SessionStatus", "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"}, } } @@ -274,7 +274,7 @@ func schema_pkg_apis_identity_v1alpha1_SessionList(ref common.ReferenceCallback) "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"), }, }, "items": { @@ -295,7 +295,7 @@ func schema_pkg_apis_identity_v1alpha1_SessionList(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.Session", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.Session", "io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"}, } } @@ -340,13 +340,13 @@ func schema_pkg_apis_identity_v1alpha1_SessionStatus(ref common.ReferenceCallbac SchemaProps: spec.SchemaProps{ Description: "CreatedAt is when the session was created.", Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.Time"), }, }, "lastUpdatedAt": { SchemaProps: spec.SchemaProps{ Description: "LastUpdatedAt is the last time the provider updated this session (e.g. Zitadel change_date).", - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.Time"), }, }, "userAgent": { @@ -361,7 +361,7 @@ func schema_pkg_apis_identity_v1alpha1_SessionStatus(ref common.ReferenceCallbac }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + "io.k8s.apimachinery.pkg.apis.meta.v1.Time"}, } } @@ -389,7 +389,7 @@ func schema_pkg_apis_identity_v1alpha1_UserIdentity(ref common.ReferenceCallback "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"), }, }, "status": { @@ -402,7 +402,7 @@ func schema_pkg_apis_identity_v1alpha1_UserIdentity(ref common.ReferenceCallback }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.UserIdentityStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.UserIdentityStatus", "io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"}, } } @@ -430,7 +430,7 @@ func schema_pkg_apis_identity_v1alpha1_UserIdentityList(ref common.ReferenceCall "metadata": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + Ref: ref("io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"), }, }, "items": { @@ -451,7 +451,7 @@ func schema_pkg_apis_identity_v1alpha1_UserIdentityList(ref common.ReferenceCall }, }, Dependencies: []string{ - "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.UserIdentity", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + "go.miloapis.com/milo/pkg/apis/identity/v1alpha1.UserIdentity", "io.k8s.apimachinery.pkg.apis.meta.v1.ListMeta"}, } } diff --git a/pkg/downstreamclient/enqueue.go b/pkg/downstreamclient/enqueue.go index 88ff2bc0..4610f28b 100644 --- a/pkg/downstreamclient/enqueue.go +++ b/pkg/downstreamclient/enqueue.go @@ -16,6 +16,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/reconcile" mchandler "sigs.k8s.io/multicluster-runtime/pkg/handler" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" ) @@ -33,7 +34,7 @@ import ( // downstream resources. The scheme is resolved per-cluster at handler // construction time; a panic is raised if the type cannot be found. func TypedEnqueueRequestsForUpstreamOwner[object client.Object](ownerType client.Object) mchandler.TypedEventHandlerFunc[object, mcreconcile.Request] { - return func(clusterName string, cl cluster.Cluster) handler.TypedEventHandler[object, mcreconcile.Request] { + return func(clusterName multicluster.ClusterName, cl cluster.Cluster) handler.TypedEventHandler[object, mcreconcile.Request] { e := &enqueueRequestForOwner[object]{ ownerType: ownerType, } @@ -124,6 +125,6 @@ func (e *enqueueRequestForOwner[object]) getOwnerReconcileRequest(obj metav1.Obj Namespace: labels[UpstreamOwnerNamespaceLabel], }, }, - ClusterName: clusterName, + ClusterName: multicluster.ClusterName(clusterName), }] = struct{}{} } diff --git a/pkg/downstreamclient/mappednamespace.go b/pkg/downstreamclient/mappednamespace.go index 579a2c41..b018e393 100644 --- a/pkg/downstreamclient/mappednamespace.go +++ b/pkg/downstreamclient/mappednamespace.go @@ -287,6 +287,10 @@ func (c *mappedNamespaceClient) Update(ctx context.Context, obj client.Object, o return c.client.Update(ctx, obj, opts...) } +func (c *mappedNamespaceClient) Apply(ctx context.Context, obj runtime.ApplyConfiguration, opts ...client.ApplyOption) error { + return c.client.Apply(ctx, obj, opts...) +} + func (c *mappedNamespaceClient) GroupVersionKindFor(obj runtime.Object) (schema.GroupVersionKind, error) { return c.client.GroupVersionKindFor(obj) } diff --git a/pkg/multicluster-runtime/milo/provider.go b/pkg/multicluster-runtime/milo/provider.go index e71bbd2a..ef7d802b 100644 --- a/pkg/multicluster-runtime/milo/provider.go +++ b/pkg/multicluster-runtime/milo/provider.go @@ -26,7 +26,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/reconcile" - mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) @@ -122,29 +121,29 @@ type Provider struct { client client.Client lock sync.Mutex - mcMgr mcmanager.Manager + mcMgr multicluster.Aware projects map[string]cluster.Cluster cancelFns map[string]context.CancelFunc indexers []index } // Get returns the cluster with the given name, if it is known. -func (p *Provider) Get(_ context.Context, clusterName string) (cluster.Cluster, error) { +func (p *Provider) Get(_ context.Context, clusterName multicluster.ClusterName) (cluster.Cluster, error) { p.lock.Lock() defer p.lock.Unlock() - if cl, ok := p.projects[clusterName]; ok { + if cl, ok := p.projects[clusterName.String()]; ok { return cl, nil } return nil, fmt.Errorf("cluster %s not found", clusterName) } -// Run starts the provider and blocks. -func (p *Provider) Run(ctx context.Context, mgr mcmanager.Manager) error { +// Start implements multicluster.ProviderRunnable and blocks until ctx is cancelled. +func (p *Provider) Start(ctx context.Context, aware multicluster.Aware) error { p.log.Info("Starting Datum cluster provider") p.lock.Lock() - p.mcMgr = mgr + p.mcMgr = aware p.lock.Unlock() <-ctx.Done() @@ -288,7 +287,7 @@ func (p *Provider) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result log.Info("Engaging cluster with multicluster manager", "key", key) // engage manager. - if err := p.mcMgr.Engage(clusterCtx, key, cl); err != nil { + if err := p.mcMgr.Engage(clusterCtx, multicluster.ClusterName(key), cl); err != nil { log.Error(err, "Failed to engage cluster with multicluster manager", "key", key) delete(p.projects, key) delete(p.cancelFns, key) diff --git a/pkg/multicluster-runtime/milo/provider_test.go b/pkg/multicluster-runtime/milo/provider_test.go index 7f1283f3..faca4430 100644 --- a/pkg/multicluster-runtime/milo/provider_test.go +++ b/pkg/multicluster-runtime/milo/provider_test.go @@ -18,13 +18,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/cluster" mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) type testMultiClusterManager struct { mcmanager.Manager } -func (m *testMultiClusterManager) Engage(context.Context, string, cluster.Cluster) error { +func (m *testMultiClusterManager) Engage(context.Context, multicluster.ClusterName, cluster.Cluster) error { return nil } diff --git a/pkg/multicluster-runtime/source/source.go b/pkg/multicluster-runtime/source/source.go index 6f2de32e..90f304b5 100644 --- a/pkg/multicluster-runtime/source/source.go +++ b/pkg/multicluster-runtime/source/source.go @@ -6,6 +6,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/source" mchandler "sigs.k8s.io/multicluster-runtime/pkg/handler" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" mcsource "sigs.k8s.io/multicluster-runtime/pkg/source" ) @@ -22,7 +23,8 @@ func NewClusterSource[object client.Object, request mcreconcile.ClusterAware[req predicates..., ) - return src.ForCluster("", cl) + typedSrc, _, err := src.ForCluster(multicluster.ClusterName(""), cl) + return typedSrc, err } func MustNewClusterSource[object client.Object, request mcreconcile.ClusterAware[request]]( diff --git a/pkg/webhook/cluster_aware_server.go b/pkg/webhook/cluster_aware_server.go index 3b7c3c11..f331dd3d 100644 --- a/pkg/webhook/cluster_aware_server.go +++ b/pkg/webhook/cluster_aware_server.go @@ -11,6 +11,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" mccontext "sigs.k8s.io/multicluster-runtime/pkg/context" + "sigs.k8s.io/multicluster-runtime/pkg/multicluster" ) // ClusterAwareServer wraps a webhook.Server to automatically inject the cluster @@ -49,7 +50,7 @@ func (s *ClusterAwareServer) Register(path string, hook http.Handler) { h.Handler = admission.HandlerFunc(func(ctx context.Context, req admission.Request) admission.Response { clusterName := clusterNameFromExtra(req.UserInfo.Extra) if clusterName != "" { - ctx = mccontext.WithCluster(ctx, clusterName) + ctx = mccontext.WithCluster(ctx, multicluster.ClusterName(clusterName)) } return orig.Handle(ctx, req) })