This is an automated email from the ASF dual-hosted git repository.

ccondit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-k8shim.git


The following commit(s) were added to refs/heads/master by this push:
     new 0cf3c810 [YUNIKORN-2996] Build against Kubernetes 1.32.2 (#953)
0cf3c810 is described below

commit 0cf3c8104b6e50998e0fe63c3d256333accc0168
Author: Craig Condit <[email protected]>
AuthorDate: Tue Mar 4 14:14:43 2025 -0600

    [YUNIKORN-2996] Build against Kubernetes 1.32.2 (#953)
    
    Closes: #953
---
 .github/workflows/pre-commit.yml                  |   8 +-
 Makefile                                          |   6 +-
 go.mod                                            | 173 ++++++------
 go.sum                                            | 309 ++++++++--------------
 pkg/admission/webhook_manager_test.go             | 280 +++++---------------
 pkg/cache/context.go                              |  13 +
 pkg/cache/external/scheduler_cache.go             |   2 +-
 pkg/cache/task.go                                 |  16 +-
 pkg/client/apifactory.go                          |   9 +-
 pkg/client/apifactory_mock.go                     |   2 +-
 pkg/client/apifactory_test.go                     |   3 +-
 pkg/client/clients.go                             |  55 ++--
 pkg/client/clients_test.go                        |  19 +-
 pkg/common/resource_test.go                       |   2 +-
 pkg/common/test/volumeattachment_informer_mock.go |  45 ++++
 pkg/common/test/volumeattachment_lister_mock.go   |  57 ++++
 pkg/plugin/predicates/predicate_manager.go        |  32 ++-
 pkg/plugin/predicates/predicate_manager_test.go   |   4 +-
 pkg/plugin/scheduler_plugin.go                    |   6 +-
 pkg/plugin/support/framework_handle.go            |  11 +
 scripts/run-e2e-tests.sh                          |  10 +-
 21 files changed, 478 insertions(+), 584 deletions(-)

diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
index 969ade87..0dbbbb1c 100644
--- a/.github/workflows/pre-commit.yml
+++ b/.github/workflows/pre-commit.yml
@@ -49,10 +49,10 @@ jobs:
       matrix:
         k8s:
           [
-            v1.32.0,
-            v1.31.4,
-            v1.30.6,
-            v1.29.10,
+            v1.32.2,
+            v1.31.6,
+            v1.30.10,
+            v1.29.14,
             v1.28.15,
             v1.27.16,
             v1.26.15,
diff --git a/Makefile b/Makefile
index b3577bc4..f73963cb 100644
--- a/Makefile
+++ b/Makefile
@@ -71,7 +71,7 @@ export PATH := $(BASE_DIR)/$(TOOLS_DIR):$(GO_EXE_PATH):$(PATH)
 
 # Default values for dev cluster
 ifeq ($(K8S_VERSION),)
-K8S_VERSION := v1.32.0
+K8S_VERSION := v1.32.2
 endif
 ifeq ($(CLUSTER_NAME),)
 CLUSTER_NAME := yk8s
@@ -177,7 +177,7 @@ KUBECTL_BIN=$(KUBECTL_PATH)/kubectl
 export PATH := $(BASE_DIR)/$(KUBECTL_PATH):$(PATH)
 
 # kind
-KIND_VERSION=v0.25.0
+KIND_VERSION=v0.27.0
 KIND_PATH=$(TOOLS_DIR)/kind-$(KIND_VERSION)
 KIND_BIN=$(KIND_PATH)/kind
 export PATH := $(BASE_DIR)/$(KIND_PATH):$(PATH)
@@ -206,7 +206,7 @@ GO_LICENSES_BIN=$(GO_LICENSES_PATH)/go-licenses
 export PATH := $(BASE_DIR)/$(GO_LICENSES_PATH):$(PATH)
 
 # ginkgo
-GINKGO_VERSION=v2.19.0
+GINKGO_VERSION=v2.21.0
 GINKGO_PATH=$(TOOLS_DIR)/ginkgo-$(GINKGO_VERSION)
 GINKGO_BIN=$(GINKGO_PATH)/ginkgo
 export PATH := $(BASE_DIR)/$(GINKGO_PATH):$(PATH)
diff --git a/go.mod b/go.mod
index dea7adf5..03637e45 100644
--- a/go.mod
+++ b/go.mod
@@ -18,36 +18,38 @@
 
 module github.com/apache/yunikorn-k8shim
 
-go 1.22.0
+go 1.23.0
 
-toolchain go1.22.5
+toolchain go1.23.6
 
 require (
-       github.com/apache/yunikorn-core v0.0.0-20241114184223-ac32595a9712
+       github.com/apache/yunikorn-core v0.0.0-20250303172658-9eee423b3df0
        github.com/apache/yunikorn-scheduler-interface 
v0.0.0-20241016105739-f0e241aa0146
        github.com/google/go-cmp v0.6.0
        github.com/google/uuid v1.6.0
        github.com/looplab/fsm v1.0.1
-       github.com/onsi/ginkgo/v2 v2.19.0
-       github.com/onsi/gomega v1.33.1
+       github.com/onsi/ginkgo/v2 v2.21.0
+       github.com/onsi/gomega v1.35.1
        github.com/prometheus/client_golang v1.19.1
        github.com/sasha-s/go-deadlock v0.3.5
-       go.uber.org/zap v1.26.0
+       go.uber.org/zap v1.27.0
        gopkg.in/yaml.v3 v3.0.1
        gotest.tools/v3 v3.5.1
-       k8s.io/api v0.31.0
-       k8s.io/apimachinery v0.31.0
-       k8s.io/cli-runtime v0.31.0
-       k8s.io/client-go v0.31.0
-       k8s.io/component-base v0.31.0
+       k8s.io/api v0.32.2
+       k8s.io/apimachinery v0.32.2
+       k8s.io/cli-runtime v0.32.2
+       k8s.io/client-go v0.32.2
+       k8s.io/component-base v0.32.2
+       k8s.io/component-helpers v0.32.2
        k8s.io/klog/v2 v2.130.1
-       k8s.io/kube-scheduler v0.31.0
-       k8s.io/kubectl v0.31.0
-       k8s.io/kubernetes v1.31.0
+       k8s.io/kube-scheduler v0.32.2
+       k8s.io/kubectl v0.32.2
+       k8s.io/kubernetes v1.32.2
 )
 
 require (
-       github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // 
indirect
+       cel.dev/expr v0.18.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
        github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // 
indirect
@@ -58,7 +60,7 @@ require (
        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.5.0 // indirect
+       github.com/distribution/reference v0.6.0 // indirect
        github.com/emicklei/go-restful/v3 v3.11.0 // indirect
        github.com/felixge/httpsnoop v1.0.4 // indirect
        github.com/fsnotify/fsnotify v1.7.0 // indirect
@@ -66,33 +68,29 @@ require (
        github.com/go-errors/errors v1.4.2 // indirect
        github.com/go-logr/logr v1.4.2 // indirect
        github.com/go-logr/stdr v1.2.2 // indirect
-       github.com/go-openapi/jsonpointer v0.19.6 // indirect
+       github.com/go-openapi/jsonpointer v0.21.0 // indirect
        github.com/go-openapi/jsonreference v0.20.2 // indirect
-       github.com/go-openapi/swag v0.22.4 // indirect
+       github.com/go-openapi/swag v0.23.0 // indirect
        github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
-       github.com/godbus/dbus/v5 v5.1.0 // indirect
        github.com/gogo/protobuf v1.3.2 // indirect
-       github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // 
indirect
        github.com/golang/protobuf v1.5.4 // indirect
        github.com/google/btree v1.1.2 // indirect
-       github.com/google/cel-go v0.20.1 // indirect
+       github.com/google/cel-go v0.22.0 // indirect
        github.com/google/gnostic-models v0.6.8 // indirect
        github.com/google/gofuzz v1.2.0 // indirect
-       github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect
+       github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect
        github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
        github.com/gorilla/websocket v1.5.0 // indirect
-       github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc // 
indirect
+       github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // 
indirect
        github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
        github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
-       github.com/imdario/mergo v0.3.7 // 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/julienschmidt/httprouter v1.3.0 // indirect
        github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // 
indirect
        github.com/mailru/easyjson v0.7.7 // indirect
-       github.com/moby/spdystream v0.4.0 // indirect
-       github.com/moby/sys/mountinfo v0.7.1 // indirect
+       github.com/moby/spdystream v0.5.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
@@ -100,24 +98,20 @@ require (
        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/runc v1.1.14 // indirect
-       github.com/opencontainers/runtime-spec 
v1.0.3-0.20220909204839-494a5a6aca78 // indirect
-       github.com/opencontainers/selinux v1.11.0 // indirect
        github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
        github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // 
indirect
        github.com/pkg/errors v0.9.1 // indirect
        github.com/prometheus/client_model v0.6.1 // indirect
        github.com/prometheus/common v0.55.0 // indirect
        github.com/prometheus/procfs v0.15.1 // indirect
-       github.com/sirupsen/logrus v1.9.3 // indirect
        github.com/spf13/cobra v1.8.1 // indirect
        github.com/spf13/pflag v1.0.5 // indirect
-       github.com/stoewer/go-strcase v1.2.0 // indirect
+       github.com/stoewer/go-strcase v1.3.0 // indirect
        github.com/x448/float16 v0.8.4 // indirect
        github.com/xlab/treeprint v1.2.0 // indirect
-       go.etcd.io/etcd/api/v3 v3.5.14 // indirect
-       go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect
-       go.etcd.io/etcd/client/v3 v3.5.14 // indirect
+       go.etcd.io/etcd/api/v3 v3.5.16 // indirect
+       go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect
+       go.etcd.io/etcd/client/v3 v3.5.16 // indirect
        
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.53.0 // indirect
        go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 
// indirect
        go.opentelemetry.io/otel v1.28.0 // indirect
@@ -127,43 +121,39 @@ require (
        go.opentelemetry.io/otel/sdk v1.28.0 // indirect
        go.opentelemetry.io/otel/trace v1.28.0 // indirect
        go.opentelemetry.io/proto/otlp v1.3.1 // indirect
-       go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
        go.uber.org/multierr v1.11.0 // indirect
        golang.org/x/crypto v0.31.0 // indirect
-       golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 // indirect
+       golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
        golang.org/x/net v0.33.0 // indirect
-       golang.org/x/oauth2 v0.21.0 // indirect
+       golang.org/x/oauth2 v0.23.0 // indirect
        golang.org/x/sync v0.8.0 // indirect
        golang.org/x/sys v0.28.0 // indirect
        golang.org/x/term v0.27.0 // indirect
        golang.org/x/text v0.21.0 // indirect
-       golang.org/x/time v0.5.0 // indirect
-       golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20240528184218-531527333157 // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20240701130421-f6361c86f094 // indirect
+       golang.org/x/time v0.7.0 // indirect
+       golang.org/x/tools v0.26.0 // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20240826202546-f6391c0de4c7 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20240826202546-f6391c0de4c7 // indirect
        google.golang.org/grpc v1.65.0 // indirect
-       google.golang.org/protobuf v1.34.2 // indirect
+       google.golang.org/protobuf v1.35.1 // indirect
        gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
        gopkg.in/inf.v0 v0.9.1 // indirect
        gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
-       gopkg.in/yaml.v2 v2.4.0 // indirect
        k8s.io/apiextensions-apiserver v0.0.0 // indirect
-       k8s.io/apiserver v0.31.0 // indirect
-       k8s.io/cloud-provider v0.31.0 // indirect
-       k8s.io/component-helpers v0.31.0 // indirect
-       k8s.io/controller-manager v0.31.0 // indirect
-       k8s.io/csi-translation-lib v0.31.0 // indirect
-       k8s.io/dynamic-resource-allocation v0.31.0 // indirect
-       k8s.io/kms v0.31.0 // indirect
-       k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
-       k8s.io/kubelet v0.31.0 // indirect
-       k8s.io/mount-utils v0.31.0 // indirect
-       k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
-       sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // 
indirect
-       sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
-       sigs.k8s.io/kustomize/api v0.17.2 // indirect
-       sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect
-       sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
+       k8s.io/apiserver v0.32.2 // indirect
+       k8s.io/cloud-provider v0.32.2 // indirect
+       k8s.io/controller-manager v0.32.2 // indirect
+       k8s.io/csi-translation-lib v0.32.2 // indirect
+       k8s.io/dynamic-resource-allocation v0.32.2 // indirect
+       k8s.io/kms v0.32.2 // indirect
+       k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
+       k8s.io/kubelet v0.32.2 // indirect
+       k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // 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/kustomize/api v0.18.0 // indirect
+       sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
+       sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
        sigs.k8s.io/yaml v1.4.0 // indirect
 )
 
@@ -171,37 +161,38 @@ replace (
        golang.org/x/crypto => golang.org/x/crypto v0.31.0
        golang.org/x/lint => golang.org/x/lint 
v0.0.0-20210508222113-6edffad5e616
        golang.org/x/net => golang.org/x/net v0.33.0
-       golang.org/x/sys => golang.org/x/sys v0.24.0
+       golang.org/x/sys => golang.org/x/sys v0.28.0
        golang.org/x/text => golang.org/x/text v0.17.0
-       golang.org/x/tools => golang.org/x/tools v0.24.0
-       k8s.io/api => k8s.io/api v0.31.0
-       k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.31.0
-       k8s.io/apimachinery => k8s.io/apimachinery v0.31.0
-       k8s.io/apiserver => k8s.io/apiserver v0.31.0
-       k8s.io/cli-runtime => k8s.io/cli-runtime v0.31.0
-       k8s.io/client-go => k8s.io/client-go v0.31.0
-       k8s.io/cloud-provider => k8s.io/cloud-provider v0.31.0
-       k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.31.0
-       k8s.io/code-generator => k8s.io/code-generator v0.31.0
-       k8s.io/component-base => k8s.io/component-base v0.31.0
-       k8s.io/component-helpers => k8s.io/component-helpers v0.31.0
-       k8s.io/controller-manager => k8s.io/controller-manager v0.31.0
-       k8s.io/cri-api => k8s.io/cri-api v0.31.0
-       k8s.io/cri-client => k8s.io/cri-client v0.31.0
-       k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.31.0
-       k8s.io/dynamic-resource-allocation => 
k8s.io/dynamic-resource-allocation v0.31.0
-       k8s.io/endpointslice => k8s.io/endpointslice v0.31.0
-       k8s.io/klog/v2 => k8s.io/klog/v2 v2.110.1
-       k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.31.0
-       k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.31.0
-       k8s.io/kube-proxy => k8s.io/kube-proxy v0.31.0
-       k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.31.0
-       k8s.io/kubectl => k8s.io/kubectl v0.31.0
-       k8s.io/kubelet => k8s.io/kubelet v0.31.0
-       k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.31.0
-       k8s.io/metrics => k8s.io/metrics v0.31.0
-       k8s.io/mount-utils => k8s.io/mount-utils v0.31.0
-       k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.31.0
-       k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.31.0
-       k8s.io/utils => k8s.io/utils v0.0.0-20230726121419-3b25d923346b
+       golang.org/x/tools => golang.org/x/tools v0.26.0
+       k8s.io/api => k8s.io/api v0.32.2
+       k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.32.2
+       k8s.io/apimachinery => k8s.io/apimachinery v0.32.2
+       k8s.io/apiserver => k8s.io/apiserver v0.32.2
+       k8s.io/cli-runtime => k8s.io/cli-runtime v0.32.2
+       k8s.io/client-go => k8s.io/client-go v0.32.2
+       k8s.io/cloud-provider => k8s.io/cloud-provider v0.32.2
+       k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.32.2
+       k8s.io/code-generator => k8s.io/code-generator v0.32.2
+       k8s.io/component-base => k8s.io/component-base v0.32.2
+       k8s.io/component-helpers => k8s.io/component-helpers v0.32.2
+       k8s.io/controller-manager => k8s.io/controller-manager v0.32.2
+       k8s.io/cri-api => k8s.io/cri-api v0.32.2
+       k8s.io/cri-client => k8s.io/cri-client v0.32.2
+       k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.32.2
+       k8s.io/dynamic-resource-allocation => 
k8s.io/dynamic-resource-allocation v0.32.2
+       k8s.io/endpointslice => k8s.io/endpointslice v0.32.2
+       k8s.io/externaljwt => k8s.io/externaljwt v0.32.2
+       k8s.io/klog/v2 => k8s.io/klog/v2 v2.130.1
+       k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.32.2
+       k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.32.2
+       k8s.io/kube-proxy => k8s.io/kube-proxy v0.32.2
+       k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.32.2
+       k8s.io/kubectl => k8s.io/kubectl v0.32.2
+       k8s.io/kubelet => k8s.io/kubelet v0.32.2
+       k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.32.2
+       k8s.io/metrics => k8s.io/metrics v0.32.2
+       k8s.io/mount-utils => k8s.io/mount-utils v0.32.2
+       k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.32.2
+       k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.32.2
+       k8s.io/utils => k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
 )
diff --git a/go.sum b/go.sum
index c5628c31..40dec108 100644
--- a/go.sum
+++ b/go.sum
@@ -1,15 +1,13 @@
-cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 
h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod 
h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
-github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/Microsoft/go-winio v0.6.0 
h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
-github.com/Microsoft/go-winio v0.6.0/go.mod 
h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
+cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo=
+cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw=
+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/NYTimes/gziphandler v1.1.1 
h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
 github.com/NYTimes/gziphandler v1.1.1/go.mod 
h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 github.com/antlr4-go/antlr/v4 v4.13.0 
h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
 github.com/antlr4-go/antlr/v4 v4.13.0/go.mod 
h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
-github.com/apache/yunikorn-core v0.0.0-20241114184223-ac32595a9712 
h1:8o5H/okBLrZjYaSULcXvyK9DsZqLeRoXj4iDCu7rC9I=
-github.com/apache/yunikorn-core v0.0.0-20241114184223-ac32595a9712/go.mod 
h1:JA8Uee+D+T9v3p+YznGiGM9cLk5tzX+EM+YYr1TdFYo=
+github.com/apache/yunikorn-core v0.0.0-20250303172658-9eee423b3df0 
h1:4D9qPXqlXcixQXycC6U6zyS/1MBOj4jF5iukbsGFD6k=
+github.com/apache/yunikorn-core v0.0.0-20250303172658-9eee423b3df0/go.mod 
h1:oO8lhVDD9OcxRTyDtfYrTxI+f4XMTatd/qFI0w8JMpY=
 github.com/apache/yunikorn-scheduler-interface 
v0.0.0-20241016105739-f0e241aa0146 
h1:CZ4U7y19YSxNJVBNox3DahhuoxDL++naBl/kj+kqVFc=
 github.com/apache/yunikorn-scheduler-interface 
v0.0.0-20241016105739-f0e241aa0146/go.mod 
h1:co3uU98sj1CUTPNTM13lTyi+CY0DOgDndDW2KiUjktU=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 
h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
@@ -22,13 +20,8 @@ github.com/blang/semver/v4 v4.0.0 
h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM
 github.com/blang/semver/v4 v4.0.0/go.mod 
h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
 github.com/cenkalti/backoff/v4 v4.3.0 
h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
 github.com/cenkalti/backoff/v4 v4.3.0/go.mod 
h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 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/chzyer/logex v1.1.10/go.mod 
h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod 
h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod 
h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
-github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 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=
@@ -41,14 +34,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 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=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/distribution/reference v0.5.0 
h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0=
-github.com/distribution/reference v0.5.0/go.mod 
h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
+github.com/distribution/reference v0.6.0 
h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
+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.11.0 
h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
 github.com/emicklei/go-restful/v3 v3.11.0/go.mod 
h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/envoyproxy/go-control-plane 
v0.9.1-0.20191026205805-5f8ba28d4473/go.mod 
h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod 
h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 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=
@@ -58,71 +49,51 @@ github.com/fxamacker/cbor/v2 v2.7.0/go.mod 
h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXE
 github.com/go-errors/errors v1.4.2 
h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
 github.com/go-errors/errors v1.4.2/go.mod 
h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
 github.com/go-logr/logr v1.2.2/go.mod 
h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.3.0/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
 github.com/go-logr/logr v1.4.2/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod 
h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
 github.com/go-logr/zapr v1.3.0/go.mod 
h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
-github.com/go-openapi/jsonpointer v0.19.6 
h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 github.com/go-openapi/jsonpointer v0.19.6/go.mod 
h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonpointer v0.21.0 
h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod 
h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
 github.com/go-openapi/jsonreference v0.20.2 
h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
 github.com/go-openapi/jsonreference v0.20.2/go.mod 
h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
 github.com/go-openapi/swag v0.22.3/go.mod 
h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
-github.com/go-openapi/swag v0.22.4 
h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
-github.com/go-openapi/swag v0.22.4/go.mod 
h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-openapi/swag v0.23.0 
h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod 
h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
 github.com/go-task/slim-sprig/v3 v3.0.0 
h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
 github.com/go-task/slim-sprig/v3 v3.0.0/go.mod 
h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 github.com/godbus/dbus/v5 v5.0.4/go.mod 
h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/godbus/dbus/v5 v5.1.0 
h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
-github.com/godbus/dbus/v5 v5.1.0/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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da 
h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod 
h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 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.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
 github.com/google/btree v1.1.2/go.mod 
h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/cel-go v0.20.1 
h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84=
-github.com/google/cel-go v0.20.1/go.mod 
h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg=
+github.com/google/cel-go v0.22.0 
h1:b3FJZxpiv1vTMo2/5RDUqAHPxkT8mmMfJIrq1llbf7g=
+github.com/google/cel-go v0.22.0/go.mod 
h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8=
 github.com/google/gnostic-models v0.6.8 
h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
 github.com/google/gnostic-models v0.6.8/go.mod 
h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
-github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 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-20240525223248-4bfdf5a9a2af 
h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
-github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod 
h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
+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/shlex v0.0.0-20191202100458-e7afc7fbc510 
h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod 
h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 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.0 
h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod 
h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc 
h1:f8eY6cV/x1x+HLjOp4r72s/31/V2aTUtg5oKRRPf8/Q=
-github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod 
h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 
h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
+github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod 
h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
 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=
@@ -131,12 +102,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 
h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod 
h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 
h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod 
h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
-github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
-github.com/imdario/mergo v0.3.7/go.mod 
h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 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.2.2 
h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
-github.com/jonboulle/clockwork v0.2.2/go.mod 
h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/jonboulle/clockwork v0.4.0 
h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
+github.com/jonboulle/clockwork v0.4.0/go.mod 
h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
 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=
@@ -158,10 +127,8 @@ github.com/looplab/fsm v1.0.1 
h1:OEW0ORrIx095N/6lgoGkFkotqH6s7vaFPsgjLAaF5QU=
 github.com/looplab/fsm v1.0.1/go.mod 
h1:PmD3fFvQEIsjMEfvZdrCDZ6y8VwKTwWNjlpEr6IKPO4=
 github.com/mailru/easyjson v0.7.7 
h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod 
h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/moby/spdystream v0.4.0 
h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8=
-github.com/moby/spdystream v0.4.0/go.mod 
h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
-github.com/moby/sys/mountinfo v0.7.1 
h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g=
-github.com/moby/sys/mountinfo v0.7.1/go.mod 
h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
+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/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=
@@ -175,18 +142,12 @@ 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.19.0 
h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
-github.com/onsi/ginkgo/v2 v2.19.0/go.mod 
h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
-github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
-github.com/onsi/gomega v1.33.1/go.mod 
h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
+github.com/onsi/ginkgo/v2 v2.21.0 
h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
+github.com/onsi/ginkgo/v2 v2.21.0/go.mod 
h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
+github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
+github.com/onsi/gomega v1.35.1/go.mod 
h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
 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/runc v1.1.14 
h1:rgSuzbmgz5DUJjeSnw337TxDbRuqjs6iqQck/2weR6w=
-github.com/opencontainers/runc v1.1.14/go.mod 
h1:E4C2z+7BxR7GHXp0hAY53mek+x49X1LjPNeMTfRGvOA=
-github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78 
h1:R5M2qXZiK/mWPMT4VldCOiSL9HIAMuxQZWdG0CSM5+4=
-github.com/opencontainers/runtime-spec 
v1.0.3-0.20220909204839-494a5a6aca78/go.mod 
h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/selinux v1.11.0 
h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
-github.com/opencontainers/selinux v1.11.0/go.mod 
h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
 github.com/peterbourgon/diskv v2.0.1+incompatible 
h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod 
h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 
h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw=
@@ -198,7 +159,6 @@ 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/prometheus/client_golang v1.19.1 
h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
 github.com/prometheus/client_golang v1.19.1/go.mod 
h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.6.1 
h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
 github.com/prometheus/client_model v0.6.1/go.mod 
h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 github.com/prometheus/common v0.55.0 
h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
@@ -220,15 +180,14 @@ github.com/spf13/cobra v1.8.1 
h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
 github.com/spf13/cobra v1.8.1/go.mod 
h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/stoewer/go-strcase v1.2.0 
h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
-github.com/stoewer/go-strcase v1.2.0/go.mod 
h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
+github.com/stoewer/go-strcase v1.3.0 
h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs=
+github.com/stoewer/go-strcase v1.3.0/go.mod 
h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod 
h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0/go.mod 
h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
 github.com/stretchr/objx v0.5.2/go.mod 
h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod 
h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -239,27 +198,27 @@ github.com/tmc/grpc-websocket-proxy 
v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7
 github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod 
h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod 
h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 
h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod 
h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 
h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk=
+github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod 
h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xlab/treeprint v1.2.0 
h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ=
 github.com/xlab/treeprint v1.2.0/go.mod 
h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI=
-go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE=
-go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0=
-go.etcd.io/etcd/api/v3 v3.5.14/go.mod 
h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU=
-go.etcd.io/etcd/client/pkg/v3 v3.5.14 
h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ=
-go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod 
h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI=
-go.etcd.io/etcd/client/v2 v2.305.13 
h1:RWfV1SX5jTU0lbCvpVQe3iPQeAHETWdOTb6pxhd77C8=
-go.etcd.io/etcd/client/v2 v2.305.13/go.mod 
h1:iQnL7fepbiomdXMb3om1rHq96htNNGv2sJkEcZGDRRg=
-go.etcd.io/etcd/client/v3 v3.5.14 
h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg=
-go.etcd.io/etcd/client/v3 v3.5.14/go.mod 
h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk=
-go.etcd.io/etcd/pkg/v3 v3.5.13 h1:st9bDWNsKkBNpP4PR1MvM/9NqUPfvYZx/YXegsYEH8M=
-go.etcd.io/etcd/pkg/v3 v3.5.13/go.mod 
h1:N+4PLrp7agI/Viy+dUYpX7iRtSPvKq+w8Y14d1vX+m0=
-go.etcd.io/etcd/raft/v3 v3.5.13 h1:7r/NKAOups1YnKcfro2RvGGo2PTuizF/xh26Z2CTAzA=
-go.etcd.io/etcd/raft/v3 v3.5.13/go.mod 
h1:uUFibGLn2Ksm2URMxN1fICGhk8Wu96EfDQyuLhAcAmw=
-go.etcd.io/etcd/server/v3 v3.5.13 
h1:V6KG+yMfMSqWt+lGnhFpP5z5dRUj1BDRJ5k1fQ9DFok=
-go.etcd.io/etcd/server/v3 v3.5.13/go.mod 
h1:K/8nbsGupHqmr5MkgaZpLlH1QdX1pcNQLAkODy44XcQ=
+go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
+go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
+go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0=
+go.etcd.io/etcd/api/v3 v3.5.16/go.mod 
h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28=
+go.etcd.io/etcd/client/pkg/v3 v3.5.16 
h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q=
+go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod 
h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E=
+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.5.16 
h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE=
+go.etcd.io/etcd/client/v3 v3.5.16/go.mod 
h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50=
+go.etcd.io/etcd/pkg/v3 v3.5.16 h1:cnavs5WSPWeK4TYwPYfmcr3Joz9BH+TZ6qoUtz6/+mc=
+go.etcd.io/etcd/pkg/v3 v3.5.16/go.mod 
h1:+lutCZHG5MBBFI/U4eYT5yL7sJfnexsoM20Y0t2uNuY=
+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.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc 
v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 
h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
@@ -278,72 +237,46 @@ go.opentelemetry.io/otel/trace v1.28.0 
h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+
 go.opentelemetry.io/otel/trace v1.28.0/go.mod 
h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
 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.starlark.net v0.0.0-20230525235612-a134d8f9ddca 
h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
-go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod 
h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
 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.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
 golang.org/x/crypto v0.31.0/go.mod 
h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 
h1:ESSUROHIBHg7USnszlcdmjBEwdMj9VUvU+OPk4yl2mc=
-golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8/go.mod 
h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod 
h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+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.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
-golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
 golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
 golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
-golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod 
h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
-golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
 golang.org/x/term v0.27.0/go.mod 
h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
 golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
 golang.org/x/text v0.17.0/go.mod 
h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
-golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
-golang.org/x/tools v0.24.0/go.mod 
h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d 
h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY=
-google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod 
h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
-google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 
h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20240528184218-531527333157/go.mod 
h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 
h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20240701130421-f6361c86f094/go.mod 
h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
-google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
+golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
+golang.org/x/tools v0.26.0/go.mod 
h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
+google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 
h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ=
+google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod 
h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
+google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 
h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20240826202546-f6391c0de4c7/go.mod 
h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 
h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20240826202546-f6391c0de4c7/go.mod 
h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
 google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
 google.golang.org/grpc v1.65.0/go.mod 
h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.34.2 
h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod 
h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/protobuf v1.35.1 
h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
+google.golang.org/protobuf v1.35.1/go.mod 
h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 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=
@@ -353,68 +286,60 @@ 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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 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=
 gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
 gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo=
-k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE=
-k8s.io/apiextensions-apiserver v0.31.0 
h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk=
-k8s.io/apiextensions-apiserver v0.31.0/go.mod 
h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk=
-k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc=
-k8s.io/apimachinery v0.31.0/go.mod 
h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
-k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY=
-k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk=
-k8s.io/cli-runtime v0.31.0 h1:V2Q1gj1u3/WfhD475HBQrIYsoryg/LrhhK4RwpN+DhA=
-k8s.io/cli-runtime v0.31.0/go.mod 
h1:vg3H94wsubuvWfSmStDbekvbla5vFGC+zLWqcf+bGDw=
-k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8=
-k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU=
-k8s.io/cloud-provider v0.31.0 h1:qNOs78I2/7zQmyStfDtY2M7EdilUl9fCSYMcqBju/tA=
-k8s.io/cloud-provider v0.31.0/go.mod 
h1:QgUPqLoL6aXhLlrNg1U4IrJk/PvvxgeOnT2ixkgnqT0=
-k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs=
-k8s.io/component-base v0.31.0/go.mod 
h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo=
-k8s.io/component-helpers v0.31.0 
h1:jyRUKA+GX+q19o81k4x94imjNICn+e6Gzi6T89va1/A=
-k8s.io/component-helpers v0.31.0/go.mod 
h1:MrNIvT4iB7wXIseYSWfHUJB/aNUiFvbilp4qDfBQi6s=
-k8s.io/controller-manager v0.31.0 
h1:OmM0JfkzMvNXGbKIInj8SOrqIHLW4ymDGaNaa4KqyGc=
-k8s.io/controller-manager v0.31.0/go.mod 
h1:slaIzbI1ecqVphjSuHwlzJQ2pclSwtjUzTEQ6fYAB8A=
-k8s.io/csi-translation-lib v0.31.0 
h1:5aCBPyFScdhfcWCUj0KDMAi/lDhxK99DF4XcfSnmH1A=
-k8s.io/csi-translation-lib v0.31.0/go.mod 
h1:CM3U0vDm4jfuQpjKkqlJdRDqmAEcLQPm7aoJFjYf668=
-k8s.io/dynamic-resource-allocation v0.31.0 
h1:zUzbI2d1uUZNleW77L5KQlPWVqHmX6hBsoJvx8AIHUg=
-k8s.io/dynamic-resource-allocation v0.31.0/go.mod 
h1:eDK+MyEeE2m6vihsw7S75lPYr1NkDV3NP6ixm7WvO/0=
-k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
-k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
-k8s.io/kms v0.31.0 h1:KchILPfB1ZE+ka7223mpU5zeFNkmb45jl7RHnlImUaI=
-k8s.io/kms v0.31.0/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94=
-k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 
h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
-k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod 
h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
-k8s.io/kube-scheduler v0.31.0 h1:5ij/3AwAWGIFgyOtNheZVvj6fl3wzQTHGpnr6s2Ub/w=
-k8s.io/kube-scheduler v0.31.0/go.mod 
h1:QEUZLddwPemiI+No23wF35D7pjkL++mS4ZhBPyG55KU=
-k8s.io/kubectl v0.31.0 h1:kANwAAPVY02r4U4jARP/C+Q1sssCcN/1p9Nk+7BQKVg=
-k8s.io/kubectl v0.31.0/go.mod h1:pB47hhFypGsaHAPjlwrNbvhXgmuAr01ZBvAIIUaI8d4=
-k8s.io/kubelet v0.31.0 h1:IlfkBy7QTojGEm97GuVGhtli0HL/Pgu4AdayiF76yWo=
-k8s.io/kubelet v0.31.0/go.mod h1:s+OnqnfdIh14PFpUb7NgzM53WSYXcczA3w/1qSzsRc8=
-k8s.io/kubernetes v1.31.0 h1:sYAB12TTWexXKp4RxqJMm/7EC+P0mNOgn4Xdj5eu7HM=
-k8s.io/kubernetes v1.31.0/go.mod 
h1:UTpGn7nxrUrPWw5hNIYTAjodcWIvLakgHpLtfrr6GC8=
-k8s.io/mount-utils v0.31.0 h1:o+a+n6gyZ7MGc6bIERU3LeFTHbLDBiVReaDpWlJotUE=
-k8s.io/mount-utils v0.31.0/go.mod 
h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b 
h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod 
h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 
h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod 
h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd 
h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
-sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod 
h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
-sigs.k8s.io/kustomize/api v0.17.2 
h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g=
-sigs.k8s.io/kustomize/api v0.17.2/go.mod 
h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0=
-sigs.k8s.io/kustomize/kyaml v0.17.1 
h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ=
-sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod 
h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
-sigs.k8s.io/structured-merge-diff/v4 v4.4.1 
h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
-sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod 
h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
+k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw=
+k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y=
+k8s.io/apiextensions-apiserver v0.32.2 
h1:2YMk285jWMk2188V2AERy5yDwBYrjgWYggscghPCvV4=
+k8s.io/apiextensions-apiserver v0.32.2/go.mod 
h1:GPwf8sph7YlJT3H6aKUWtd0E+oyShk/YHWQHf/OOgCA=
+k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ=
+k8s.io/apimachinery v0.32.2/go.mod 
h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.2 h1:WzyxAu4mvLkQxwD9hGa4ZfExo3yZZaYzoYvvVDlM6vw=
+k8s.io/apiserver v0.32.2/go.mod h1:PEwREHiHNU2oFdte7BjzA1ZyjWjuckORLIK/wLV5goM=
+k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks=
+k8s.io/cli-runtime v0.32.2/go.mod 
h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8=
+k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA=
+k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94=
+k8s.io/cloud-provider v0.32.2 h1:8EC+fCYo0r0REczSjOZcVuQPCMxXxCKlgxDbYMrzC30=
+k8s.io/cloud-provider v0.32.2/go.mod 
h1:2s8TeAXhVezp5VISaTxM6vW3yDonOZXoN4Aryz1p1PQ=
+k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU=
+k8s.io/component-base v0.32.2/go.mod 
h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0=
+k8s.io/component-helpers v0.32.2 
h1:2usSAm3zNE5yu5DdAdrKBWLfSYNpU4OPjZywJY5ovP8=
+k8s.io/component-helpers v0.32.2/go.mod 
h1:fvQAoiiOP7jUEUBc9qR0PXiBPuB0I56WTxTkkpcI8g8=
+k8s.io/controller-manager v0.32.2 
h1:/9XuHWEqofO2Aqa4l7KJGckJUcLVRWfx+qnVkdXoStI=
+k8s.io/controller-manager v0.32.2/go.mod 
h1:o5uo2tLCQhuoMt0RfKcQd0eqaNmSKOKiT+0YELCqXOk=
+k8s.io/csi-translation-lib v0.32.2 
h1:aLzAyaoJUc5rgtLi8Xd4No1tet6UpvUsGIgRoGnPSSE=
+k8s.io/csi-translation-lib v0.32.2/go.mod 
h1:PlOKan6Vc0G6a+giQbm36plJ+E1LH+GPRLAVMQMSMcY=
+k8s.io/dynamic-resource-allocation v0.32.2 
h1:6wP8/GGvhhvTJLrzwPSoMJDnspmosFj1CKmfrAH6m5U=
+k8s.io/dynamic-resource-allocation v0.32.2/go.mod 
h1:+3qnQfvikLHVZrdZ0/gYkRiV96weUR9j7+Ph3Ui/hYU=
+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.2 h1:7Ff23ht7W40gTcDwUC8G5WjX5W/nxD8WxbNhIYYNZCI=
+k8s.io/kms v0.32.2/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM=
+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-scheduler v0.32.2 h1:vBm6iIjWaD10OPmtkt/503LTKvrN8dWVceeBcpKj/ns=
+k8s.io/kube-scheduler v0.32.2/go.mod 
h1:dD5yuYpnsCfgZmzvncUNPdvXGJXA1hw3gXq7DH3+aCQ=
+k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us=
+k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8=
+k8s.io/kubelet v0.32.2 h1:WFTSYdt3BB1aTApDuKNI16x/4MYqqX8WBBBBh3KupDg=
+k8s.io/kubelet v0.32.2/go.mod h1:cC1ms5RS+lu0ckVr6AviCQXHLSPKEBC3D5oaCBdTGkI=
+k8s.io/kubernetes v1.32.2 h1:mShetlA102UpjRVSGzB+5vjJwy8oPy8FMWrkTH5f37o=
+k8s.io/kubernetes v1.32.2/go.mod 
h1:tiIKO63GcdPRBHW2WiUFm3C0eoLczl3f7qi56Dm1W8I=
+k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 
h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
+k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod 
h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 
h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod 
h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
+sigs.k8s.io/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/kustomize/api v0.18.0 
h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
+sigs.k8s.io/kustomize/api v0.18.0/go.mod 
h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
+sigs.k8s.io/kustomize/kyaml v0.18.1 
h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
+sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod 
h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.2 
h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod 
h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
diff --git a/pkg/admission/webhook_manager_test.go 
b/pkg/admission/webhook_manager_test.go
index d832f3b3..649033ee 100644
--- a/pkg/admission/webhook_manager_test.go
+++ b/pkg/admission/webhook_manager_test.go
@@ -23,7 +23,6 @@ import (
        "crypto/rsa"
        "crypto/x509"
        "fmt"
-       "net/http"
        "sync"
        "testing"
        "time"
@@ -31,14 +30,9 @@ import (
        "gotest.tools/v3/assert"
        arv1 "k8s.io/api/admissionregistration/v1"
        v1 "k8s.io/api/core/v1"
-       apierrors "k8s.io/apimachinery/pkg/api/errors"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/client-go/kubernetes"
        "k8s.io/client-go/kubernetes/fake"
-       admissionregistrationv1 
"k8s.io/client-go/kubernetes/typed/admissionregistration/v1"
-       fakeadmissionregistrationv1 
"k8s.io/client-go/kubernetes/typed/admissionregistration/v1/fake"
-       corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
-       fakecorev1 "k8s.io/client-go/kubernetes/typed/core/v1/fake"
 
        "github.com/apache/yunikorn-k8shim/pkg/admission/pki"
 )
@@ -70,40 +64,42 @@ func testSetupOnce(t *testing.T) {
 
 func TestLoadCACertificatesWhereValid(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
 
-       secret := createSecret()
+       spec := createSecret()
+       secret, err := 
clientset.CoreV1().Secrets(spec.Namespace).Create(context.Background(), spec, 
metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to create secret")
        addCert(t, secret, cacert1, cakey1, 1)
        addCert(t, secret, cacert2, cakey2, 2)
-       clientset.secrets["default/admission-controller-secrets"] = secret
 
        wm := newWebhookManagerImpl(createConfig(), clientset)
-       err := wm.LoadCACertificates()
+       err = wm.LoadCACertificates()
        assert.NilError(t, err, "failed to load CA certificates")
 }
 
 func TestLoadCACertificatesWithMissingSecret(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
 
        wm := newWebhookManagerImpl(createConfig(), clientset)
        err := wm.LoadCACertificates()
-       assert.ErrorContains(t, err, string(metav1.StatusReasonNotFound), "get 
secrets didn't fail")
+       assert.ErrorContains(t, err, "not found", "get secrets didn't fail")
 }
 
 func TestLoadCACertificatesWithEmptySecret(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
 
-       secret := createSecret()
-       clientset.secrets["default/admission-controller-secrets"] = secret
+       spec := createSecret()
+       _, err := 
clientset.CoreV1().Secrets(spec.Namespace).Create(context.Background(), spec, 
metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to create secret")
 
        wm := newWebhookManagerImpl(createConfig(), clientset)
-       err := wm.LoadCACertificates()
+       err = wm.LoadCACertificates()
        assert.NilError(t, err, "failed to load CA certificates")
-       secret, ok := clientset.secrets["default/admission-controller-secrets"]
-       assert.Assert(t, ok, "secret not found")
-       _, ok = secret.Data["cacert1.pem"]
+       secret, err := 
clientset.CoreV1().Secrets("default").Get(context.Background(), 
"admission-controller-secrets", metav1.GetOptions{})
+       assert.NilError(t, err, "secret not found")
+       _, ok := secret.Data["cacert1.pem"]
        assert.Assert(t, ok, "cacert2.pem not found")
        _, ok = secret.Data["cacert2.pem"]
        assert.Assert(t, ok, "cacert1.pem not found")
@@ -115,21 +111,22 @@ func TestLoadCACertificatesWithEmptySecret(t *testing.T) {
 
 func TestLoadCACertificatesWithConflict(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
 
-       secret := createSecret()
-       secret.ObjectMeta.SetAnnotations(map[string]string{"conflict": "true"})
-       clientset.secrets["default/admission-controller-secrets"] = secret
+       spec := createSecret()
+       spec.ObjectMeta.SetAnnotations(map[string]string{"conflict": "true"})
+       _, err := 
clientset.CoreV1().Secrets(spec.Namespace).Create(context.Background(), spec, 
metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to create secret")
 
        wm := newWebhookManagerImpl(createConfig(), clientset)
        wm.conflictAttempts = 0
-       err := wm.LoadCACertificates()
+       err = wm.LoadCACertificates()
        assert.ErrorContains(t, err, "max attempts", "update secrets didn't 
fail")
 }
 
 func TestGenerateServerCertificate(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        cert, err := wm.GenerateServerCertificate()
@@ -147,7 +144,7 @@ func TestGenerateServerCertificate(t *testing.T) {
 
 func TestGenerateServerCertificateWithNoCACertificates(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := newWebhookManagerImpl(createConfig(), clientset)
 
        _, err := wm.GenerateServerCertificate()
@@ -156,7 +153,7 @@ func TestGenerateServerCertificateWithNoCACertificates(t 
*testing.T) {
 
 func TestInstallWebhooksWithNoCACertificates(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := newWebhookManagerImpl(createConfig(), clientset)
 
        err := wm.InstallWebhooks()
@@ -165,27 +162,29 @@ func TestInstallWebhooksWithNoCACertificates(t 
*testing.T) {
 
 func TestInstallWebhooksWhenAlreadyPresent(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        vh := wm.createEmptyValidatingWebhook()
        wm.populateValidatingWebhook(vh, caBundle)
-       
clientset.validatingWebhooks["yunikorn-admission-controller-validations"] = vh
+       _, err := 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Create(context.Background(),
 vh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add validating webhook")
 
        mh := wm.createEmptyMutatingWebhook()
        wm.populateMutatingWebhook(mh, caBundle)
-       clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"] = 
mh
+       _, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Create(context.Background(),
 mh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add mutating webhook")
 
-       err := wm.InstallWebhooks()
+       err = wm.InstallWebhooks()
        assert.NilError(t, err, "Install webhooks failed")
-       vh, ok := 
clientset.validatingWebhooks["yunikorn-admission-controller-validations"]
-       assert.Assert(t, ok, "validating webhook not found")
+       vh, err = 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-validations", metav1.GetOptions{})
+       assert.NilError(t, err, "validating webhook not found")
        err = wm.checkValidatingWebhook(vh)
        assert.NilError(t, err, "validating webhook is malformed")
        assert.Equal(t, vh.Generation, int64(0), "wrong generation for 
validating webhook")
 
-       mh, ok = 
clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"]
-       assert.Assert(t, ok, "mutating webhook not found")
+       mh, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-mutations", metav1.GetOptions{})
+       assert.NilError(t, err, "mutating webhook not found")
        err = wm.checkMutatingWebhook(mh)
        assert.NilError(t, err, "mutating webhook is malformed")
        assert.Equal(t, mh.Generation, int64(0), "wrong generation for mutating 
webhook")
@@ -193,85 +192,89 @@ func TestInstallWebhooksWhenAlreadyPresent(t *testing.T) {
 
 func TestInstallWebhooksWithNoHooksPresent(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        err := wm.InstallWebhooks()
        assert.NilError(t, err, "Install webhooks failed")
-       vh, ok := 
clientset.validatingWebhooks["yunikorn-admission-controller-validations"]
-       assert.Assert(t, ok, "validating webhook not found")
+       vh, err := 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-validations", metav1.GetOptions{})
+       assert.NilError(t, err, "validating webhook not found")
        err = wm.checkValidatingWebhook(vh)
        assert.NilError(t, err, "validating webhook is malformed")
 
-       mh, ok := 
clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"]
-       assert.Assert(t, ok, "mutating webhook not found")
+       mh, err := 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-mutations", metav1.GetOptions{})
+       assert.NilError(t, err, "mutating webhook not found")
        err = wm.checkMutatingWebhook(mh)
        assert.NilError(t, err, "mutating webhook is malformed")
 }
 
 func TestInstallWebhooksWithWrongData(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        vh := wm.createEmptyValidatingWebhook()
        wm.populateValidatingWebhook(vh, []byte{0})
-       
clientset.validatingWebhooks["yunikorn-admission-controller-validations"] = vh
+       _, err := 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Create(context.Background(),
 vh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add validating webhook")
 
        mh := wm.createEmptyMutatingWebhook()
        wm.populateMutatingWebhook(mh, []byte{0})
-       clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"] = 
mh
+       _, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Create(context.Background(),
 mh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add mutating webhook")
 
-       err := wm.InstallWebhooks()
+       err = wm.InstallWebhooks()
        assert.NilError(t, err, "Install webhooks failed")
-       vh, ok := 
clientset.validatingWebhooks["yunikorn-admission-controller-validations"]
-       assert.Assert(t, ok, "validating webhook not found")
+       vh, err = 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-validations", metav1.GetOptions{})
+       assert.NilError(t, err, "validating webhook not found")
        err = wm.checkValidatingWebhook(vh)
        assert.NilError(t, err, "validating webhook is malformed")
-       assert.Equal(t, vh.Generation, int64(1), "wrong generation for 
validating webhook")
 
-       mh, ok = 
clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"]
-       assert.Assert(t, ok, "mutating webhook not found")
+       mh, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Get(context.Background(),
 "yunikorn-admission-controller-mutations", metav1.GetOptions{})
+       assert.NilError(t, err, "mutating webhook not found")
        err = wm.checkMutatingWebhook(mh)
        assert.NilError(t, err, "mutating webhook is malformed")
-       assert.Equal(t, mh.Generation, int64(1), "wrong generation for mutating 
webhook")
 }
 
 func TestInstallWebhooksWithValidationConflict(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
        wm.conflictAttempts = 0
 
        vh := wm.createEmptyValidatingWebhook()
        wm.populateValidatingWebhook(vh, []byte{0})
        vh.ObjectMeta.SetAnnotations(map[string]string{"conflict": "true"})
-       
clientset.validatingWebhooks["yunikorn-admission-controller-validations"] = vh
+       _, err := 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Create(context.Background(),
 vh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add validating webhook")
 
        mh := wm.createEmptyMutatingWebhook()
        wm.populateMutatingWebhook(mh, caBundle)
-       clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"] = 
mh
+       _, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Create(context.Background(),
 mh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add mutating webhook")
 
-       err := wm.InstallWebhooks()
+       err = wm.InstallWebhooks()
        assert.ErrorContains(t, err, "max attempts", "update webhook didn't 
fail")
 }
 
 func TestInstallWebhooksWithMutationConflict(t *testing.T) {
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
        wm.conflictAttempts = 0
 
        vh := wm.createEmptyValidatingWebhook()
        wm.populateValidatingWebhook(vh, caBundle)
-       
clientset.validatingWebhooks["yunikorn-admission-controller-validations"] = vh
+       _, err := 
clientset.AdmissionregistrationV1().ValidatingWebhookConfigurations().Create(context.Background(),
 vh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add validating webhook")
 
        mh := wm.createEmptyMutatingWebhook()
        wm.populateMutatingWebhook(mh, []byte{0})
        mh.ObjectMeta.SetAnnotations(map[string]string{"conflict": "true"})
-       clientset.mutatingWebhooks["yunikorn-admission-controller-mutations"] = 
mh
+       _, err = 
clientset.AdmissionregistrationV1().MutatingWebhookConfigurations().Create(context.Background(),
 mh, metav1.CreateOptions{})
+       assert.NilError(t, err, "failed to add mutating webhook")
 
-       err := wm.InstallWebhooks()
+       err = wm.InstallWebhooks()
        assert.ErrorContains(t, err, "max attempts", "update webhook didn't 
fail")
 }
 
@@ -360,7 +363,7 @@ func TestCheckValidatingWebhook(t *testing.T) {
        }
 
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        for _, c := range cases {
@@ -460,7 +463,7 @@ func TestCheckMutatingWebhook(t *testing.T) {
        }
 
        testSetupOnce(t)
-       clientset := fakeClientSet()
+       clientset := fake.NewClientset()
        wm := createPopulatedWm(clientset)
 
        for _, c := range cases {
@@ -526,160 +529,3 @@ func keyPem(t *testing.T, key *rsa.PrivateKey) []byte {
        assert.NilError(t, err, "failed to encode certificate")
        return *pem
 }
-
-// K8s API mocks
-
-type fakeClient struct {
-       fake.Clientset
-       secrets            map[string]*v1.Secret
-       validatingWebhooks map[string]*arv1.ValidatingWebhookConfiguration
-       mutatingWebhooks   map[string]*arv1.MutatingWebhookConfiguration
-}
-
-type fakeCoreV1 struct {
-       fakecorev1.FakeCoreV1
-       client *fakeClient
-}
-
-type fakeSecrets struct {
-       fakecorev1.FakeSecrets
-       core *fakeCoreV1
-       ns   string
-}
-
-type fakeAdmissionregistrationV1 struct {
-       fakeadmissionregistrationv1.FakeAdmissionregistrationV1
-       client *fakeClient
-}
-
-type fakeValidatingWebhookConfigurations struct {
-       fakeadmissionregistrationv1.FakeValidatingWebhookConfigurations
-       ar *fakeAdmissionregistrationV1
-}
-
-type fakeMutatingWebhookConfigurations struct {
-       fakeadmissionregistrationv1.FakeMutatingWebhookConfigurations
-       ar *fakeAdmissionregistrationV1
-}
-
-func fakeClientSet() *fakeClient {
-       return &fakeClient{
-               secrets:            make(map[string]*v1.Secret),
-               validatingWebhooks: 
make(map[string]*arv1.ValidatingWebhookConfiguration),
-               mutatingWebhooks:   
make(map[string]*arv1.MutatingWebhookConfiguration),
-       }
-}
-
-func (c *fakeClient) CoreV1() corev1.CoreV1Interface {
-       return &fakeCoreV1{client: c}
-}
-
-func (c *fakeCoreV1) Secrets(namespace string) corev1.SecretInterface {
-       return &fakeSecrets{core: c, ns: namespace}
-}
-
-func (c *fakeClient) AdmissionregistrationV1() 
admissionregistrationv1.AdmissionregistrationV1Interface {
-       return &fakeAdmissionregistrationV1{client: c}
-}
-
-func (ar *fakeAdmissionregistrationV1) MutatingWebhookConfigurations() 
admissionregistrationv1.MutatingWebhookConfigurationInterface {
-       return &fakeMutatingWebhookConfigurations{ar: ar}
-}
-
-func (ar *fakeAdmissionregistrationV1) ValidatingWebhookConfigurations() 
admissionregistrationv1.ValidatingWebhookConfigurationInterface {
-       return &fakeValidatingWebhookConfigurations{ar: ar}
-}
-
-func (s *fakeSecrets) Get(_ context.Context, name string, _ metav1.GetOptions) 
(*v1.Secret, error) {
-       secret, ok := s.core.client.secrets[fmt.Sprintf("%s/%s", s.ns, name)]
-       if !ok {
-               return nil, notFoundErr()
-       }
-
-       return secret, nil
-}
-
-func (s *fakeSecrets) Update(_ context.Context, secret *v1.Secret, opts 
metav1.UpdateOptions) (*v1.Secret, error) {
-       existing, ok := s.core.client.secrets[fmt.Sprintf("%s/%s", s.ns, 
secret.Name)]
-       if !ok || secret.Namespace != s.ns {
-               return nil, notFoundErr()
-       }
-
-       if _, ok := existing.GetAnnotations()["conflict"]; ok {
-               return nil, conflictErr()
-       }
-
-       secret.Generation++
-       s.core.client.secrets[fmt.Sprintf("%s/%s", s.ns, secret.Name)] = secret
-       return secret, nil
-}
-
-func (c *fakeValidatingWebhookConfigurations) Get(_ context.Context, name 
string, _ metav1.GetOptions) (*arv1.ValidatingWebhookConfiguration, error) {
-       hook, ok := c.ar.client.validatingWebhooks[name]
-       if !ok {
-               return nil, notFoundErr()
-       }
-       return hook, nil
-}
-
-func (c *fakeValidatingWebhookConfigurations) Create(_ context.Context, hook 
*arv1.ValidatingWebhookConfiguration, _ metav1.CreateOptions) 
(*arv1.ValidatingWebhookConfiguration, error) {
-       if _, ok := c.ar.client.validatingWebhooks[hook.Name]; ok {
-               return nil, conflictErr()
-       }
-       c.ar.client.validatingWebhooks[hook.Name] = hook
-       return hook, nil
-}
-
-func (c *fakeValidatingWebhookConfigurations) Update(_ context.Context, hook 
*arv1.ValidatingWebhookConfiguration, _ metav1.UpdateOptions) 
(*arv1.ValidatingWebhookConfiguration, error) {
-       existing, ok := c.ar.client.validatingWebhooks[hook.Name]
-       if !ok {
-               return nil, notFoundErr()
-       }
-
-       if _, ok := existing.GetAnnotations()["conflict"]; ok {
-               return nil, conflictErr()
-       }
-
-       hook.Generation++
-       c.ar.client.validatingWebhooks[hook.Name] = hook
-       return hook, nil
-}
-
-func (c *fakeMutatingWebhookConfigurations) Get(_ context.Context, name 
string, opts metav1.GetOptions) (*arv1.MutatingWebhookConfiguration, error) {
-       hook, ok := c.ar.client.mutatingWebhooks[name]
-       if !ok {
-               return nil, notFoundErr()
-       }
-       return hook, nil
-}
-
-func (c *fakeMutatingWebhookConfigurations) Create(_ context.Context, hook 
*arv1.MutatingWebhookConfiguration, _ metav1.CreateOptions) 
(*arv1.MutatingWebhookConfiguration, error) {
-       if _, ok := c.ar.client.mutatingWebhooks[hook.Name]; ok {
-               return nil, conflictErr()
-       }
-       c.ar.client.mutatingWebhooks[hook.Name] = hook
-       return hook, nil
-}
-
-func (c *fakeMutatingWebhookConfigurations) Update(_ context.Context, hook 
*arv1.MutatingWebhookConfiguration, opts metav1.UpdateOptions) 
(*arv1.MutatingWebhookConfiguration, error) {
-       existing, ok := c.ar.client.mutatingWebhooks[hook.Name]
-       if !ok {
-               return nil, notFoundErr()
-       }
-
-       if _, ok := existing.GetAnnotations()["conflict"]; ok {
-               return nil, conflictErr()
-       }
-
-       hook.Generation++
-       c.ar.client.mutatingWebhooks[hook.Name] = hook
-       return hook, nil
-}
-
-func notFoundErr() error {
-       return &apierrors.StatusError{ErrStatus: metav1.Status{Code: 
http.StatusNotFound, Message: string(metav1.StatusReasonNotFound), Reason: 
metav1.StatusReasonNotFound}}
-}
-
-func conflictErr() error {
-       return &apierrors.StatusError{ErrStatus: metav1.Status{Code: 
http.StatusConflict, Message: string(metav1.StatusReasonConflict), Reason: 
metav1.StatusReasonConflict}}
-}
diff --git a/pkg/cache/context.go b/pkg/cache/context.go
index ff691194..ca409c10 100644
--- a/pkg/cache/context.go
+++ b/pkg/cache/context.go
@@ -75,6 +75,7 @@ type Context struct {
        lock           *locking.RWMutex               // lock - used not only 
for context data but also to ensure that multiple event types are not executed 
concurrently
        txnID          atomic.Uint64                  // transaction ID counter
        klogger        klog.Logger
+       podActivator   atomic.Value
 }
 
 // NewContext create a new context for the scheduler using a default (empty) 
configuration
@@ -111,6 +112,18 @@ func NewContextWithBootstrapConfigMaps(apis 
client.APIProvider, bootstrapConfigM
        return ctx
 }
 
+// SetPodActivator is used by the plugin mode to add a callback function to 
reschedule a pod
+func (ctx *Context) SetPodActivator(podActivator func(logger klog.Logger, pod 
*v1.Pod)) {
+       ctx.podActivator.Store(podActivator)
+}
+
+// ActivatePod is used to tell Kubernetes to re-schedule a pod when using 
plugin mode
+func (ctx *Context) ActivatePod(pod *v1.Pod) {
+       if activator, ok := ctx.podActivator.Load().(func(logger klog.Logger, 
pod *v1.Pod)); ok && activator != nil {
+               activator(ctx.klogger, pod)
+       }
+}
+
 func (ctx *Context) AddSchedulingEventHandlers() error {
        err := ctx.apiProvider.AddEventHandler(&client.ResourceEventHandlers{
                Type:     client.ConfigMapInformerHandlers,
diff --git a/pkg/cache/external/scheduler_cache.go 
b/pkg/cache/external/scheduler_cache.go
index fa4d8675..d2937edf 100644
--- a/pkg/cache/external/scheduler_cache.go
+++ b/pkg/cache/external/scheduler_cache.go
@@ -650,7 +650,7 @@ func (cache *SchedulerCache) GetNodeInfo(nodeName string) 
(*v1.Node, error) {
 
 // Implement scheduler/algorithm/predicates/predicates.go#StorageClassInfo 
interface
 func (cache *SchedulerCache) GetStorageClassInfo(className string) 
(*storageV1.StorageClass, error) {
-       return cache.clients.StorageInformer.Lister().Get(className)
+       return cache.clients.StorageClassInformer.Lister().Get(className)
 }
 
 // Implement 
scheduler/algorithm/predicates/predicates.go#PersistentVolumeClaimInfo interface
diff --git a/pkg/cache/task.go b/pkg/cache/task.go
index 8b758b6f..5a3a3dc3 100644
--- a/pkg/cache/task.go
+++ b/pkg/cache/task.go
@@ -21,7 +21,6 @@ package cache
 import (
        "context"
        "fmt"
-       "strconv"
        "time"
 
        "github.com/looplab/fsm"
@@ -428,19 +427,8 @@ func (task *Task) postTaskBound() {
        if utils.IsPluginMode() {
                // When the pod is actively scheduled by YuniKorn, it can be  
moved to the default-scheduler's
                // UnschedulablePods structure. If the pod does not change, the 
pod will stay in the UnschedulablePods
-               // structure for podMaxInUnschedulablePodsDuration (default 5 
minutes). Here we update the pod
-               // explicitly to move it back to the active queue.
-               // See: 
pkg/scheduler/internal/queue/scheduling_queue.go:isPodUpdated() for what is 
considered updated.
-               podCopy := task.pod.DeepCopy()
-               if _, err := task.UpdateTaskPod(podCopy, func(pod *v1.Pod) {
-                       // Ensure that the default scheduler detects the pod as 
having changed
-                       if pod.Annotations == nil {
-                               pod.Annotations = make(map[string]string)
-                       }
-                       
pod.Annotations[constants.DomainYuniKorn+"scheduled-at"] = 
strconv.FormatInt(time.Now().UnixNano(), 10)
-               }); err != nil {
-                       log.Log(log.ShimCacheTask).Warn("failed to update pod 
status", zap.Error(err))
-               }
+               // structure for podMaxInUnschedulablePodsDuration (default 5 
minutes). Here we explicitly activate the pod.
+               task.context.ActivatePod(task.pod)
        }
 
        if task.placeholder {
diff --git a/pkg/client/apifactory.go b/pkg/client/apifactory.go
index bef55a66..03234c74 100644
--- a/pkg/client/apifactory.go
+++ b/pkg/client/apifactory.go
@@ -36,7 +36,7 @@ import (
 
 type Type int
 
-var informerTypes = [...]string{"Pod", "Node", "ConfigMap", "PV", "PVC", 
"Storage", "CSINode", "CSIDriver", "CSIStorageCapacity", "Namespace", 
"PriorityClass", "Service", "ReplicationController", "ReplicaSet", 
"StatefulSet"}
+var informerTypes = [...]string{"Pod", "Node", "ConfigMap", "PV", "PVC", 
"Storage", "CSINode", "CSIDriver", "CSIStorageCapacity", "Namespace", 
"PriorityClass", "Service", "ReplicationController", "ReplicaSet", 
"StatefulSet", "VolumeAttachment"}
 
 const (
        PodInformerHandlers Type = iota
@@ -54,6 +54,7 @@ const (
        ReplicationControllerInformerHandlers
        ReplicaSetInformerHandlers
        StatefulSetInformerHandlers
+       VolumeAttachmentInformerHandlers
 )
 
 func (t Type) String() string {
@@ -108,6 +109,7 @@ func NewAPIFactory(scheduler api.SchedulerAPI, 
informerFactory informers.SharedI
        replicationControllerInformer := 
informerFactory.Core().V1().ReplicationControllers()
        replicaSetInformer := informerFactory.Apps().V1().ReplicaSets()
        statefulSetInformer := informerFactory.Apps().V1().StatefulSets()
+       volumeAttachmentInformer := 
informerFactory.Storage().V1().VolumeAttachments()
 
        var capacityCheck = volumebinding.CapacityCheck{
                CSIDriverInformer:          
informerFactory.Storage().V1().CSIDrivers(),
@@ -137,7 +139,7 @@ func NewAPIFactory(scheduler api.SchedulerAPI, 
informerFactory informers.SharedI
                        ConfigMapInformer:             configMapInformer,
                        PVInformer:                    pvInformer,
                        PVCInformer:                   pvcInformer,
-                       StorageInformer:               storageInformer,
+                       StorageClassInformer:          storageInformer,
                        CSINodeInformer:               csiNodeInformer,
                        CSIDriverInformer:             csiDriverInformer,
                        CSIStorageCapacityInformer:    
csiStorageCapacityInformer,
@@ -147,6 +149,7 @@ func NewAPIFactory(scheduler api.SchedulerAPI, 
informerFactory informers.SharedI
                        ReplicationControllerInformer: 
replicationControllerInformer,
                        ReplicaSetInformer:            replicaSetInformer,
                        StatefulSetInformer:           statefulSetInformer,
+                       VolumeAttachmentInformer:      volumeAttachmentInformer,
                        VolumeBinder:                  volumeBinder,
                },
                testMode: testMode,
@@ -206,7 +209,7 @@ func (s *APIFactory) addEventHandlers(
                _, err = s.GetAPIs().ConfigMapInformer.Informer().
                        AddEventHandlerWithResyncPeriod(handler, resyncPeriod)
        case StorageInformerHandlers:
-               _, err = s.GetAPIs().StorageInformer.Informer().
+               _, err = s.GetAPIs().StorageClassInformer.Informer().
                        AddEventHandlerWithResyncPeriod(handler, resyncPeriod)
        case PVInformerHandlers:
                _, err = s.GetAPIs().PVInformer.Informer().
diff --git a/pkg/client/apifactory_mock.go b/pkg/client/apifactory_mock.go
index 1194b6da..8a93a81a 100644
--- a/pkg/client/apifactory_mock.go
+++ b/pkg/client/apifactory_mock.go
@@ -74,7 +74,7 @@ func NewMockedAPIProvider(showError bool) *MockedAPIProvider {
                        ConfigMapInformer:     
test.NewMockedConfigMapInformer(),
                        PVInformer:            
NewMockedPersistentVolumeInformer(),
                        PVCInformer:           
NewMockedPersistentVolumeClaimInformer(),
-                       StorageInformer:       NewMockedStorageClassInformer(),
+                       StorageClassInformer:  NewMockedStorageClassInformer(),
                        VolumeBinder:          test.NewVolumeBinderMock(),
                        NamespaceInformer:     
test.NewMockNamespaceInformer(false),
                        PriorityClassInformer: 
test.NewMockPriorityClassInformer(),
diff --git a/pkg/client/apifactory_test.go b/pkg/client/apifactory_test.go
index be66c91e..e819ab93 100644
--- a/pkg/client/apifactory_test.go
+++ b/pkg/client/apifactory_test.go
@@ -25,7 +25,7 @@ import (
 )
 
 func TestInformerTypes(t *testing.T) {
-       assert.Equal(t, 15, len(informerTypes), "wrong informerTypes length")
+       assert.Equal(t, 16, len(informerTypes), "wrong informerTypes length")
 
        assert.Equal(t, "Pod", PodInformerHandlers.String())
        assert.Equal(t, "Node", NodeInformerHandlers.String())
@@ -42,6 +42,7 @@ func TestInformerTypes(t *testing.T) {
        assert.Equal(t, "ReplicationController", 
ReplicationControllerInformerHandlers.String())
        assert.Equal(t, "ReplicaSet", ReplicaSetInformerHandlers.String())
        assert.Equal(t, "StatefulSet", StatefulSetInformerHandlers.String())
+       assert.Equal(t, "VolumeAttachment", 
VolumeAttachmentInformerHandlers.String())
 }
 
 func TestMockedAPIProvider_GetPodBindStats(t *testing.T) {
diff --git a/pkg/client/clients.go b/pkg/client/clients.go
index 9fc55172..7289f324 100644
--- a/pkg/client/clients.go
+++ b/pkg/client/clients.go
@@ -46,21 +46,22 @@ type Clients struct {
        InformerFactory informers.SharedInformerFactory
 
        // resource informers
-       PodInformer                   coreInformerV1.PodInformer
-       NodeInformer                  coreInformerV1.NodeInformer
        ConfigMapInformer             coreInformerV1.ConfigMapInformer
-       PVInformer                    coreInformerV1.PersistentVolumeInformer
-       PVCInformer                   
coreInformerV1.PersistentVolumeClaimInformer
-       StorageInformer               storageInformerV1.StorageClassInformer
-       CSINodeInformer               storageInformerV1.CSINodeInformer
        CSIDriverInformer             storageInformerV1.CSIDriverInformer
+       CSINodeInformer               storageInformerV1.CSINodeInformer
        CSIStorageCapacityInformer    
storageInformerV1.CSIStorageCapacityInformer
        NamespaceInformer             coreInformerV1.NamespaceInformer
+       NodeInformer                  coreInformerV1.NodeInformer
+       PodInformer                   coreInformerV1.PodInformer
+       StorageClassInformer          storageInformerV1.StorageClassInformer
+       PVCInformer                   
coreInformerV1.PersistentVolumeClaimInformer
+       PVInformer                    coreInformerV1.PersistentVolumeInformer
+       ReplicaSetInformer            appsInformerV1.ReplicaSetInformer
        PriorityClassInformer         schedulingInformerV1.PriorityClassInformer
        ServiceInformer               coreInformerV1.ServiceInformer
-       ReplicationControllerInformer 
coreInformerV1.ReplicationControllerInformer
-       ReplicaSetInformer            appsInformerV1.ReplicaSetInformer
        StatefulSetInformer           appsInformerV1.StatefulSetInformer
+       ReplicationControllerInformer 
coreInformerV1.ReplicationControllerInformer
+       VolumeAttachmentInformer      storageInformerV1.VolumeAttachmentInformer
 
        // volume binder handles PV/PVC related operations
        VolumeBinder volumebinding.SchedulerVolumeBinder
@@ -70,21 +71,22 @@ func (c *Clients) WaitForSync() {
        syncStartTime := time.Now()
        counter := 0
        for {
-               if c.PodInformer.Informer().HasSynced() &&
-                       c.NodeInformer.Informer().HasSynced() &&
-                       c.ConfigMapInformer.Informer().HasSynced() &&
-                       c.PVInformer.Informer().HasSynced() &&
-                       c.PVCInformer.Informer().HasSynced() &&
-                       c.StorageInformer.Informer().HasSynced() &&
-                       c.CSINodeInformer.Informer().HasSynced() &&
+               if c.ConfigMapInformer.Informer().HasSynced() &&
                        c.CSIDriverInformer.Informer().HasSynced() &&
+                       c.CSINodeInformer.Informer().HasSynced() &&
                        c.CSIStorageCapacityInformer.Informer().HasSynced() &&
                        c.NamespaceInformer.Informer().HasSynced() &&
+                       c.NodeInformer.Informer().HasSynced() &&
+                       c.PodInformer.Informer().HasSynced() &&
                        c.PriorityClassInformer.Informer().HasSynced() &&
-                       c.ServiceInformer.Informer().HasSynced() &&
-                       c.ReplicationControllerInformer.Informer().HasSynced() 
&&
+                       c.PVCInformer.Informer().HasSynced() &&
+                       c.PVInformer.Informer().HasSynced() &&
                        c.ReplicaSetInformer.Informer().HasSynced() &&
-                       c.StatefulSetInformer.Informer().HasSynced() {
+                       c.ReplicationControllerInformer.Informer().HasSynced() 
&&
+                       c.ServiceInformer.Informer().HasSynced() &&
+                       c.StatefulSetInformer.Informer().HasSynced() &&
+                       c.StorageClassInformer.Informer().HasSynced() &&
+                       c.VolumeAttachmentInformer.Informer().HasSynced() {
                        return
                }
                time.Sleep(time.Second)
@@ -97,19 +99,20 @@ func (c *Clients) WaitForSync() {
 }
 
 func (c *Clients) Run(stopCh <-chan struct{}) {
-       go c.PodInformer.Informer().Run(stopCh)
-       go c.NodeInformer.Informer().Run(stopCh)
        go c.ConfigMapInformer.Informer().Run(stopCh)
-       go c.PVInformer.Informer().Run(stopCh)
-       go c.PVCInformer.Informer().Run(stopCh)
-       go c.StorageInformer.Informer().Run(stopCh)
-       go c.CSINodeInformer.Informer().Run(stopCh)
        go c.CSIDriverInformer.Informer().Run(stopCh)
+       go c.CSINodeInformer.Informer().Run(stopCh)
        go c.CSIStorageCapacityInformer.Informer().Run(stopCh)
        go c.NamespaceInformer.Informer().Run(stopCh)
+       go c.NodeInformer.Informer().Run(stopCh)
+       go c.PodInformer.Informer().Run(stopCh)
        go c.PriorityClassInformer.Informer().Run(stopCh)
-       go c.ServiceInformer.Informer().Run(stopCh)
-       go c.ReplicationControllerInformer.Informer().Run(stopCh)
+       go c.PVCInformer.Informer().Run(stopCh)
+       go c.PVInformer.Informer().Run(stopCh)
        go c.ReplicaSetInformer.Informer().Run(stopCh)
+       go c.ReplicationControllerInformer.Informer().Run(stopCh)
+       go c.ServiceInformer.Informer().Run(stopCh)
        go c.StatefulSetInformer.Informer().Run(stopCh)
+       go c.StorageClassInformer.Informer().Run(stopCh)
+       go c.VolumeAttachmentInformer.Informer().Run(stopCh)
 }
diff --git a/pkg/client/clients_test.go b/pkg/client/clients_test.go
index 5b703a12..ac717bcd 100644
--- a/pkg/client/clients_test.go
+++ b/pkg/client/clients_test.go
@@ -29,7 +29,7 @@ import (
 )
 
 const (
-       noOfInformers = 15 // total number of active informers
+       noOfInformers = 16 // total number of active informers
 )
 
 func TestWaitForSync(t *testing.T) {
@@ -73,20 +73,21 @@ func TestRun(t *testing.T) {
 
 func getClients() *Clients {
        return &Clients{
-               PodInformer:                   test.NewMockedPodInformer(),
-               NodeInformer:                  test.NewMockedNodeInformer(),
                ConfigMapInformer:             
test.NewMockedConfigMapInformer(),
-               PVInformer:                    
NewMockedPersistentVolumeInformer(),
-               PVCInformer:                   
NewMockedPersistentVolumeClaimInformer(),
-               StorageInformer:               NewMockedStorageClassInformer(),
-               CSINodeInformer:               NewMockedCSINodeInformer(),
                CSIDriverInformer:             NewMockedCSIDriverInformer(),
+               CSINodeInformer:               NewMockedCSINodeInformer(),
                CSIStorageCapacityInformer:    
NewMockedCSIStorageCapacityInformer(),
                NamespaceInformer:             
test.NewMockNamespaceInformer(false),
+               NodeInformer:                  test.NewMockedNodeInformer(),
+               PodInformer:                   test.NewMockedPodInformer(),
                PriorityClassInformer:         
test.NewMockPriorityClassInformer(),
-               ServiceInformer:               NewMockedServiceInformer(),
-               ReplicationControllerInformer: 
NewMockedReplicationControllerInformer(),
+               PVCInformer:                   
NewMockedPersistentVolumeClaimInformer(),
+               PVInformer:                    
NewMockedPersistentVolumeInformer(),
                ReplicaSetInformer:            NewMockedReplicaSetInformer(),
+               ReplicationControllerInformer: 
NewMockedReplicationControllerInformer(),
+               ServiceInformer:               NewMockedServiceInformer(),
                StatefulSetInformer:           NewMockedStatefulSetInformer(),
+               StorageClassInformer:          NewMockedStorageClassInformer(),
+               VolumeAttachmentInformer:      
test.NewMockVolumeAttachmentInformer(),
        }
 }
diff --git a/pkg/common/resource_test.go b/pkg/common/resource_test.go
index 204086f2..da5f5723 100644
--- a/pkg/common/resource_test.go
+++ b/pkg/common/resource_test.go
@@ -25,7 +25,7 @@ import (
        v1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/api/resource"
        apis "k8s.io/apimachinery/pkg/apis/meta/v1"
-       k8res "k8s.io/kubernetes/pkg/api/v1/resource"
+       k8res "k8s.io/component-helpers/resource"
 
        siCommon "github.com/apache/yunikorn-scheduler-interface/lib/go/common"
        "github.com/apache/yunikorn-scheduler-interface/lib/go/si"
diff --git a/pkg/common/test/volumeattachment_informer_mock.go 
b/pkg/common/test/volumeattachment_informer_mock.go
new file mode 100644
index 00000000..675313fe
--- /dev/null
+++ b/pkg/common/test/volumeattachment_informer_mock.go
@@ -0,0 +1,45 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package test
+
+import (
+       informersv1 "k8s.io/client-go/informers/storage/v1"
+       listersv1 "k8s.io/client-go/listers/storage/v1"
+       "k8s.io/client-go/tools/cache"
+)
+
+type MockVolumeAttachmentInformer struct {
+       lister   listersv1.VolumeAttachmentLister
+       informer cache.SharedIndexInformer
+}
+
+func NewMockVolumeAttachmentInformer() informersv1.VolumeAttachmentInformer {
+       return &MockVolumeAttachmentInformer{
+               lister:   NewMockVolumeAttachmentLister(),
+               informer: &SharedInformerMock{},
+       }
+}
+
+func (m *MockVolumeAttachmentInformer) Informer() cache.SharedIndexInformer {
+       return m.informer
+}
+
+func (m *MockVolumeAttachmentInformer) Lister() 
listersv1.VolumeAttachmentLister {
+       return m.lister
+}
diff --git a/pkg/common/test/volumeattachment_lister_mock.go 
b/pkg/common/test/volumeattachment_lister_mock.go
new file mode 100644
index 00000000..e8190490
--- /dev/null
+++ b/pkg/common/test/volumeattachment_lister_mock.go
@@ -0,0 +1,57 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+package test
+
+import (
+       "fmt"
+
+       storagev1 "k8s.io/api/storage/v1"
+       "k8s.io/apimachinery/pkg/labels"
+       listersv1 "k8s.io/client-go/listers/storage/v1"
+)
+
+type MockVolumeAttachmentLister struct {
+       volumeAttachments map[string]*storagev1.VolumeAttachment
+}
+
+func NewMockVolumeAttachmentLister() listersv1.VolumeAttachmentLister {
+       return &MockVolumeAttachmentLister{
+               volumeAttachments: make(map[string]*storagev1.VolumeAttachment),
+       }
+}
+
+func (nsl *MockVolumeAttachmentLister) List(labels.Selector) (ret 
[]*storagev1.VolumeAttachment, err error) {
+       ret = make([]*storagev1.VolumeAttachment, 0)
+       for _, pc := range nsl.volumeAttachments {
+               ret = append(ret, pc)
+       }
+       return ret, nil
+}
+
+func (l *MockVolumeAttachmentLister) Add(va *storagev1.VolumeAttachment) {
+       l.volumeAttachments[va.Name] = va
+}
+
+func (l *MockVolumeAttachmentLister) Get(name string) 
(*storagev1.VolumeAttachment, error) {
+       ns, ok := l.volumeAttachments[name]
+       if !ok {
+               return nil, fmt.Errorf("volumeAttachment is not found")
+       }
+       return ns, nil
+}
diff --git a/pkg/plugin/predicates/predicate_manager.go 
b/pkg/plugin/predicates/predicate_manager.go
index 4b741020..5e966df6 100644
--- a/pkg/plugin/predicates/predicate_manager.go
+++ b/pkg/plugin/predicates/predicate_manager.go
@@ -36,6 +36,7 @@ import (
        "k8s.io/kubernetes/pkg/scheduler/framework/plugins"
        "k8s.io/kubernetes/pkg/scheduler/framework/plugins/names"
        fwruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime"
+       "k8s.io/kubernetes/pkg/scheduler/metrics"
 
        "github.com/apache/yunikorn-k8shim/pkg/log"
 )
@@ -59,7 +60,7 @@ type predicateManagerImpl struct {
 }
 
 func (p *predicateManagerImpl) EventsToRegister(queueingHintFn 
framework.QueueingHintFn) []framework.ClusterEventWithHint {
-       actionMap := make(map[framework.GVK]framework.ActionType)
+       actionMap := make(map[framework.EventResource]framework.ActionType)
        for _, plugin := range *p.allocationPreFilters {
                mergePluginEvents(actionMap, pluginEvents(plugin))
        }
@@ -82,7 +83,7 @@ func pluginEvents(plugin framework.Plugin) 
[]framework.ClusterEventWithHint {
        return events
 }
 
-func mergePluginEvents(actionMap map[framework.GVK]framework.ActionType, 
events []framework.ClusterEventWithHint) {
+func mergePluginEvents(actionMap 
map[framework.EventResource]framework.ActionType, events 
[]framework.ClusterEventWithHint) {
        if _, ok := actionMap[framework.WildCard]; ok {
                // already registered for all events; skip further processing
                return
@@ -106,7 +107,7 @@ func mergePluginEvents(actionMap 
map[framework.GVK]framework.ActionType, events
        }
 }
 
-func buildClusterEvents(actionMap map[framework.GVK]framework.ActionType, 
queueingHintFn framework.QueueingHintFn) []framework.ClusterEventWithHint {
+func buildClusterEvents(actionMap 
map[framework.EventResource]framework.ActionType, queueingHintFn 
framework.QueueingHintFn) []framework.ClusterEventWithHint {
        events := make([]framework.ClusterEventWithHint, 0)
        for resource, actionType := range actionMap {
                events = append(events, framework.ClusterEventWithHint{
@@ -273,12 +274,12 @@ func (p *predicateManagerImpl) runFilterPlugin(ctx 
context.Context, pl framework
 
 func NewPredicateManager(handle framework.Handle) PredicateManager {
        /*
-               Default K8S plugins as of 1.31 that implement PreFilter:
+               Default K8S plugins as of 1.32 that implement PreFilter:
                        NodeAffinity
                        NodePorts
-                       Fit
+                       NodeResourcesFit
                        VolumeRestrictions
-                       CSILimits
+                       NodeVolumeLimits
                        VolumeBinding
                        VolumeZone
                        PodTopologySpread
@@ -291,8 +292,8 @@ func NewPredicateManager(handle framework.Handle) 
PredicateManager {
                names.NodePorts:         true,
                names.PodTopologySpread: true,
                names.InterPodAffinity:  true,
-               // Fit : skip because during reservation, node resources are 
not enough
-               // CSILimits
+               // NodeResourcesFit : skip because during reservation, node 
resources are not enough
+               // NodeVolumeLimits
                // VolumeRestrictions
                // VolumeBinding
                // VolumeZone
@@ -304,15 +305,15 @@ func NewPredicateManager(handle framework.Handle) 
PredicateManager {
        }
 
        /*
-               Default K8S plugins as of 1.31 that implement Filter:
+               Default K8S plugins as of 1.32 that implement Filter:
                    NodeUnschedulable
                        NodeName
                        TaintToleration
                        NodeAffinity
                        NodePorts
-                       Fit
+                       NodeResourcesFit
                        VolumeRestrictions
-                       CSILimits
+                       NodeVolumeLimits
                        VolumeBinding
                        VolumeZone
                        PodTopologySpread
@@ -328,9 +329,9 @@ func NewPredicateManager(handle framework.Handle) 
PredicateManager {
                names.NodePorts:         true,
                names.PodTopologySpread: true,
                names.InterPodAffinity:  true,
-               // Fit : skip because during reservation, node resources are 
not enough
+               // NodeResourcesFit : skip because during reservation, node 
resources are not enough
                // VolumeRestrictions
-               // CSILimits
+               // NodeVolumeLimits
                // VolumeBinding
                // VolumeZone
        }
@@ -349,6 +350,11 @@ func newPredicateManagerInternal(
        allocationPreFilters map[string]bool,
        reservationFilters map[string]bool,
        allocationFilters map[string]bool) *predicateManagerImpl {
+       // ensure K8s scheduler metrics have been initialized in YK standalone 
mode to avoid SIGSEGV
+       if metrics.Goroutines == nil {
+               metrics.InitMetrics()
+       }
+
        pluginRegistry := plugins.NewInTreeRegistry()
 
        cfg, err := defaultConfig() // latest.Default()
diff --git a/pkg/plugin/predicates/predicate_manager_test.go 
b/pkg/plugin/predicates/predicate_manager_test.go
index 4a6324d6..b1104cff 100644
--- a/pkg/plugin/predicates/predicate_manager_test.go
+++ b/pkg/plugin/predicates/predicate_manager_test.go
@@ -138,12 +138,12 @@ func TestEventsToRegister(t *testing.T) {
        }
        events := predicateManager.EventsToRegister(queueingHintFn)
        assert.Equal(t, events[0].Event.Resource, framework.Node, "wrong 
resource (0)")
-       assert.Equal(t, events[0].Event.ActionType, framework.All, "wrong 
action type (0)")
+       assert.Equal(t, events[0].Event.ActionType, 
framework.Add|framework.Delete|framework.UpdateNodeLabel|framework.UpdateNodeTaint,
 "wrong action type (0)")
        fn0, err := events[0].QueueingHintFn(klog.NewKlogr(), nil, "", "")
        assert.NilError(t, err)
        assert.Equal(t, int(fn0), -1, "wrong fn (0)")
        assert.Equal(t, events[1].Event.Resource, framework.Pod, "wrong 
resource (1)")
-       assert.Equal(t, events[1].Event.ActionType, 
framework.Add|framework.Delete|framework.UpdatePodLabel, "wrong action type 
(1)")
+       assert.Equal(t, events[1].Event.ActionType, 
framework.Add|framework.Delete|framework.UpdatePodLabel|framework.UpdatePodTolerations,
 "wrong action type (1)")
        fn1, err := events[1].QueueingHintFn(klog.NewKlogr(), nil, "", "")
        assert.NilError(t, err)
        assert.Equal(t, int(fn1), -1, "wrong fn (1)")
diff --git a/pkg/plugin/scheduler_plugin.go b/pkg/plugin/scheduler_plugin.go
index 047f363e..5d8974d8 100644
--- a/pkg/plugin/scheduler_plugin.go
+++ b/pkg/plugin/scheduler_plugin.go
@@ -294,8 +294,12 @@ func NewSchedulerPlugin(_ context.Context, _ 
runtime.Object, handle framework.Ha
                log.Log(log.ShimSchedulerPlugin).Fatal("Unable to start 
scheduler", zap.Error(err))
        }
 
+       context := ss.GetContext()
+       context.SetPodActivator(func(logger klog.Logger, pod *v1.Pod) {
+               handle.Activate(logger, map[string]*v1.Pod{pod.Name: pod})
+       })
        p := &YuniKornSchedulerPlugin{
-               context: ss.GetContext(),
+               context: context,
        }
        events.SetRecorder(handle.EventRecorder())
        return p, nil
diff --git a/pkg/plugin/support/framework_handle.go 
b/pkg/plugin/support/framework_handle.go
index 272c5e2b..599b46ef 100644
--- a/pkg/plugin/support/framework_handle.go
+++ b/pkg/plugin/support/framework_handle.go
@@ -145,6 +145,17 @@ func (p frameworkHandle) Extenders() []framework.Extender {
        return nil
 }
 
+func (p frameworkHandle) Activate(logger klog.Logger, pods map[string]*v1.Pod) 
{
+       // currently only used by Preemption plugin, so not needed
+       log.Log(log.ShimFramework).Fatal("BUG: Should not be used by plugins")
+}
+
+func (p frameworkHandle) SharedDRAManager() framework.SharedDRAManager {
+       // currently only used by DRA
+       log.Log(log.ShimFramework).Fatal("BUG: Should not be used by plugins")
+       return nil
+}
+
 var _ framework.Handle = frameworkHandle{}
 
 func NewFrameworkHandle(sharedLister framework.SharedLister, informerFactory 
informers.SharedInformerFactory, clientSet kubernetes.Interface) 
framework.Handle {
diff --git a/scripts/run-e2e-tests.sh b/scripts/run-e2e-tests.sh
index 6ca2280c..2c82b4c5 100755
--- a/scripts/run-e2e-tests.sh
+++ b/scripts/run-e2e-tests.sh
@@ -196,13 +196,13 @@ Examples:
   ${NAME} -a test -n yk8s -v kindest/node:v1.26.15
   ${NAME} -a test -n yk8s -v kindest/node:v1.27.16
   ${NAME} -a test -n yk8s -v kindest/node:v1.28.15
-  ${NAME} -a test -n yk8s -v kindest/node:v1.29.10
-  ${NAME} -a test -n yk8s -v kindest/node:v1.30.6
-  ${NAME} -a test -n yk8s -v kindest/node:v1.31.4
-  ${NAME} -a test -n yk8s -v kindest/node:v1.32.0
+  ${NAME} -a test -n yk8s -v kindest/node:v1.29.14
+  ${NAME} -a test -n yk8s -v kindest/node:v1.30.10
+  ${NAME} -a test -n yk8s -v kindest/node:v1.31.6
+  ${NAME} -a test -n yk8s -v kindest/node:v1.32.2
 
   Use a local helm chart path:
-    ${NAME} -a test -n yk8s -v kindest/node:v1.32.0 -p 
../yunikorn-release/helm-charts/yunikorn
+    ${NAME} -a test -n yk8s -v kindest/node:v1.32.2 -p 
../yunikorn-release/helm-charts/yunikorn
 EOF
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to