From b8f9308b4d88efb944009e3eb2b1ed59548694d9 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 17:59:11 -0500 Subject: [PATCH 1/8] fix: update Milo provider to be compatible with multicluster-runtime v0.23.3 multicluster-runtime v0.23.3 introduced a distinct ClusterName type (previously a plain string). Update Provider.Get, the Engage call, and the ForCluster call in the source wrapper to use the new type, so consumers can upgrade to v0.23.3 without forking the provider locally. Co-Authored-By: Claude Sonnet 4.6 --- go.mod | 115 ++++++++-------- go.sum | 127 ++++++++++++++++++ pkg/downstreamclient/enqueue.go | 5 +- pkg/downstreamclient/mappednamespace.go | 4 + pkg/multicluster-runtime/milo/provider.go | 6 +- .../milo/provider_test.go | 3 +- pkg/multicluster-runtime/source/source.go | 4 +- pkg/webhook/cluster_aware_server.go | 3 +- 8 files changed, 204 insertions(+), 63 deletions(-) diff --git a/go.mod b/go.mod index d9ab77e2..ea5c902f 100644 --- a/go.mod +++ b/go.mod @@ -1,39 +1,39 @@ 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/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.32.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/kube-openapi v0.0.0-20250910181357-589584f1c912 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/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 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 @@ -41,16 +41,16 @@ require ( 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/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,17 +59,17 @@ 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/klauspost/compress v1.18.0 // 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 @@ -77,7 +77,7 @@ require ( 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 @@ -85,41 +85,44 @@ require ( github.com/pkg/errors v0.9.1 // 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.etcd.io/etcd/pkg/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/go-jose/go-jose.v2 v2.6.3 // 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 @@ -130,12 +133,14 @@ require ( 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/kms v0.35.0 // 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/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/v4 v4.7.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..ad7d3a65 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ 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= 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/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -22,6 +24,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF 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= @@ -39,6 +43,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp 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= @@ -47,8 +53,12 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 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/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.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +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= @@ -75,8 +85,12 @@ 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/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.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +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.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -85,10 +99,13 @@ 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/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/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 v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= @@ -101,6 +118,7 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 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/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= @@ -109,6 +127,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI 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= @@ -130,14 +150,18 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w 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/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= 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= @@ -151,16 +175,25 @@ github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8 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_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.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +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.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +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.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +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/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= @@ -168,9 +201,14 @@ 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/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.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/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= @@ -193,53 +231,86 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de 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/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= 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/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.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= +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/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/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.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= +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/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/etcd/server/v3 v3.6.5 h1:4RbUb1Bd4y1WkBHmuF+cZII83JNQMuNXzyjwigQ06y0= 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/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.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +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.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 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.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +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.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +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.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 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.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= 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/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.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +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= @@ -250,25 +321,37 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL 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/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 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/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/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +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= @@ -277,6 +360,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY 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= @@ -289,15 +374,25 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1: 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/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.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +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.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +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= @@ -309,20 +404,32 @@ 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/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= +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.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= +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.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +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.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-base v0.35.0 h1:+yBrOhzri2S1BVqyVSvcM3PtPyx5GUxCK2tinZz1G94= +k8s.io/component-base v0.35.0/go.mod h1:85SCX4UCa6SCFt6p3IKAPej7jSnF3L8EbfSyMZayJR0= 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= @@ -341,12 +448,16 @@ 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/kms v0.35.0 h1:/x87FED2kDSo66csKtcYCEHsxF/DBlNl7LfJ1fVQs1o= +k8s.io/kms v0.35.0/go.mod h1:VT+4ekZAdrZDMgShK37vvlyHUVhwI9t/9tvh0AyCWmQ= 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/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/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= @@ -357,17 +468,33 @@ k8s.io/pod-security-admission v0.32.0 h1:I+Og0uZIiMpIgTgPrTbW4jlwRI5RWazi8y+jrx1 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= +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.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +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.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/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-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +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.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/multicluster-runtime v0.23.3 h1:vrzlXRzHTDsjspUAfoW2rCtr0agoI4q20p9x4Fz4png= +sigs.k8s.io/multicluster-runtime v0.23.3/go.mod h1:r/UA4GHgFoXCcR4tcvlZz7SiLx3l1kJKDuBAhILNIHs= 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/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/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= +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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +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/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..a901c9bc 100644 --- a/pkg/multicluster-runtime/milo/provider.go +++ b/pkg/multicluster-runtime/milo/provider.go @@ -129,10 +129,10 @@ type Provider struct { } // 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 } @@ -288,7 +288,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) }) From 4bd8fd5a18ec8183d8c77653fd3fb17fbd271218 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 18:47:21 -0500 Subject: [PATCH 2/8] build: upgrade builder image to Go 1.25 go.mod now requires go 1.25.0 after the multicluster-runtime upgrade cascaded to k8s v0.35.x dependencies. Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From b8f623f9e1f64214944b5caea8071883d81e2921 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 19:31:37 -0500 Subject: [PATCH 3/8] fix: update dependencies for multicluster-runtime v0.23.3 compatibility - Update webhook validators/defaulters to use generic Validator[T]/Defaulter[T] interfaces with concrete pointer types instead of runtime.Object - Fix featuregate/version symbol moves: DefaultComponentGlobalsRegistry and DefaultKubeComponent now in compatibility packages; DefaultBuildEffectiveVersion in apiserver/pkg/util/compatibility - Fix WithImpersonation moved to filters/impersonation subpackage - Fix Options.Complete() signature (removed NamedFlagSets param) - Fix KubeControllerManagerOptions.Config() now requires context.Context as first arg - Update service account JWT imports from square/go-jose to go-jose/go-jose Co-Authored-By: Claude Sonnet 4.6 --- cmd/milo/apiserver/config.go | 9 +- cmd/milo/apiserver/server.go | 12 +- cmd/milo/apiserver/serviceaccounts.go | 4 +- .../controller-manager/controllermanager.go | 15 +- go.mod | 48 ++-- go.sum | 247 +++++------------- internal/apiserver/storage/project/mux.go | 66 +++-- .../platformaccessapproval_webhook.go | 17 +- .../platformaccessarejection_webhook.go | 17 +- .../v1alpha1/platforminvitation_webhook.go | 21 +- .../webhooks/iam/v1alpha1/user_webhook.go | 13 +- .../iam/v1alpha1/userdeactivation_webhook.go | 16 +- .../iam/v1alpha1/userinvitation_webhook.go | 21 +- .../identity/v1alpha1/useridentity_webhook.go | 11 +- .../notes/v1alpha1/clusternote_webhook.go | 31 +-- .../webhooks/notes/v1alpha1/note_webhook.go | 31 +-- .../notification/v1alpha1/contact_webhook.go | 24 +- .../v1alpha1/contactgroup_webhook.go | 15 +- .../contactgroupmembership_webhook.go | 15 +- .../contactgroupmembershipremoval_webhook.go | 19 +- .../notification/v1alpha1/email_webhook.go | 18 +- .../v1alpha1/emailtemplate_webhook.go | 11 +- .../v1alpha1/organization_webhook.go | 13 +- .../organizationmembership_webhook.go | 14 +- .../v1alpha1/project_webhook.go | 32 +-- 25 files changed, 245 insertions(+), 495 deletions(-) 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..c94ec09e 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.ComponentGlobalsOrRegister( - featuregate.DefaultKubeComponent, utilversion.DefaultKubeEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) + s.GenericServerRunOptions.ComponentGlobalsRegistry = apiservercompat.DefaultComponentGlobalsRegistry + apiservercompat.DefaultComponentGlobalsRegistry.ComponentGlobalsOrRegister( + 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..88ce37c2 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) }, @@ -837,11 +838,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 ea5c902f..8a050358 100644 --- a/go.mod +++ b/go.mod @@ -14,18 +14,18 @@ require ( 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 + 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.32.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-aggregator v0.35.0 k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 - k8s.io/kubernetes v1.32.0 + 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 @@ -34,16 +34,17 @@ require ( require ( 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.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.2 // indirect @@ -61,7 +62,6 @@ require ( github.com/google/btree v1.1.3 // 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.4-0.20250319132907-e064f32e3674 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -69,20 +69,17 @@ require ( 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.18.0 // 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.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.23.2 // indirect @@ -95,7 +92,6 @@ require ( 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.etcd.io/etcd/pkg/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.34.0 // indirect @@ -116,31 +112,33 @@ require ( 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-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/go-jose/go-jose.v2 v2.6.3 // 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/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.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 + 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/v4 v4.7.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 ad7d3a65..ba4eb680 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +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= @@ -12,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= @@ -22,8 +22,6 @@ 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= @@ -33,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= @@ -41,8 +41,6 @@ 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= @@ -51,12 +49,8 @@ github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjT 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/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.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= 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= @@ -77,56 +71,45 @@ 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/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.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 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/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 v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +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= @@ -141,14 +124,11 @@ 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= @@ -156,16 +136,14 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq 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/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= -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/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= @@ -173,39 +151,25 @@ 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_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.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= 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.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= 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.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= 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/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.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/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= @@ -214,6 +178,8 @@ github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8w 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= @@ -229,69 +195,40 @@ 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/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= -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/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.4 h1:9HBYrjppeOfFjBjaMTRxT3R7xT0GLK8EJMVC4xg6ok0= -go.etcd.io/etcd/client/pkg/v3 v3.6.4/go.mod h1:sbdzr2cl3HzVmxNw//PH7aLGVtY4QySjQFuaCgcRFAI= 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/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/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.4 h1:fy8bmXIec1Q35/jRZ0KOes8vuFxbvdN0aAFqmEfJZWA= -go.etcd.io/etcd/pkg/v3 v3.6.4/go.mod h1:kKcYWP8gHuBRcteyv6MXWSN0+bVMnfgqiHueIZnKMtE= 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/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/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/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.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= 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.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 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.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= 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.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= 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.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 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.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= -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/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.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 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= @@ -307,49 +244,37 @@ 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/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -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/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/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= 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= @@ -358,8 +283,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm 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= @@ -368,27 +291,17 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T 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/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.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= 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.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 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= @@ -397,104 +310,80 @@ 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/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= 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.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= -k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= 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.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= 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.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/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.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/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/kms v0.35.0 h1:/x87FED2kDSo66csKtcYCEHsxF/DBlNl7LfJ1fVQs1o= k8s.io/kms v0.35.0/go.mod h1:VT+4ekZAdrZDMgShK37vvlyHUVhwI9t/9tvh0AyCWmQ= -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/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/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= +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.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= 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.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/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-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= 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.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/multicluster-runtime v0.23.3 h1:vrzlXRzHTDsjspUAfoW2rCtr0agoI4q20p9x4Fz4png= sigs.k8s.io/multicluster-runtime v0.23.3/go.mod h1:r/UA4GHgFoXCcR4tcvlZz7SiLx3l1kJKDuBAhILNIHs= -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/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/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= 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.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= 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/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..689c8944 100644 --- a/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go +++ b/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go @@ -8,7 +8,6 @@ import ( "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 +22,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 +44,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) @@ -119,12 +112,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 +158,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 +188,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 } From b4813d2c9f29e12daf5ef4d169115926aa23a04a Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 19:48:44 -0500 Subject: [PATCH 4/8] fix: update test mocks and webhook for multicluster-runtime v0.23.3 - Add GetEventRecorder method to testCluster mocks in quota controller tests (cluster.Cluster interface now embeds recorder.Provider which requires it) - Update Engage/GetCluster/GetManager signatures to use multicluster.ClusterName instead of string - Fix non-constant format strings in project_webhook.go by using const strings and errors.New instead of fmt.Errorf Co-Authored-By: Claude Sonnet 4.6 --- .../quota/controllers/lifecycle/cleanup_test.go | 10 +++++++--- .../quota/controllers/policy/reconciler_test.go | 10 +++++++--- .../resourcemanager/v1alpha1/project_webhook.go | 13 +++++++------ 3 files changed, 21 insertions(+), 12 deletions(-) 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/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/resourcemanager/v1alpha1/project_webhook.go b/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go index 689c8944..a5460903 100644 --- a/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go +++ b/internal/webhooks/resourcemanager/v1alpha1/project_webhook.go @@ -2,6 +2,7 @@ package v1alpha1 import ( "context" + stderrors "errors" "fmt" iamv1alpha1 "go.miloapis.com/milo/pkg/apis/iam/v1alpha1" @@ -58,15 +59,15 @@ func (m *ProjectMutator) Default(ctx context.Context, project *v1alpha1.Project) 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] From bcbe3a84fff6d158fe4c999d7ed5d65ec2b02f87 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 20:07:43 -0500 Subject: [PATCH 5/8] fix: use new registry instance in apiserver instead of global registry The original apiserver code used featuregate.NewComponentGlobalsRegistry() to create a fresh per-instance registry, not the global default registry. Using the global registry caused the API server pod to fail at startup. Co-Authored-By: Claude Sonnet 4.6 --- cmd/milo/apiserver/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/milo/apiserver/server.go b/cmd/milo/apiserver/server.go index c94ec09e..c8e8f01c 100644 --- a/cmd/milo/apiserver/server.go +++ b/cmd/milo/apiserver/server.go @@ -132,8 +132,8 @@ func NewCommand() *cobra.Command { }, } - s.GenericServerRunOptions.ComponentGlobalsRegistry = apiservercompat.DefaultComponentGlobalsRegistry - apiservercompat.DefaultComponentGlobalsRegistry.ComponentGlobalsOrRegister( + s.GenericServerRunOptions.ComponentGlobalsRegistry = basecompatibility.NewComponentGlobalsRegistry() + s.GenericServerRunOptions.ComponentGlobalsRegistry.ComponentGlobalsOrRegister( basecompatibility.DefaultKubeComponent, apiservercompat.DefaultBuildEffectiveVersion(), utilfeature.DefaultMutableFeatureGate) s.GenericServerRunOptions.AddUniversalFlags(namedFlagSets.FlagSet("generic")) s.Etcd.AddFlags(namedFlagSets.FlagSet("etcd")) From f69bba9da23cf20eddb2c6e6abda42bd57a45d38 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 20:39:24 -0500 Subject: [PATCH 6/8] fix: update identity OpenAPI model names for k8s 1.35.0 compatibility k8s 1.35.0 changed OpenAPI model name keys from the Go import path format ("k8s.io/apimachinery/pkg/apis/meta/v1.Time") to the io.k8s reverse-domain format ("io.k8s.apimachinery.pkg.apis.meta.v1.Time") via OpenAPIModelName() methods. Update the identity API's generated OpenAPI definitions to reference metav1 types using the new key format so the API server can start successfully. Co-Authored-By: Claude Sonnet 4.6 --- .../identity/v1alpha1/zz_generated.openapi.go | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) 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"}, } } From 7a304ec52cc63da302c2e97ecbd4ffeddc401c44 Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Fri, 22 May 2026 21:07:49 -0500 Subject: [PATCH 7/8] fix: update Milo provider to implement ProviderRunnable.Start for multicluster-runtime v0.23.3 multicluster-runtime v0.23.3 changed the ProviderRunnable interface from Run(context.Context, Manager) to Start(context.Context, Aware). The manager auto-starts any provider implementing ProviderRunnable, passing an Aware (not a full Manager) for cluster engagement. The old Run method was never called by v0.23.3's manager, leaving p.mcMgr nil and causing every project reconcile to requeue with "Multicluster manager not yet started". No clusters were ever engaged, so ResourceGrants were never created in project control planes. Co-Authored-By: Claude Sonnet 4.6 --- cmd/milo/controller-manager/controllermanager.go | 11 ++--------- pkg/multicluster-runtime/milo/provider.go | 9 ++++----- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/cmd/milo/controller-manager/controllermanager.go b/cmd/milo/controller-manager/controllermanager.go index 88ce37c2..099f1cc6 100644 --- a/cmd/milo/controller-manager/controllermanager.go +++ b/cmd/milo/controller-manager/controllermanager.go @@ -676,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 { diff --git a/pkg/multicluster-runtime/milo/provider.go b/pkg/multicluster-runtime/milo/provider.go index a901c9bc..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,7 +121,7 @@ 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 @@ -139,12 +138,12 @@ func (p *Provider) Get(_ context.Context, clusterName multicluster.ClusterName) 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() From a37f13427f7b23c7e64b533c08e7a95b8369d40c Mon Sep 17 00:00:00 2001 From: Scot Wells Date: Sat, 23 May 2026 10:45:58 -0500 Subject: [PATCH 8/8] fix: disable provider cluster engagement for core-cluster-only quota controllers ResourceRegistration, GrantCreationPolicy, ClaimCreationPolicy, and GrantCreation are local-cluster-only resources not exposed at project control plane paths. Setting WithEngageWithProviderClusters(true) caused Engage to fail with "no matches for kind ResourceRegistration" when the Milo provider attempted to watch these resources in project clusters. This aligns the code with the design intent documented in setup.go: - Core cluster only: ResourceRegistration, ClaimCreationPolicy, GrantCreationPolicy, GrantCreation - All clusters: ResourceGrant, ResourceClaim, AllowanceBucket, Ownership, Cleanup Co-Authored-By: Claude Sonnet 4.6 --- internal/quota/controllers/core/registration.go | 2 +- internal/quota/controllers/policy/claim_creation.go | 4 ++-- internal/quota/controllers/policy/grant_creation.go | 4 ++-- internal/quota/controllers/policy/grant_creation_executor.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) 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/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")