Repository: kubernetes-sigs/aws-ebs-csi-driver
Pull request #2456 (2025-04-30 16:52:24)

Add snapshot-volume-scale to scalability test suite
#### What is this PR about? / Why do we need it?

This PR adds a scale test for the CreateSnapshot / restore volume from snapshot code paths.

#### How was this change tested?

Manually:

```
export TEST_TYPE="snapshot-volume-scale"
export REPLICAS=1000
./scale-test run
```

https://gist.github.com/torredil/f1cd9806d013e56115f1ea93f018384d

#### Does this PR introduce a user-facing change?
<!--
If no, just write "NONE" in the release-note block below.
If yes, enter your extended release note in the block below.
-->
```release-note
NONE
```


k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please assign [jsafrane](https://github.com/jsafrane) for approval. For more information see [the Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Faws-ebs-csi-driver).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["jsafrane"]} -->
k8s-ci-robot: @torredil: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-aws-ebs-csi-driver-verify | 078ff27fa773348e875a443070d155f42202e23b | [link](https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_aws-ebs-csi-driver/2456/pull-aws-ebs-csi-driver-verify/1917623086824296448) | true | `/test pull-aws-ebs-csi-driver-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=aws-ebs-csi-driver&pr=2456). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Atorredil). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: New changes are detected. LGTM label has been removed.
k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by:
**Once this PR has been reviewed and has the lgtm label**, please ask for approval from [andrewsirenko](https://github.com/andrewsirenko). For more information see [the Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Faws-ebs-csi-driver).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["andrewsirenko"]} -->
k8s-ci-robot: @torredil: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-aws-ebs-csi-driver-verify | a0894ad7a1ec63b49f37afc8e546b6621b6303ec | [link](https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_aws-ebs-csi-driver/2456/pull-aws-ebs-csi-driver-verify/1920868784625684480) | true | `/test pull-aws-ebs-csi-driver-verify`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=aws-ebs-csi-driver&pr=2456). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3Atorredil). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 67c0f4cc..9c837579 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,134 +1,3 @@
-# 1.43.0
-
-## Changes by Kind
-
-### Feature
-
-- Add `aws_ebs_csi_ec2_detach_pending_seconds_total` controller metric for detecting if volume is not detaching as expected ([#2445](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/2445), [@AndrewSirenko](https://github.com/AndrewSirenko))
-- Introduced new StorageClass parameter: volumeInitializationRate - when creating a volume from a snapshot, this parameter can be used to request a provisioned initialization rate, in MiB/s. ([#2463](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/2463), [@torredil](https://github.com/torredil))
-
-## Dependencies
-
-### Added
-- github.com/go-jose/go-jose/v4: [v4.0.4](https://github.com/go-jose/go-jose/tree/v4.0.4)
-- github.com/spiffe/go-spiffe/v2: [v2.5.0](https://github.com/spiffe/go-spiffe/tree/v2.5.0)
-- github.com/zeebo/errs: [v1.4.0](https://github.com/zeebo/errs/tree/v1.4.0)
-- gopkg.in/go-jose/go-jose.v2: v2.6.3
-
-### Changed
-- github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp: [v1.25.0 → v1.26.0](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/compare/detectors/gcp/v1.25.0...detectors/gcp/v1.26.0)
-- github.com/aws/aws-sdk-go-v2/service/ec2: [v1.211.3 → v1.215.0](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.211.3...service/ec2/v1.215.0)
-- github.com/cncf/xds/go: [cff3c89 → 2f00578](https://github.com/cncf/xds/compare/cff3c89...2f00578)
-- github.com/coredns/corefile-migration: [v1.0.24 → v1.0.25](https://github.com/coredns/corefile-migration/compare/v1.0.24...v1.0.25)
-- github.com/coreos/go-oidc: [v2.2.1+incompatible → v2.3.0+incompatible](https://github.com/coreos/go-oidc/compare/v2.2.1...v2.3.0)
-- github.com/golang-jwt/jwt/v4: [v4.5.0 → v4.5.2](https://github.com/golang-jwt/jwt/compare/v4.5.0...v4.5.2)
-- github.com/google/cel-go: [v0.22.1 → v0.23.2](https://github.com/google/cel-go/compare/v0.22.1...v0.23.2)
-- github.com/gorilla/websocket: [v1.5.3 → e064f32](https://github.com/gorilla/websocket/compare/v1.5.3...e064f32)
-- github.com/opencontainers/runc: [v1.2.6 → v1.2.5](https://github.com/opencontainers/runc/compare/v1.2.6...v1.2.5)
-- github.com/prometheus/procfs: [v0.16.0 → v0.16.1](https://github.com/prometheus/procfs/compare/v0.16.0...v0.16.1)
-- go.etcd.io/etcd/client/v2: v2.305.16 → v2.305.21
-- go.etcd.io/etcd/pkg/v3: v3.5.16 → v3.5.21
-- go.etcd.io/etcd/raft/v3: v3.5.16 → v3.5.21
-- go.etcd.io/etcd/server/v3: v3.5.16 → v3.5.21
-- golang.org/x/sys: v0.32.0 → v0.33.0
-- google.golang.org/grpc: v1.71.1 → v1.72.0
-- k8s.io/api: v0.32.3 → v0.33.0
-- k8s.io/apiextensions-apiserver: v0.32.3 → v0.33.0
-- k8s.io/apimachinery: v0.32.3 → v0.33.0
-- k8s.io/apiserver: v0.32.3 → v0.33.0
-- k8s.io/cli-runtime: v0.32.3 → v0.33.0
-- k8s.io/client-go: v0.32.3 → v0.33.0
-- k8s.io/cloud-provider: v0.32.3 → v0.33.0
-- k8s.io/cluster-bootstrap: v0.32.3 → v0.33.0
-- k8s.io/code-generator: v0.32.3 → v0.33.0
-- k8s.io/component-base: v0.32.3 → v0.33.0
-- k8s.io/component-helpers: v0.32.3 → v0.33.0
-- k8s.io/controller-manager: v0.32.3 → v0.33.0
-- k8s.io/cri-api: v0.32.3 → v0.33.0
-- k8s.io/cri-client: v0.32.3 → v0.33.0
-- k8s.io/csi-translation-lib: v0.32.3 → v0.33.0
-- k8s.io/dynamic-resource-allocation: v0.32.3 → v0.33.0
-- k8s.io/endpointslice: v0.32.3 → v0.33.0
-- k8s.io/externaljwt: v0.32.3 → v0.33.0
-- k8s.io/gengo/v2: 2b36238 → 1244d31
-- k8s.io/kms: v0.32.3 → v0.33.0
-- k8s.io/kube-aggregator: v0.32.3 → v0.33.0
-- k8s.io/kube-controller-manager: v0.32.3 → v0.33.0
-- k8s.io/kube-proxy: v0.32.3 → v0.33.0
-- k8s.io/kube-scheduler: v0.32.3 → v0.33.0
-- k8s.io/kubectl: v0.32.3 → v0.33.0
-- k8s.io/kubelet: v0.32.3 → v0.33.0
-- k8s.io/kubernetes: v1.32.3 → v1.33.0
-- k8s.io/metrics: v0.32.3 → v0.33.0
-- k8s.io/mount-utils: v0.32.3 → v0.33.0
-- k8s.io/pod-security-admission: v0.32.3 → v0.33.0
-- k8s.io/sample-apiserver: v0.32.3 → v0.33.0
-- k8s.io/utils: 1f6e0b7 → 0f33e8f
-- sigs.k8s.io/kustomize/api: v0.18.0 → v0.19.0
-- sigs.k8s.io/kustomize/kustomize/v5: v5.5.0 → v5.6.0
-- sigs.k8s.io/kustomize/kyaml: v0.18.1 → v0.19.0
-
-### Removed
-- github.com/asaskevich/govalidator: [a9d515a](https://github.com/asaskevich/govalidator/tree/a9d515a)
-- github.com/checkpoint-restore/go-criu/v6: [v6.3.0](https://github.com/checkpoint-restore/go-criu/tree/v6.3.0)
-- github.com/containerd/console: [v1.0.4](https://github.com/containerd/console/tree/v1.0.4)
-- github.com/moby/sys/user: [v0.3.0](https://github.com/moby/sys/tree/user/v0.3.0)
-- github.com/seccomp/libseccomp-golang: [v0.10.0](https://github.com/seccomp/libseccomp-golang/tree/v0.10.0)
-- github.com/syndtr/gocapability: [42c35b4](https://github.com/syndtr/gocapability/tree/42c35b4)
-- github.com/urfave/cli: [v1.22.14](https://github.com/urfave/cli/tree/v1.22.14)
-- go.uber.org/atomic: v1.7.0
-- gopkg.in/square/go-jose.v2: v2.6.0
-
-# 1.42.0
-
-## Changes by Kind
-
-### Other
-
-- Remove controller metrics from the node service. ([#2409](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/2409), [@mdzraf](https://github.com/mdzraf))
-- Add more descriptive Prometheus `HELP` texts to each metric from the controller. ([#2418](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/2418), [@mdzraf](https://github.com/mdzraf))
-
-## Dependencies
-
-### Added
-- github.com/prashantv/gostub: [v1.1.0](https://github.com/prashantv/gostub/tree/v1.1.0)
-- go.uber.org/automaxprocs: v1.6.0
-
-### Changed
-- cel.dev/expr: v0.22.0 → v0.23.1
-- github.com/aws/aws-sdk-go-v2/config: [v1.29.9 → v1.29.13](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.29.9...config/v1.29.13)
-- github.com/aws/aws-sdk-go-v2/credentials: [v1.17.62 → v1.17.66](https://github.com/aws/aws-sdk-go-v2/compare/credentials/v1.17.62...credentials/v1.17.66)
-- github.com/aws/aws-sdk-go-v2/service/ec2: [v1.209.0 → v1.211.2](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.209.0...service/ec2/v1.211.2)
-- github.com/aws/aws-sdk-go-v2/service/sso: [v1.25.1 → v1.25.3](https://github.com/aws/aws-sdk-go-v2/compare/service/sso/v1.25.1...service/sso/v1.25.3)
-- github.com/aws/aws-sdk-go-v2/service/ssooidc: [v1.29.1 → v1.30.1](https://github.com/aws/aws-sdk-go-v2/compare/service/ssooidc/v1.29.1...service/ssooidc/v1.30.1)
-- github.com/aws/aws-sdk-go-v2/service/sts: [v1.33.17 → v1.33.18](https://github.com/aws/aws-sdk-go-v2/compare/service/sts/v1.33.17...service/sts/v1.33.18)
-- github.com/fsnotify/fsnotify: [v1.8.0 → v1.9.0](https://github.com/fsnotify/fsnotify/compare/v1.8.0...v1.9.0)
-- github.com/fxamacker/cbor/v2: [v2.7.0 → v2.8.0](https://github.com/fxamacker/cbor/compare/v2.7.0...v2.8.0)
-- github.com/go-openapi/jsonpointer: [v0.21.0 → v0.21.1](https://github.com/go-openapi/jsonpointer/compare/v0.21.0...v0.21.1)
-- github.com/go-openapi/swag: [v0.23.0 → v0.23.1](https://github.com/go-openapi/swag/compare/v0.23.0...v0.23.1)
-- github.com/google/pprof: [9094ed2 → 27863c8](https://github.com/google/pprof/compare/9094ed2...27863c8)
-- github.com/kubernetes-csi/csi-proxy/client: [v1.2.0 → v1.2.1](https://github.com/kubernetes-csi/csi-proxy/compare/client/v1.2.0...client/v1.2.1)
-- github.com/onsi/ginkgo/v2: [v2.23.0 → v2.23.4](https://github.com/onsi/ginkgo/compare/v2.23.0...v2.23.4)
-- github.com/onsi/gomega: [v1.36.2 → v1.37.0](https://github.com/onsi/gomega/compare/v1.36.2...v1.37.0)
-- github.com/opencontainers/runc: [v1.2.5 → v1.2.6](https://github.com/opencontainers/runc/compare/v1.2.5...v1.2.6)
-- github.com/opencontainers/selinux: [v1.11.1 → v1.12.0](https://github.com/opencontainers/selinux/compare/v1.11.1...v1.12.0)
-- github.com/prometheus/client_golang: [v1.21.1 → v1.22.0](https://github.com/prometheus/client_golang/compare/v1.21.1...v1.22.0)
-- github.com/prometheus/common: [v0.62.0 → v0.63.0](https://github.com/prometheus/common/compare/v0.62.0...v0.63.0)
-- github.com/prometheus/procfs: [v0.15.1 → v0.16.0](https://github.com/prometheus/procfs/compare/v0.15.1...v0.16.0)
-- go.etcd.io/etcd/api/v3: v3.5.19 → v3.5.21
-- go.etcd.io/etcd/client/pkg/v3: v3.5.19 → v3.5.21
-- go.etcd.io/etcd/client/v3: v3.5.19 → v3.5.21
-- golang.org/x/crypto: v0.36.0 → v0.37.0
-- golang.org/x/net: v0.37.0 → v0.39.0
-- golang.org/x/oauth2: v0.28.0 → v0.29.0
-- golang.org/x/sync: v0.12.0 → v0.13.0
-- golang.org/x/sys: v0.31.0 → v0.32.0
-- golang.org/x/term: v0.30.0 → v0.31.0
-- golang.org/x/text: v0.23.0 → v0.24.0
-- golang.org/x/tools: v0.31.0 → v0.32.0
-- google.golang.org/grpc: v1.71.0 → v1.71.1
-- google.golang.org/protobuf: v1.36.5 → v1.36.6
-
 # v1.41.0
 
 ### Note on Deprecated Metrics
diff --git a/Makefile b/Makefile
index 17f09da6..e3a793bf 100644
--- a/Makefile
+++ b/Makefile
@@ -18,7 +18,7 @@
 
 ## Variables/Functions
 
-VERSION?=v1.43.0
+VERSION?=v1.41.0
 
 PKG=github.com/kubernetes-sigs/aws-ebs-csi-driver
 GIT_COMMIT?=$(shell git rev-parse HEAD)
diff --git a/README.md b/README.md
index eaf4525e..3553a243 100644
--- a/README.md
+++ b/README.md
@@ -24,8 +24,8 @@ The [Amazon Elastic Block Store](https://aws.amazon.com/ebs/) Container Storage
 
 | Driver Version | [registry.k8s.io](https://kubernetes.io/blog/2022/11/28/registry-k8s-io-faster-cheaper-ga/) Image | [ECR Public](https://gallery.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver) Image |
 |----------------|---------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|
-| v1.43.0        | registry.k8s.io/provider-aws/aws-ebs-csi-driver:v1.43.0                                           | public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.43.0                      |
-| v1.42.0        | registry.k8s.io/provider-aws/aws-ebs-csi-driver:v1.42.0                                           | public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.42.0                      |
+| v1.41.0        | registry.k8s.io/provider-aws/aws-ebs-csi-driver:v1.41.0                                           | public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.41.0                      |
+| v1.40.1        | registry.k8s.io/provider-aws/aws-ebs-csi-driver:v1.40.1                                           | public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.40.1                      |
 
 ## Releases
 
diff --git a/charts/aws-ebs-csi-driver/CHANGELOG.md b/charts/aws-ebs-csi-driver/CHANGELOG.md
index b676490d..8798ef9e 100644
--- a/charts/aws-ebs-csi-driver/CHANGELOG.md
+++ b/charts/aws-ebs-csi-driver/CHANGELOG.md
@@ -1,17 +1,5 @@
 # Helm chart
 
-## v2.43.0
-
-### Feature
-
-- Bump driver version to `v1.43.0`.
-
-## v2.42.0
-
-### Feature
-
-- Set internal traffic policy to local for node metric service ([#2432](https://github.com/kubernetes-sigs/aws-ebs-csi-driver/pull/2432), [@ElijahQuinones](https://github.com/ElijahQuinones))
-
 ## v2.41.0
 
 ### Feature
diff --git a/charts/aws-ebs-csi-driver/Chart.yaml b/charts/aws-ebs-csi-driver/Chart.yaml
index d7094580..257fa6de 100644
--- a/charts/aws-ebs-csi-driver/Chart.yaml
+++ b/charts/aws-ebs-csi-driver/Chart.yaml
@@ -1,8 +1,8 @@
 apiVersion: v2
-appVersion: 1.43.0
+appVersion: 1.41.0
 name: aws-ebs-csi-driver
 description: A Helm chart for AWS EBS CSI Driver
-version: 2.43.0
+version: 2.41.0
 kubeVersion: ">=1.17.0-0"
 home: https://github.com/kubernetes-sigs/aws-ebs-csi-driver
 sources:
diff --git a/cmd/main.go b/cmd/main.go
index 7f3ca310..321f434a 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -159,12 +159,10 @@ func main() {
 		r.InitializeMetricsHandler(options.HTTPEndpoint, "/metrics", options.MetricsCertFile, options.MetricsKeyFile)
 
 		if options.Mode == driver.ControllerMode || options.Mode == driver.AllMode {
-			// TODO inject metrics in cloud for clean unit tests
 			r.InitializeAPIMetrics(options.DeprecatedMetrics)
-			r.InitializeAsyncEC2Metrics(60 * time.Second /* Don't emit metrics for detaches that take < 60s */)
 		}
 		if options.Mode == driver.NodeMode || options.Mode == driver.AllMode {
-			r.InitializeNVME(options.CsiMountPointPath, md.GetInstanceID())
+			metrics.InitializeNVME(r, options.CsiMountPointPath, md.GetInstanceID())
 		}
 	}
 
diff --git a/deploy/kubernetes/base/controller.yaml b/deploy/kubernetes/base/controller.yaml
index b6b81384..22b08984 100644
--- a/deploy/kubernetes/base/controller.yaml
+++ b/deploy/kubernetes/base/controller.yaml
@@ -64,7 +64,7 @@ spec:
         runAsUser: 1000
       containers:
         - name: ebs-plugin
-          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.43.0
+          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.41.0
           imagePullPolicy: IfNotPresent
           args:
             - controller
diff --git a/deploy/kubernetes/base/node-windows.yaml b/deploy/kubernetes/base/node-windows.yaml
index 67d6e566..c2461eb4 100644
--- a/deploy/kubernetes/base/node-windows.yaml
+++ b/deploy/kubernetes/base/node-windows.yaml
@@ -50,7 +50,7 @@ spec:
         - operator: Exists
       containers:
         - name: ebs-plugin
-          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.43.0
+          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.41.0
           imagePullPolicy: IfNotPresent
           args:
             - node
diff --git a/deploy/kubernetes/base/node.yaml b/deploy/kubernetes/base/node.yaml
index d7b56785..13f92a3b 100644
--- a/deploy/kubernetes/base/node.yaml
+++ b/deploy/kubernetes/base/node.yaml
@@ -56,7 +56,7 @@ spec:
         runAsUser: 0
       containers:
         - name: ebs-plugin
-          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.43.0
+          image: public.ecr.aws/ebs-csi-driver/aws-ebs-csi-driver:v1.41.0
           imagePullPolicy: IfNotPresent
           args:
             - node
diff --git a/docs/install.md b/docs/install.md
index d5c8cdbf..25ead345 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -127,7 +127,7 @@ You may deploy the EBS CSI driver via Kustomize, Helm, or as an [Amazon EKS mana
 
 #### Kustomize
 ```sh
-kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.43"
+kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.41"
 ```
 
 *Note: Using the master branch to deploy the driver is not supported as the master branch may contain upcoming features incompatible with the currently released stable version of the driver.*
diff --git a/docs/metrics.md b/docs/metrics.md
index 7a8dee23..f7e9fb29 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -25,12 +25,11 @@ The EBS CSI Driver will emit [AWS API](https://docs.aws.amazon.com/AWSEC2/latest
 
 The following metrics are currently supported:
 
-| Metric name | Metric type | Description | Labels                                                                                                                                                                     |
-|-------------|-------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-|aws_ebs_csi_api_request_duration_seconds|Histogram|Duration by request type in seconds| request=\<AWS SDK API Request Type\> <br/> le=\<Time In Seconds\>                                                                                                          | 
-|aws_ebs_csi_api_request_errors_total|Counter|Total number of errors by error code and request type| request=\<AWS SDK API Request Type\> <br/> error=\<Error Code\>                                                                                                            | 
-|aws_ebs_csi_api_request_throttles_total|Counter|Total number of throttled requests per request type| request=\<AWS SDK API Request Type\>                                                                                                                                       |
-|aws_ebs_csi_ec2_detach_pending_seconds|Counter|Number of seconds csi driver has been waiting for volume to be detached from instance| attachment_state=<Last observed attachment state\><br/>volume_id=<EBS Volume ID of associated volume\><br/>instance_id=<EC2 Instance ID associated with detaching volume\> |
+| Metric name | Metric type | Description | Labels |
+|-------------|-------------|-------------|-------------|
+|aws_ebs_csi_api_request_duration_seconds|Histogram|Duration by request type in seconds|request=\<AWS SDK API Request Type\> <br/> le=\<Time In Seconds\>| 
+|aws_ebs_csi_api_request_errors_total|Counter|Total number of errors by error code and request type|request=\<AWS SDK API Request Type\> <br/> error=\<Error Code\>| 
+|aws_ebs_csi_api_request_throttles_total|Counter|Total number of throttled requests per request type|request=\<AWS SDK API Request Type\>|
 
 The metrics will appear in the following format: 
 ```sh
diff --git a/docs/parameters.md b/docs/parameters.md
index 660eeeba..5790d6c5 100644
--- a/docs/parameters.md
+++ b/docs/parameters.md
@@ -5,24 +5,23 @@ There are several optional parameters that may be passed into `CreateVolumeReque
 
 The AWS EBS CSI Driver supports [tagging](tagging.md) through `StorageClass.parameters` (in v1.6.0 and later). 
 
-| Parameters                   | Values                                          | Default | Description                                                                                                                                                                                                                                                                                                                                                                                   |
-|------------------------------|-------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| "csi.storage.k8s.io/fstype"  | xfs, ext3, ext4                            | ext4    | File system type that will be formatted during volume creation. This parameter is case sensitive!                                                                                                                                                                                                                                                                                             |
-| "type"                       | io1, io2, gp2, gp3, sc1, st1, standard | gp3*    | EBS volume type.                                                                                                                                                                                                                                                                                                                                                                              |
-| "iopsPerGB"                  |                                                 |         | I/O operations per second per GiB. Can be specified for IO1, IO2, and GP3 volumes.                                                                                                                                                                                                                                                                                                            |
-| "allowAutoIOPSPerGBIncrease" | true, false                                     | false   | When `"true"`, the CSI driver increases IOPS for a volume when `iopsPerGB * <volume size>` is too low to fit into IOPS range supported by AWS. This allows dynamic provisioning to always succeed, even when user specifies too small PVC capacity or `iopsPerGB` value. On the other hand, it may introduce additional costs, as such volumes have higher IOPS than requested in `iopsPerGB`. |
-| "iops"                       |                                                 |         | I/O operations per second. Can be specified for IO1, IO2, and GP3 volumes.                                                                                                                                                                                                                                                                                                                    |
-| "throughput"                 |                                                 | 125     | Throughput in MiB/s. Only effective when gp3 volume type is specified. If empty, it will set to 125MiB/s as documented [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html).                                                                                                                                                                                     |
-| "encrypted"                  | true, false                                     | false   | Whether the volume should be encrypted or not. Valid values are "true" or "false".                                                                                                                                                                                                                                                                                                            |
-| "blockExpress"               | true, false                                     | false   | Enables the creation of [io2 Block Express volumes](https://aws.amazon.com/ebs/provisioned-iops/#Introducing_io2_Block_Express) by increasing the IOPS limit for io2 volumes to 256000. Volumes created with more than 64000 IOPS will fail to mount on instances that do not support io2 Block Express.                                                                                      |
-| "kmsKeyId"                   |                                                 |         | The full ARN of the key to use when encrypting the volume. If not specified, AWS will use the default KMS key for the region the volume is in. This will be an auto-generated key called `/aws/ebs` if not changed.                                                                                                                                                                           |
-| "blockSize"                  |                                                 |         | The block size to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`, or `xfs`.                                                                                                                                                                                                                                               |
-| "inodeSize"                  |                                                 |         | The inode size to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`, or `xfs`.                                                                                                                                                                                                                                              |
-| "bytesPerInode"              |                                                 |         | The `bytes-per-inode` to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`.                                                                                                                                                                                                                                                 |
-| "numberOfInodes"             |                                                 |         | The `number-of-inodes` to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`.                                                                                                                                                                                                                                                |
-| "ext4BigAlloc"               | true, false                                     | false   | Changes the `ext4` filesystem to use clustered block allocation by enabling the `bigalloc` formatting option. Warning: `bigalloc` may not be fully supported with your node's Linux kernel. Please see our [FAQ](/docs/faq.md).                                                                                                                                                               |
-| "ext4ClusterSize"            |                                                 |         | The cluster size to use when formatting an `ext4` filesystem when the `bigalloc` feature is enabled. Note: The `ext4BigAlloc` parameter must be set to true. See our [FAQ](/docs/faq.md).                                                                                                                                                                                                     |
-| "volumeInitializationRate"   | integer                                           |         |  When creating a volume from a snapshot, this parameter can be used to request a provisioned initialization rate, in MiB/s.                             |
+| Parameters                   | Values                                            | Default | Description                                                                                                                                                                                                                                                                                                                                                                                   |
+|------------------------------|---------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| "csi.storage.k8s.io/fstype"  | xfs, ext3, ext4                              | ext4    | File system type that will be formatted during volume creation. This parameter is case sensitive!                                                                                                                                                                                                                                                                                             |
+| "type"                       | io1, io2, gp2, gp3, sc1, st1, standard, sbp1, sbg1 | gp3*    | EBS volume type.                                                                                                                                                                                                                                                                                                                                                                              |
+| "iopsPerGB"                  |                                                   |         | I/O operations per second per GiB. Can be specified for IO1, IO2, and GP3 volumes.                                                                                                                                                                                                                                                                                                            |
+| "allowAutoIOPSPerGBIncrease" | true, false                                       | false   | When `"true"`, the CSI driver increases IOPS for a volume when `iopsPerGB * <volume size>` is too low to fit into IOPS range supported by AWS. This allows dynamic provisioning to always succeed, even when user specifies too small PVC capacity or `iopsPerGB` value. On the other hand, it may introduce additional costs, as such volumes have higher IOPS than requested in `iopsPerGB`. |
+| "iops"                       |                                                   |         | I/O operations per second. Can be specified for IO1, IO2, and GP3 volumes.                                                                                                                                                                                                                                                                                                                    |
+| "throughput"                 |                                                   | 125     | Throughput in MiB/s. Only effective when gp3 volume type is specified. If empty, it will set to 125MiB/s as documented [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html).                                                                                                                                                                                     |
+| "encrypted"                  | true, false                                       | false   | Whether the volume should be encrypted or not. Valid values are "true" or "false".                                                                                                                                                                                                                                                                                                            |
+| "blockExpress"               | true, false                                       | false   | Enables the creation of [io2 Block Express volumes](https://aws.amazon.com/ebs/provisioned-iops/#Introducing_io2_Block_Express) by increasing the IOPS limit for io2 volumes to 256000. Volumes created with more than 64000 IOPS will fail to mount on instances that do not support io2 Block Express.                                                                                      |
+| "kmsKeyId"                   |                                                   |         | The full ARN of the key to use when encrypting the volume. If not specified, AWS will use the default KMS key for the region the volume is in. This will be an auto-generated key called `/aws/ebs` if not changed.                                                                                                                                                                           |
+| "blockSize"                  |                                                   |         | The block size to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`, or `xfs`.                                                                                                                                                                                                                                               |
+| "inodeSize"                  |                                                   |         | The inode size to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`, or `xfs`.                                                                                                                                                                                                                                              |
+| "bytesPerInode"              |                                                   |         | The `bytes-per-inode` to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`.                                                                                                                                                                                                                                                 |
+| "numberOfInodes"             |                                                   |         | The `number-of-inodes` to use when formatting the underlying filesystem. Only supported on linux nodes and with fstype `ext3`, `ext4`.                                                                                                                                                                                                                                                |
+| "ext4BigAlloc"               | true, false                                       | false   | Changes the `ext4` filesystem to use clustered block allocation by enabling the `bigalloc` formatting option. Warning: `bigalloc` may not be fully supported with your node's Linux kernel. Please see our [FAQ](/docs/faq.md).                                                                                                                                                               |
+| "ext4ClusterSize"            |                                                   |         | The cluster size to use when formatting an `ext4` filesystem when the `bigalloc` feature is enabled. Note: The `ext4BigAlloc` parameter must be set to true. See our [FAQ](/docs/faq.md).                                                                                                                                                                                                     |
 
 ## Restrictions
 * `gp3` is currently not supported on outposts. Outpost customers need to use a different type for their volumes.
diff --git a/go.mod b/go.mod
index 0025421b..015faa05 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ require (
 	github.com/aws/aws-sdk-go-v2 v1.36.3
 	github.com/aws/aws-sdk-go-v2/config v1.29.14
 	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30
-	github.com/aws/aws-sdk-go-v2/service/ec2 v1.215.0
+	github.com/aws/aws-sdk-go-v2/service/ec2 v1.211.3
 	github.com/aws/smithy-go v1.22.3
 	github.com/awslabs/volume-modifier-for-k8s v0.5.1
 	github.com/container-storage-interface/spec v1.11.0
@@ -18,7 +18,6 @@ require (
 	github.com/onsi/ginkgo/v2 v2.23.4
 	github.com/onsi/gomega v1.37.0
 	github.com/prometheus/client_golang v1.22.0
-	github.com/prometheus/common v0.63.0
 	github.com/spf13/pflag v1.0.6
 	github.com/stretchr/testify v1.10.0
 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0
@@ -26,25 +25,27 @@ require (
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0
 	go.opentelemetry.io/otel/sdk v1.35.0
-	golang.org/x/sys v0.33.0
-	google.golang.org/grpc v1.72.0
+	golang.org/x/sys v0.32.0
+	google.golang.org/grpc v1.71.1
 	google.golang.org/protobuf v1.36.6
-	k8s.io/api v0.33.0
-	k8s.io/apimachinery v0.33.0
+	k8s.io/api v0.32.3
+	k8s.io/apimachinery v0.32.3
 	k8s.io/client-go v1.5.2
-	k8s.io/component-base v0.33.0
+	k8s.io/component-base v0.32.3
 	k8s.io/klog/v2 v2.130.1
-	k8s.io/kubernetes v1.33.0
-	k8s.io/mount-utils v0.33.0
-	k8s.io/pod-security-admission v0.33.0
-	k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979
+	k8s.io/kubernetes v1.32.3
+	k8s.io/mount-utils v0.32.3
+	k8s.io/pod-security-admission v0.32.3
+	k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e
 )
 
 require (
 	cel.dev/expr v0.23.1 // indirect
 	github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab // indirect
 	github.com/Microsoft/go-winio v0.6.2 // indirect
+	github.com/NYTimes/gziphandler v1.1.1 // indirect
 	github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
 	github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect
 	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
 	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
@@ -64,6 +65,7 @@ require (
 	github.com/containerd/log v0.1.0 // indirect
 	github.com/containerd/ttrpc v1.2.7 // indirect
 	github.com/containerd/typeurl/v2 v2.2.3 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
 	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
 	github.com/cyphar/filepath-securejoin v0.4.1 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -83,11 +85,15 @@ require (
 	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/protobuf v1.5.4 // indirect
+	github.com/google/btree v1.1.3 // indirect
 	github.com/google/cadvisor v0.52.1 // indirect
-	github.com/google/cel-go v0.23.2 // indirect
+	github.com/google/cel-go v0.22.1 // indirect
 	github.com/google/gnostic-models v0.6.9 // indirect
+	github.com/google/gofuzz v1.2.0 // indirect
 	github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
-	github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
+	github.com/gorilla/websocket v1.5.3 // indirect
+	github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
 	github.com/inconshreveable/mousetrap v1.1.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
@@ -103,55 +109,62 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
-	github.com/opencontainers/cgroups v0.0.2 // indirect
+	github.com/opencontainers/cgroups v0.0.1 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.1.1 // indirect
+	github.com/opencontainers/runc v1.2.6 // indirect
 	github.com/opencontainers/runtime-spec v1.2.1 // indirect
 	github.com/opencontainers/selinux v1.12.0 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/prometheus/client_model v0.6.2 // indirect
-	github.com/prometheus/procfs v0.16.1 // indirect
+	github.com/prometheus/common v0.63.0 // indirect
+	github.com/prometheus/procfs v0.16.0 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/spf13/cobra v1.9.1 // indirect
 	github.com/stoewer/go-strcase v1.3.0 // indirect
 	github.com/x448/float16 v0.8.4 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.21 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.21 // indirect
 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
 	go.opentelemetry.io/otel/metric v1.35.0 // indirect
 	go.opentelemetry.io/otel/trace v1.35.0 // indirect
-	go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 	go.uber.org/automaxprocs v1.6.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	go.uber.org/zap v1.27.0 // indirect
-	golang.org/x/crypto v0.38.0 // indirect
+	golang.org/x/crypto v0.37.0 // indirect
 	golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
-	golang.org/x/net v0.40.0 // indirect
-	golang.org/x/oauth2 v0.30.0 // indirect
-	golang.org/x/sync v0.14.0 // indirect
-	golang.org/x/term v0.32.0 // indirect
-	golang.org/x/text v0.25.0 // indirect
+	golang.org/x/net v0.39.0 // indirect
+	golang.org/x/oauth2 v0.29.0 // indirect
+	golang.org/x/sync v0.13.0 // indirect
+	golang.org/x/term v0.31.0 // indirect
+	golang.org/x/text v0.24.0 // indirect
 	golang.org/x/time v0.11.0 // indirect
-	golang.org/x/tools v0.33.0 // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect
+	golang.org/x/tools v0.32.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250409194420-de1ac958c67a // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a // 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
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	k8s.io/apiextensions-apiserver v0.33.0 // indirect
-	k8s.io/apiserver v0.33.0 // indirect
-	k8s.io/cloud-provider v0.33.0 // indirect
-	k8s.io/component-helpers v0.33.0 // indirect
-	k8s.io/controller-manager v0.33.0 // indirect
-	k8s.io/cri-api v0.33.0 // indirect
-	k8s.io/cri-client v0.33.0 // indirect
-	k8s.io/csi-translation-lib v0.33.0 // indirect
-	k8s.io/dynamic-resource-allocation v0.33.0 // indirect
+	k8s.io/apiextensions-apiserver v0.32.3 // indirect
+	k8s.io/apiserver v0.32.3 // indirect
+	k8s.io/cloud-provider v0.32.3 // indirect
+	k8s.io/component-helpers v0.32.3 // indirect
+	k8s.io/controller-manager v0.32.3 // indirect
+	k8s.io/cri-api v0.32.3 // indirect
+	k8s.io/cri-client v0.32.3 // indirect
+	k8s.io/csi-translation-lib v0.32.3 // indirect
+	k8s.io/dynamic-resource-allocation v0.32.3 // indirect
+	k8s.io/kms v0.32.3 // indirect
 	k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
-	k8s.io/kube-scheduler v0.33.0 // indirect
-	k8s.io/kubectl v0.33.0 // indirect
-	k8s.io/kubelet v0.33.0 // indirect
+	k8s.io/kube-scheduler v0.32.3 // indirect
+	k8s.io/kubectl v0.32.3 // indirect
+	k8s.io/kubelet v0.32.3 // indirect
 	sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.32.0 // indirect
 	sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
 	sigs.k8s.io/randfill v1.0.0 // indirect
@@ -160,36 +173,36 @@ require (
 )
 
 replace (
-	k8s.io/api => k8s.io/api v0.33.0
-	k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.33.0
-	k8s.io/apimachinery => k8s.io/apimachinery v0.33.0
-	k8s.io/apiserver => k8s.io/apiserver v0.33.0
-	k8s.io/cli-runtime => k8s.io/cli-runtime v0.33.0
-	k8s.io/client-go => k8s.io/client-go v0.33.0
-	k8s.io/cloud-provider => k8s.io/cloud-provider v0.33.0
-	k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.33.0
-	k8s.io/code-generator => k8s.io/code-generator v0.33.0
-	k8s.io/component-base => k8s.io/component-base v0.33.0
-	k8s.io/controller-manager => k8s.io/controller-manager v0.33.0
-	k8s.io/cri-api => k8s.io/cri-api v0.33.0
-	k8s.io/cri-client => k8s.io/cri-client v0.33.0
-	k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.33.0
-	k8s.io/endpointslice => k8s.io/endpointslice v0.33.0
-	k8s.io/externaljwt => k8s.io/externaljwt v0.33.0
-	k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.33.0
-	k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.33.0
-	k8s.io/kube-proxy => k8s.io/kube-proxy v0.33.0
-	k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.33.0
-	k8s.io/kubectl => k8s.io/kubectl v0.33.0
-	k8s.io/kubelet => k8s.io/kubelet v0.33.0
-	k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.33.0
-	k8s.io/metrics => k8s.io/metrics v0.33.0
-	k8s.io/mount-utils => k8s.io/mount-utils v0.33.0
-	k8s.io/node-api => k8s.io/node-api v0.33.0
-	k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.33.0
-	k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.33.0
-	k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.33.0
-	k8s.io/sample-controller => k8s.io/sample-controller v0.33.0
+	k8s.io/api => k8s.io/api v0.32.3
+	k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.32.3
+	k8s.io/apimachinery => k8s.io/apimachinery v0.32.3
+	k8s.io/apiserver => k8s.io/apiserver v0.32.3
+	k8s.io/cli-runtime => k8s.io/cli-runtime v0.32.3
+	k8s.io/client-go => k8s.io/client-go v0.32.3
+	k8s.io/cloud-provider => k8s.io/cloud-provider v0.32.3
+	k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.32.3
+	k8s.io/code-generator => k8s.io/code-generator v0.32.3
+	k8s.io/component-base => k8s.io/component-base v0.32.3
+	k8s.io/controller-manager => k8s.io/controller-manager v0.32.3
+	k8s.io/cri-api => k8s.io/cri-api v0.32.3
+	k8s.io/cri-client => k8s.io/cri-client v0.32.3
+	k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.32.3
+	k8s.io/endpointslice => k8s.io/endpointslice v0.32.3
+	k8s.io/externaljwt => k8s.io/externaljwt v0.32.3
+	k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.32.3
+	k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.32.3
+	k8s.io/kube-proxy => k8s.io/kube-proxy v0.32.3
+	k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.32.3
+	k8s.io/kubectl => k8s.io/kubectl v0.32.3
+	k8s.io/kubelet => k8s.io/kubelet v0.32.3
+	k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.32.3
+	k8s.io/metrics => k8s.io/metrics v0.32.3
+	k8s.io/mount-utils => k8s.io/mount-utils v0.32.3
+	k8s.io/node-api => k8s.io/node-api v0.32.3
+	k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.32.3
+	k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.32.3
+	k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.32.3
+	k8s.io/sample-controller => k8s.io/sample-controller v0.32.3
 	vbom.ml/util => github.com/fvbommel/util v0.0.2 // Mitigate https://github.com/fvbommel/util/issues/6
 )
 
diff --git a/go.sum b/go.sum
index 07203671..47568465 100644
--- a/go.sum
+++ b/go.sum
@@ -9,11 +9,15 @@ github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5
 github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
 github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
 github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
 github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
 github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
 github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
 github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
 github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM=
@@ -28,8 +32,8 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0io
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
-github.com/aws/aws-sdk-go-v2/service/ec2 v1.215.0 h1:6a5U/gnVIPWWtS2CCdOkrxos3Se8IL9jNMJLyD4BEU8=
-github.com/aws/aws-sdk-go-v2/service/ec2 v1.215.0/go.mod h1:ouvGEfHbLaIlWwpDpOVWPWR+YwO0HDv3vm5tYLq8ImY=
+github.com/aws/aws-sdk-go-v2/service/ec2 v1.211.3 h1:4dPHqFVVvFG+ntkVUXrMrY55+E5dzFfEpjFWdkdSxnc=
+github.com/aws/aws-sdk-go-v2/service/ec2 v1.211.3/go.mod h1:ouvGEfHbLaIlWwpDpOVWPWR+YwO0HDv3vm5tYLq8ImY=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
@@ -78,6 +82,8 @@ github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRq
 github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o=
 github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40=
 github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk=
+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=
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
@@ -96,6 +102,8 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj
 github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
 github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+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/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
 github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
 github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
@@ -151,6 +159,8 @@ 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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
@@ -170,11 +180,14 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 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.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
+github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
 github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
 github.com/google/cadvisor v0.52.1 h1:sC8SZ6jio9ds+P2dk51bgbeYeufxo55n0X3tmrpA9as=
 github.com/google/cadvisor v0.52.1/go.mod h1:OAhPcx1nOm5YwMh/JhpUOMKyv1YKLRtS9KgzWPndHmA=
-github.com/google/cel-go v0.23.2 h1:UdEe3CvQh3Nv+E/j9r1Y//WO0K0cSyD7/y0bzyLIMI4=
-github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=
+github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40=
+github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8=
+github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
 github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -189,6 +202,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
 github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
@@ -199,9 +214,16 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 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.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
-github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 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=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@@ -209,6 +231,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:
 github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
+github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
 github.com/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=
@@ -313,12 +337,14 @@ github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1
 github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
 github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
 github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
-github.com/opencontainers/cgroups v0.0.2 h1:A+mAPPMfgKNCEZUUtibESFx06uvhAmvo8sSz3Abwk7o=
-github.com/opencontainers/cgroups v0.0.2/go.mod h1:s8lktyhlGUqM7OSRL5P7eAW6Wb+kWPNvt4qvVfzA5vs=
+github.com/opencontainers/cgroups v0.0.1 h1:MXjMkkFpKv6kpuirUa4USFBas573sSAY082B4CiHEVA=
+github.com/opencontainers/cgroups v0.0.1/go.mod h1:s8lktyhlGUqM7OSRL5P7eAW6Wb+kWPNvt4qvVfzA5vs=
 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/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
 github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
+github.com/opencontainers/runc v1.2.6 h1:P7Hqg40bsMvQGCS4S7DJYhUZOISMLJOB2iGX5COWiPk=
+github.com/opencontainers/runc v1.2.6/go.mod h1:dOQeFo29xZKBNeRBI0B19mJtfHv68YgCTh1X+YphA+4=
 github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww=
 github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
 github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8=
@@ -340,8 +366,8 @@ github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNw
 github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
 github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
 github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
-github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
-github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM=
+github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
@@ -350,6 +376,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
+github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
 github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
 github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -375,13 +403,33 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE=
+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-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk=
+github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+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.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8=
+go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY=
+go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc=
+go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs=
+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.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY=
+go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU=
+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/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
@@ -402,8 +450,8 @@ go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5J
 go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
 go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
 go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
 go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
 go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -427,13 +475,11 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf
 golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
-golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
 golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
-golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
+golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
@@ -455,7 +501,6 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
@@ -495,18 +540,16 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
 golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
-golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
 golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
 golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
 golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
-golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
+golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
-golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
-golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
+golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
 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/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -522,9 +565,8 @@ golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
+golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -569,14 +611,12 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
-golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
+golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
 golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -598,13 +638,11 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
 golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
 golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
-golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
 golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
 golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
 golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
-golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
+golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -623,11 +661,10 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
 golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
-golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
-golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
+golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
 golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -655,12 +692,11 @@ golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps
 golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
 golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
-golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
 golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
 golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
 golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
-golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
+golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -670,17 +706,19 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
 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/googleapis/api v0.0.0-20250428153025-10db94c68c34 h1:0PeQib/pH3nB/5pEmFeVQJotzGohV0dq4Vcp09H5yhE=
-google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 h1:h6p3mQqrmT1XkHVTfzLdNz1u7IhINeZkz67/xTbOuWs=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+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-20250409194420-de1ac958c67a h1:OQ7sHVzkx6L57dQpzUS4ckfWJ51KDH74XHTDe23xWAs=
+google.golang.org/genproto/googleapis/api v0.0.0-20250409194420-de1ac958c67a/go.mod h1:2R6XrVC8Oc08GlNh8ujEpc7HkLiEZ16QeY7FxIs20ac=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a h1:GIqLhp/cYUkuGuiT+vJk8vhOP86L4+SP5j8yXgeVpvI=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
 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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
-google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI=
+google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
 google.golang.org/protobuf 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=
@@ -692,11 +730,12 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
 google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -708,6 +747,8 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWM
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -715,62 +756,66 @@ gopkg.in/yaml.v2 v2.3.0/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.0-20210107192922-496545a6307b/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=
 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.33.0 h1:yTgZVn1XEe6opVpP1FylmNrIFWuDqe2H0V8CT5gxfIU=
-k8s.io/api v0.33.0/go.mod h1:CTO61ECK/KU7haa3qq8sarQ0biLq2ju405IZAd9zsiM=
-k8s.io/apiextensions-apiserver v0.33.0 h1:d2qpYL7Mngbsc1taA4IjJPRJ9ilnsXIrndH+r9IimOs=
-k8s.io/apiextensions-apiserver v0.33.0/go.mod h1:VeJ8u9dEEN+tbETo+lFkwaaZPg6uFKLGj5vyNEwwSzc=
-k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ=
-k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apiserver v0.33.0 h1:QqcM6c+qEEjkOODHppFXRiw/cE2zP85704YrQ9YaBbc=
-k8s.io/apiserver v0.33.0/go.mod h1:EixYOit0YTxt8zrO2kBU7ixAtxFce9gKGq367nFmqI8=
-k8s.io/client-go v0.33.0 h1:UASR0sAYVUzs2kYuKn/ZakZlcs2bEHaizrrHUZg0G98=
-k8s.io/client-go v0.33.0/go.mod h1:kGkd+l/gNGg8GYWAPr0xF1rRKvVWvzh9vmZAMXtaKOg=
-k8s.io/cloud-provider v0.33.0 h1:nVU2Q9QK7O50yaNx+pE61oDPqflsSsKygN43f5js9+I=
-k8s.io/cloud-provider v0.33.0/go.mod h1:2reyEBbsimZJKHF325vxLBD5fcJGNeJHeLjJ+jGM8Qg=
-k8s.io/code-generator v0.33.0/go.mod h1:KnJRokGxjvbBQkSJkbVuBbu6z4B0rC7ynkpY5Aw6m9o=
-k8s.io/component-base v0.33.0 h1:Ot4PyJI+0JAD9covDhwLp9UNkUja209OzsJ4FzScBNk=
-k8s.io/component-base v0.33.0/go.mod h1:aXYZLbw3kihdkOPMDhWbjGCO6sg+luw554KP51t8qCU=
-k8s.io/component-helpers v0.33.0 h1:0AdW0A0mIgljLgtG0hJDdJl52PPqTrtMgOgtm/9i/Ys=
-k8s.io/component-helpers v0.33.0/go.mod h1:9SRiXfLldPw9lEEuSsapMtvT8j/h1JyFFapbtybwKvU=
-k8s.io/controller-manager v0.33.0 h1:O9LnTjffOe62d66gMcKLuPXsBjY5sqETWEIzg+DVL8w=
-k8s.io/controller-manager v0.33.0/go.mod h1:vQwAQnroav4+UyE2acW1Rj6CSsHPzr2/018kgRLYqlI=
-k8s.io/cri-api v0.33.0 h1:YyGNgWmuSREqFPlP3XCstlHLilYdW898KwtKoaTYwBs=
-k8s.io/cri-api v0.33.0/go.mod h1:OLQvT45OpIA+tv91ZrpuFIGY+Y2Ho23poS7n115Aocs=
-k8s.io/cri-client v0.33.0 h1:NLB4SKWQqJ2jPtbbdKFY2gEEw/GKSKifSqUf4m/SwSs=
-k8s.io/cri-client v0.33.0/go.mod h1:ZIbzmm5ByB0cz0nc5qUlgKZwi1KivOGVXgearqF27cU=
-k8s.io/csi-translation-lib v0.33.0 h1:kW3xVPCTXmHmK5v/8PEVZCUZSdNRndiQat0SbN31qEM=
-k8s.io/csi-translation-lib v0.33.0/go.mod h1:Ldx85t1WxFStKQ2p5Xaimv39IkTc7/m8yNMkt8MlyoQ=
-k8s.io/dynamic-resource-allocation v0.33.0 h1:/b04omcFsLBf2vqh/t1aXhj8fs2eHgKIZzUS/y3Z2qo=
-k8s.io/dynamic-resource-allocation v0.33.0/go.mod h1:BHw7vU8bheqj6sdz31gETuvjQkNOcEleBTnrJ9j8vA8=
+k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
+k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
+k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
+k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
+k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
+k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
+k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8=
+k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc=
+k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
+k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
+k8s.io/cloud-provider v0.32.3 h1:WC7KhWrqXsU4b0E4tjS+nBectGiJbr1wuc1TpWXvtZM=
+k8s.io/cloud-provider v0.32.3/go.mod h1:/fwBfgRPuh16n8vLHT+PPT+Bc4LAEaJYj38opO2wsYY=
+k8s.io/code-generator v0.32.3/go.mod h1:+mbiYID5NLsBuqxjQTygKM/DAdKpAjvBzrJd64NU1G8=
+k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k=
+k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI=
+k8s.io/component-helpers v0.32.3 h1:9veHpOGTPLluqU4hAu5IPOwkOIZiGAJUhHndfVc5FT4=
+k8s.io/component-helpers v0.32.3/go.mod h1:utTBXk8lhkJewBKNuNf32Xl3KT/0VV19DmiXU/SV4Ao=
+k8s.io/controller-manager v0.32.3 h1:jBxZnQ24k6IMeWLyxWZmpa3QVS7ww+osAIzaUY/jqyc=
+k8s.io/controller-manager v0.32.3/go.mod h1:out1L3DZjE/p7JG0MoMMIaQGWIkt3c+pKaswqSHgKsI=
+k8s.io/cri-api v0.32.3 h1:E8VXbXNn4yAgmuKTeNzg0C1MFSxzTdlHSwUvjuYlPTY=
+k8s.io/cri-api v0.32.3/go.mod h1:DCzMuTh2padoinefWME0G678Mc3QFbLMF2vEweGzBAI=
+k8s.io/cri-client v0.32.3 h1:+D2ajlFpXsUcr/9ofYcE5kVqVK4Q97wnZHeH80oDEzw=
+k8s.io/cri-client v0.32.3/go.mod h1:W1+Z8QsVnLkoGqtJ41B5SRHfQn6/mqGORdfNDl2cEkw=
+k8s.io/csi-translation-lib v0.32.3 h1:fKdc9LMVEMk18xsgoPm1Ga8GjfhI7AM3UX8gnIeXZKs=
+k8s.io/csi-translation-lib v0.32.3/go.mod h1:VX6+hCKgQyFnUX3VrnXZAgYYBXkrqx4BZk9vxr9qRcE=
+k8s.io/dynamic-resource-allocation v0.32.3 h1:O4wDtJjwq8IVS2DHVrs/BDPdcFeoLlCNZP7wU3f0I2c=
+k8s.io/dynamic-resource-allocation v0.32.3/go.mod h1:ei9nf36kdieNHJqLf1eoKfhwMHMTFCkdngJQSiI9xEs=
 k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
-k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
+k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
 k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
+k8s.io/kms v0.32.3 h1:HhHw5+pRCzEJp3oFFJ1q5W2N6gAI7YkUg4ay4Z0dgwM=
+k8s.io/kms v0.32.3/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM=
+k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/kube-scheduler v0.33.0 h1:G5psn7ynB5Vjfo0ia8uz32Gv46TRa5RgTq4PTm+yjR0=
-k8s.io/kube-scheduler v0.33.0/go.mod h1:I+0aqwJ3G9f9pyfKfoN5b0uP9M6MinNpxXRlCXkM17E=
-k8s.io/kubectl v0.33.0 h1:HiRb1yqibBSCqic4pRZP+viiOBAnIdwYDpzUFejs07g=
-k8s.io/kubectl v0.33.0/go.mod h1:gAlGBuS1Jq1fYZ9AjGWbI/5Vk3M/VW2DK4g10Fpyn/0=
-k8s.io/kubelet v0.33.0 h1:4pJA2Ge6Rp0kDNV76KH7pTBiaV2T1a1874QHMcubuSU=
-k8s.io/kubelet v0.33.0/go.mod h1:iDnxbJQMy9DUNaML5L/WUlt3uJtNLWh7ZAe0JSp4Yi0=
-k8s.io/kubernetes v1.33.0 h1:BP5Y5yIzUZVeBuE/ESZvnw6TNxjXbLsCckIkljE+R0U=
-k8s.io/kubernetes v1.33.0/go.mod h1:2nWuPk0seE4+6sd0x60wQ6rYEXcV7SoeMbU0YbFm/5k=
-k8s.io/mount-utils v0.33.0 h1:hH6EcCcax4lFNIERaGMj6d7oGMW1qW3eTCwHUuLtLog=
-k8s.io/mount-utils v0.33.0/go.mod h1:1JR4rKymg8B8bCPo618hpSAdrpO6XLh0Acqok/xVwPE=
-k8s.io/pod-security-admission v0.33.0 h1:di/iicB5plCq+iQeqgf2s1N5DOSzTDiOOv5OiAbuYWE=
-k8s.io/pod-security-admission v0.33.0/go.mod h1:McuUMtSclLNxQdCkDTTWqKR79jnpHT/022GuanVU/Wg=
+k8s.io/kube-scheduler v0.32.3 h1:DAd1w9Vuj0VxQVIe6XErHKrF1RS7Jyu9Hgu9yHyTknI=
+k8s.io/kube-scheduler v0.32.3/go.mod h1:aHEWAFq7bc85PInPB88nX3ZLwQGjVn+v4y8f66xVXD0=
+k8s.io/kubectl v0.32.3 h1:VMi584rbboso+yjfv0d8uBHwwxbC438LKq+dXd5tOAI=
+k8s.io/kubectl v0.32.3/go.mod h1:6Euv2aso5GKzo/UVMacV6C7miuyevpfI91SvBvV9Zdg=
+k8s.io/kubelet v0.32.3 h1:B9HzW4yB67flx8tN2FYuDwZvxnmK3v5EjxxFvOYjmc8=
+k8s.io/kubelet v0.32.3/go.mod h1:yyAQSCKC+tjSlaFw4HQG7Jein+vo+GeKBGdXdQGvL1U=
+k8s.io/kubernetes v1.32.3 h1:2A58BlNME8NwsMawmnM6InYo3Jf35Nw5G79q46kXwoA=
+k8s.io/kubernetes v1.32.3/go.mod h1:GvhiBeolvSRzBpFlgM0z/Bbu3Oxs9w3P6XfEgYaMi8k=
+k8s.io/mount-utils v0.32.3 h1:ZPXXHblfBhYP89OnaozpFg9Ojl6HhDfxBLcdWNkaxW8=
+k8s.io/mount-utils v0.32.3/go.mod h1:Kun5c2svjAPx0nnvJKYQWhfeNW+O0EpzHgRhDcYoSY0=
+k8s.io/pod-security-admission v0.32.3 h1:scV0PQc3PdD6sXOMHukPZOCzGCGZeVN5z999gHBpkOc=
+k8s.io/pod-security-admission v0.32.3/go.mod h1:K1saHV9cPicHSnQuavHxR1zohKhHMajbk8e0Z7pXAdc=
 k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg=
-k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e h1:KqK5c/ghOm8xkHYhlodbp6i6+r+ChV2vuAuVRdFbLro=
+k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.32.0 h1:XotDXzqvJ8Nx5eiZZueLpTuafJz8SiodgOemI+w87QU=
 sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.32.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
 sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
@@ -780,7 +825,7 @@ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh
 sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
 sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
 sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
 sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI=
 sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
 sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
diff --git a/pkg/cloud/cloud.go b/pkg/cloud/cloud.go
index b7204e16..d862a59b 100644
--- a/pkg/cloud/cloud.go
+++ b/pkg/cloud/cloud.go
@@ -36,7 +36,6 @@ import (
 	"github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/batcher"
 	dm "github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/cloud/devicemanager"
 	"github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/expiringcache"
-	"github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/metrics"
 	"github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/util"
 	"k8s.io/apimachinery/pkg/util/wait"
 	"k8s.io/klog/v2"
@@ -56,6 +55,10 @@ const (
 	VolumeTypeSC1 = "sc1"
 	// VolumeTypeST1 represents a throughput-optimized HDD type of volume.
 	VolumeTypeST1 = "st1"
+	// VolumeTypeSBG1 represents a capacity-optimized HDD type of volume. Only for SBE devices.
+	VolumeTypeSBG1 = "sbg1"
+	// VolumeTypeSBP1 represents a performance-optimized SSD type of volume. Only for SBE devices.
+	VolumeTypeSBP1 = "sbp1"
 	// VolumeTypeStandard represents a previous type of  volume.
 	VolumeTypeStandard = "standard"
 )
@@ -88,7 +91,9 @@ var (
 )
 
 const (
-	cacheForgetDelay = 1 * time.Hour
+	volumeDetachedState = "detached"
+	volumeAttachedState = "attached"
+	cacheForgetDelay    = 1 * time.Hour
 )
 
 // AWS provisioning limits.
@@ -213,9 +218,8 @@ type DiskOptions struct {
 	MultiAttachEnabled     bool
 	// KmsKeyID represents a fully qualified resource name to the key to use for encryption.
 	// example: arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef
-	KmsKeyID                 string
-	SnapshotID               string
-	VolumeInitializationRate int32
+	KmsKeyID   string
+	SnapshotID string
 }
 
 // ModifyDiskOptions represents parameters to modify an EBS volume.
@@ -543,7 +547,7 @@ func (c *cloud) CreateDisk(ctx context.Context, volumeName string, diskOptions *
 	}
 
 	switch createType {
-	case VolumeTypeGP2, VolumeTypeSC1, VolumeTypeST1, VolumeTypeStandard:
+	case VolumeTypeGP2, VolumeTypeSC1, VolumeTypeST1, VolumeTypeSBG1, VolumeTypeSBP1, VolumeTypeStandard:
 	case VolumeTypeIO1:
 		maxIops = io1MaxTotalIOPS
 		minIops = io1MinTotalIOPS
@@ -620,7 +624,10 @@ func (c *cloud) CreateDisk(ctx context.Context, volumeName string, diskOptions *
 		VolumeType:         types.VolumeType(createType),
 		Encrypted:          aws.Bool(diskOptions.Encrypted),
 		MultiAttachEnabled: aws.Bool(diskOptions.MultiAttachEnabled),
-		TagSpecifications:  []types.TagSpecification{tagSpec},
+	}
+
+	if !util.IsSBE(zone) {
+		requestInput.TagSpecifications = []types.TagSpecification{tagSpec}
 	}
 
 	// EBS doesn't handle empty outpost arn, so we have to include it only when it's non-empty
@@ -642,9 +649,6 @@ func (c *cloud) CreateDisk(ctx context.Context, volumeName string, diskOptions *
 	if len(snapshotID) > 0 {
 		requestInput.SnapshotId = aws.String(snapshotID)
 	}
-	if diskOptions.VolumeInitializationRate > 0 {
-		requestInput.VolumeInitializationRate = aws.Int32(diskOptions.VolumeInitializationRate)
-	}
 
 	response, err := c.ec2.CreateVolume(ctx, requestInput, func(o *ec2.Options) {
 		o.Retryer = c.rm.createVolumeRetryer
@@ -678,7 +682,26 @@ func (c *cloud) CreateDisk(ctx context.Context, volumeName string, diskOptions *
 		return nil, fmt.Errorf("timed out waiting for volume to create: %w", err)
 	}
 
-	return &Disk{CapacityGiB: size, VolumeID: volumeID, AvailabilityZone: zone, SnapshotID: snapshotID, OutpostArn: aws.ToString(response.OutpostArn)}, nil
+	outpostArn := aws.ToString(response.OutpostArn)
+	var resources []string
+	if util.IsSBE(zone) {
+		requestTagsInput := &ec2.CreateTagsInput{
+			Resources: append(resources, volumeID),
+			Tags:      tags,
+		}
+		_, err := c.ec2.CreateTags(ctx, requestTagsInput)
+		if err != nil {
+			// To avoid leaking volume, we should delete the volume just created
+			// TODO: Need to figure out how to handle DeleteDisk failed scenario instead of just log the error
+			if _, deleteDiskErr := c.DeleteDisk(ctx, volumeID); deleteDiskErr != nil {
+				klog.ErrorS(deleteDiskErr, "failed to be deleted, this may cause volume leak", "volumeID", volumeID)
+			} else {
+				klog.V(5).InfoS("volume is deleted because there was an error while attaching the tags", "volumeID", volumeID)
+			}
+			return nil, fmt.Errorf("could not attach tags to volume: %v. %w", volumeID, err)
+		}
+	}
+	return &Disk{CapacityGiB: size, VolumeID: volumeID, AvailabilityZone: zone, SnapshotID: snapshotID, OutpostArn: outpostArn}, nil
 }
 
 // execBatchDescribeVolumesModifications executes a batched DescribeVolumesModifications API call.
@@ -936,7 +959,7 @@ func (c *cloud) AttachDisk(ctx context.Context, volumeID, nodeID string) (string
 		klog.V(5).InfoS("[Debug] AttachVolume", "volumeID", volumeID, "nodeID", nodeID, "resp", resp)
 	}
 
-	_, err = c.WaitForAttachmentState(ctx, types.VolumeAttachmentStateAttached, volumeID, *instance.InstanceId, device.Path, device.IsAlreadyAssigned)
+	_, err = c.WaitForAttachmentState(ctx, volumeID, volumeAttachedState, *instance.InstanceId, device.Path, device.IsAlreadyAssigned)
 
 	// This is the only situation where we taint the device
 	if err != nil {
@@ -979,13 +1002,12 @@ func (c *cloud) DetachDisk(ctx context.Context, volumeID, nodeID string) error {
 		if isAWSErrorIncorrectState(err) ||
 			isAWSErrorInvalidAttachmentNotFound(err) ||
 			isAWSErrorVolumeNotFound(err) {
-			metrics.AsyncEC2Metrics().ClearDetachMetric(volumeID, nodeID)
 			return ErrNotFound
 		}
 		return fmt.Errorf("could not detach volume %q from node %q: %w", volumeID, nodeID, err)
 	}
 
-	attachment, err := c.WaitForAttachmentState(ctx, types.VolumeAttachmentStateDetached, volumeID, *instance.InstanceId, "", false)
+	attachment, err := c.WaitForAttachmentState(ctx, volumeID, volumeDetachedState, *instance.InstanceId, "", false)
 	if err != nil {
 		return err
 	}
@@ -993,13 +1015,12 @@ func (c *cloud) DetachDisk(ctx context.Context, volumeID, nodeID string) error {
 		// We expect it to be nil, it is (maybe) interesting if it is not
 		klog.V(2).InfoS("waitForAttachmentState returned non-nil attachment with state=detached", "attachment", attachment)
 	}
-	metrics.AsyncEC2Metrics().ClearDetachMetric(volumeID, nodeID)
 
 	return nil
 }
 
 // WaitForAttachmentState polls until the attachment status is the expected value.
-func (c *cloud) WaitForAttachmentState(ctx context.Context, expectedState types.VolumeAttachmentState, volumeID string, expectedInstance string, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
+func (c *cloud) WaitForAttachmentState(ctx context.Context, volumeID, expectedState string, expectedInstance string, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
 	var attachment *types.VolumeAttachment
 
 	verifyVolumeFunc := func(ctx context.Context) (bool, error) {
@@ -1011,12 +1032,12 @@ func (c *cloud) WaitForAttachmentState(ctx context.Context, expectedState types.
 		if err != nil {
 			// The VolumeNotFound error is special -- we don't need to wait for it to repeat
 			if isAWSErrorVolumeNotFound(err) {
-				if expectedState == types.VolumeAttachmentStateDetached {
+				if expectedState == volumeDetachedState {
 					// The disk doesn't exist, assume it's detached, log warning and stop waiting
 					klog.InfoS("Waiting for volume to be detached but the volume does not exist", "volumeID", volumeID)
 					return true, nil
 				}
-				if expectedState == types.VolumeAttachmentStateAttached {
+				if expectedState == volumeAttachedState {
 					// The disk doesn't exist, complain, give up waiting and report error
 					klog.InfoS("Waiting for volume to be attached but the volume does not exist", "volumeID", volumeID)
 					return false, err
@@ -1032,22 +1053,22 @@ func (c *cloud) WaitForAttachmentState(ctx context.Context, expectedState types.
 			return false, fmt.Errorf("volume %q has multiple attachments", volumeID)
 		}
 
-		var attachmentState types.VolumeAttachmentState
+		attachmentState := ""
 
 		for _, a := range volume.Attachments {
 			if a.InstanceId != nil {
 				if aws.ToString(a.InstanceId) == expectedInstance {
-					attachmentState = a.State
+					attachmentState = string(a.State)
 					attachment = &a
 				}
 			}
 		}
 
 		if attachmentState == "" {
-			attachmentState = types.VolumeAttachmentStateDetached
+			attachmentState = volumeDetachedState
 		}
 
-		if attachment != nil && attachment.Device != nil && expectedState == types.VolumeAttachmentStateAttached {
+		if attachment != nil && attachment.Device != nil && expectedState == volumeAttachedState {
 			device := aws.ToString(attachment.Device)
 			if device != expectedDevice {
 				klog.InfoS("WaitForAttachmentState: device mismatch", "device", device, "expectedDevice", expectedDevice, "attachment", attachment)
@@ -1058,7 +1079,7 @@ func (c *cloud) WaitForAttachmentState(ctx context.Context, expectedState types.
 		// if we expected volume to be attached and it was reported as already attached via DescribeInstance call
 		// but DescribeVolume told us volume is detached, we will short-circuit this long wait loop and return error
 		// so as AttachDisk can be retried without waiting for 20 minutes.
-		if (expectedState == types.VolumeAttachmentStateAttached) && alreadyAssigned && (attachmentState == types.VolumeAttachmentStateDetached) {
+		if (expectedState == volumeAttachedState) && alreadyAssigned && (attachmentState == volumeDetachedState) {
 			request := &ec2.AttachVolumeInput{
 				Device:     aws.String(expectedDevice),
 				InstanceId: aws.String(expectedInstance),
@@ -1075,17 +1096,13 @@ func (c *cloud) WaitForAttachmentState(ctx context.Context, expectedState types.
 		if attachmentState == expectedState {
 			// But first, reset attachment to nil if expectedState equals volumeDetachedState.
 			// Caller will not expect an attachment to be returned for a detached volume if we're not also returning an error.
-			if expectedState == types.VolumeAttachmentStateDetached {
+			if expectedState == volumeDetachedState {
 				attachment = nil
 			}
 			return true, nil
 		}
 		// continue waiting
 		klog.InfoS("Waiting for volume state", "volumeID", volumeID, "actual", attachmentState, "desired", expectedState)
-
-		if expectedState == types.VolumeAttachmentStateDetached {
-			metrics.AsyncEC2Metrics().TrackDetachment(volumeID, expectedInstance, attachmentState)
-		}
 		return false, nil
 	}
 
@@ -1900,7 +1917,7 @@ func volumeModificationDone(state string) bool {
 func getVolumeAttachmentsList(volume types.Volume) []string {
 	var volumeAttachmentList []string
 	for _, attachment := range volume.Attachments {
-		if attachment.State == types.VolumeAttachmentStateAttached {
+		if attachment.State == volumeAttachedState {
 			volumeAttachmentList = append(volumeAttachmentList, aws.ToString(attachment.InstanceId))
 		}
 	}
diff --git a/pkg/cloud/interface.go b/pkg/cloud/interface.go
index bf3cb7cc..eaa3d35e 100644
--- a/pkg/cloud/interface.go
+++ b/pkg/cloud/interface.go
@@ -28,7 +28,7 @@ type Cloud interface {
 	DetachDisk(ctx context.Context, volumeID string, nodeID string) (err error)
 	ModifyTags(ctx context.Context, volumeID string, tagOptions ModifyTagsOptions) (err error)
 	ResizeOrModifyDisk(ctx context.Context, volumeID string, newSizeBytes int64, options *ModifyDiskOptions) (newSize int32, err error)
-	WaitForAttachmentState(ctx context.Context, expectedState types.VolumeAttachmentState, volumeID string, expectedInstance string, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error)
+	WaitForAttachmentState(ctx context.Context, volumeID, expectedState string, expectedInstance string, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error)
 	GetDiskByName(ctx context.Context, name string, capacityBytes int64) (disk *Disk, err error)
 	GetDiskByID(ctx context.Context, volumeID string) (disk *Disk, err error)
 	CreateSnapshot(ctx context.Context, volumeID string, snapshotOptions *SnapshotOptions) (snapshot *Snapshot, err error)
diff --git a/pkg/cloud/metadata/ec2.go b/pkg/cloud/metadata/ec2.go
index 886e2773..0a7346d5 100644
--- a/pkg/cloud/metadata/ec2.go
+++ b/pkg/cloud/metadata/ec2.go
@@ -50,7 +50,7 @@ var DefaultEC2MetadataClient = func() (EC2Metadata, error) {
 	return svc, nil
 }
 
-func EC2MetadataInstanceInfo(svc EC2Metadata) (*Metadata, error) {
+func EC2MetadataInstanceInfo(svc EC2Metadata, regionFromSession string) (*Metadata, error) {
 	docOutput, err := svc.GetInstanceIdentityDocument(context.Background(), &imds.GetInstanceIdentityDocumentInput{})
 	if err != nil {
 		return nil, fmt.Errorf("could not get EC2 instance identity metadata: %w", err)
@@ -66,27 +66,43 @@ func EC2MetadataInstanceInfo(svc EC2Metadata) (*Metadata, error) {
 	}
 
 	if len(doc.Region) == 0 {
-		return nil, errors.New("could not get valid EC2 region")
+		if len(regionFromSession) != 0 && util.IsSBE(regionFromSession) {
+			doc.Region = regionFromSession
+		} else {
+			return nil, errors.New("could not get valid EC2 region")
+		}
 	}
 
 	if len(doc.AvailabilityZone) == 0 {
-		return nil, errors.New("could not get valid EC2 availability zone")
+		if len(regionFromSession) != 0 && util.IsSBE(regionFromSession) {
+			doc.AvailabilityZone = regionFromSession
+		} else {
+			return nil, errors.New("could not get valid EC2 availability zone")
+		}
 	}
 
-	attachedENIs, err := getAttachedENIs(svc)
+	enisOutput, err := svc.GetMetadata(context.Background(), &imds.GetMetadataInput{Path: EnisEndpoint})
 	if err != nil {
-		return nil, err
+		return nil, fmt.Errorf("could not get metadata for ENIs: %w", err)
 	}
-
-	mappingsOutput, mappingsOutputErr := svc.GetMetadata(context.Background(), &imds.GetMetadataInput{Path: BlockDevicesEndpoint})
-	if mappingsOutputErr != nil {
-		return nil, fmt.Errorf("could not get metadata for block device mappings: %w", mappingsOutputErr)
+	enis, err := io.ReadAll(enisOutput.Content)
+	if err != nil {
+		return nil, fmt.Errorf("could not read ENIs metadata content: %w", err)
 	}
-	mappings, mappingsErr := io.ReadAll(mappingsOutput.Content)
-	if mappingsErr != nil {
-		return nil, fmt.Errorf("could not read block device mappings metadata content: %w", mappingsErr)
+	attachedENIs := util.CountMACAddresses(string(enis))
+
+	blockDevMappings := 0
+	if !util.IsSBE(doc.Region) {
+		mappingsOutput, mappingsOutputErr := svc.GetMetadata(context.Background(), &imds.GetMetadataInput{Path: BlockDevicesEndpoint})
+		if mappingsOutputErr != nil {
+			return nil, fmt.Errorf("could not get metadata for block device mappings: %w", mappingsOutputErr)
+		}
+		mappings, mappingsErr := io.ReadAll(mappingsOutput.Content)
+		if mappingsErr != nil {
+			return nil, fmt.Errorf("could not read block device mappings metadata content: %w", mappingsErr)
+		}
+		blockDevMappings = strings.Count(string(mappings), "ebs")
 	}
-	blockDevMappings := strings.Count(string(mappings), "ebs")
 
 	instanceInfo := Metadata{
 		InstanceID:             doc.InstanceID,
@@ -95,7 +111,6 @@ func EC2MetadataInstanceInfo(svc EC2Metadata) (*Metadata, error) {
 		AvailabilityZone:       doc.AvailabilityZone,
 		NumAttachedENIs:        attachedENIs,
 		NumBlockDeviceMappings: blockDevMappings,
-		EC2MetadataClient:      svc,
 	}
 
 	outpostArnOutput, err := svc.GetMetadata(context.Background(), &imds.GetMetadataInput{Path: OutpostArnEndpoint})
@@ -124,16 +139,3 @@ func EC2MetadataInstanceInfo(svc EC2Metadata) (*Metadata, error) {
 
 	return &instanceInfo, nil
 }
-
-func getAttachedENIs(svc EC2Metadata) (int, error) {
-	enisOutput, err := svc.GetMetadata(context.Background(), &imds.GetMetadataInput{Path: EnisEndpoint})
-	if err != nil {
-		return -1, fmt.Errorf("could not get metadata for ENIs: %w", err)
-	}
-	enis, err := io.ReadAll(enisOutput.Content)
-	if err != nil {
-		return -1, fmt.Errorf("could not read ENIs metadata content: %w", err)
-	}
-	attachedENIs := util.CountMACAddresses(string(enis))
-	return attachedENIs, nil
-}
diff --git a/pkg/cloud/metadata/interface.go b/pkg/cloud/metadata/interface.go
index 1dd96f7c..0433f805 100644
--- a/pkg/cloud/metadata/interface.go
+++ b/pkg/cloud/metadata/interface.go
@@ -30,7 +30,6 @@ type MetadataService interface {
 	GetNumAttachedENIs() int
 	GetNumBlockDeviceMappings() int
 	GetOutpostArn() arn.ARN
-	UpdateMetadata() error
 }
 
 type EC2Metadata interface {
diff --git a/pkg/cloud/metadata/metadata.go b/pkg/cloud/metadata/metadata.go
index 77b5a3dd..7ad273ac 100644
--- a/pkg/cloud/metadata/metadata.go
+++ b/pkg/cloud/metadata/metadata.go
@@ -18,7 +18,6 @@ package metadata
 
 import (
 	"errors"
-	"fmt"
 	"os"
 
 	"github.com/aws/aws-sdk-go-v2/aws/arn"
@@ -34,7 +33,6 @@ type Metadata struct {
 	NumAttachedENIs        int
 	NumBlockDeviceMappings int
 	OutpostArn             arn.ARN
-	EC2MetadataClient      EC2Metadata
 }
 
 type MetadataServiceConfig struct {
@@ -52,7 +50,7 @@ func NewMetadataService(cfg MetadataServiceConfig, region string) (MetadataServi
 		klog.V(2).InfoS("Environment variable AWS_EC2_METADATA_DISABLED set to 'true'. Will not rely on IMDS for instance metadata")
 	} else {
 		klog.V(2).InfoS("Attempting to retrieve instance metadata from IMDS")
-		metadata, err := retrieveEC2Metadata(cfg.EC2MetadataClient)
+		metadata, err := retrieveEC2Metadata(cfg.EC2MetadataClient, region)
 		if err == nil {
 			klog.V(2).InfoS("Retrieved metadata from IMDS")
 			return metadata.overrideRegion(region), nil
@@ -71,30 +69,13 @@ func NewMetadataService(cfg MetadataServiceConfig, region string) (MetadataServi
 	return nil, errors.New("IMDS metadata and Kubernetes metadata are both unavailable")
 }
 
-// UpdateMetadata refreshes ENI information.
-// We do not refresh blockDeviceMappings because IMDS only reports data from when instance starts (As of April 2025).
-func (m *Metadata) UpdateMetadata() error {
-	if m.EC2MetadataClient == nil {
-		// EC2 Metadata not available, skip updates
-		return nil
-	}
-
-	attachedENIs, err := getAttachedENIs(m.EC2MetadataClient)
-	if err != nil {
-		return fmt.Errorf("failed to update ENI count: %w", err)
-	}
-	m.NumAttachedENIs = attachedENIs
-
-	return nil
-}
-
-func retrieveEC2Metadata(ec2MetadataClient EC2MetadataClient) (*Metadata, error) {
+func retrieveEC2Metadata(ec2MetadataClient EC2MetadataClient, region string) (*Metadata, error) {
 	svc, err := ec2MetadataClient()
 	if err != nil {
 		klog.ErrorS(err, "failed to initialize EC2 Metadata client")
 		return nil, err
 	}
-	return EC2MetadataInstanceInfo(svc)
+	return EC2MetadataInstanceInfo(svc, region)
 }
 
 func retrieveK8sMetadata(k8sAPIClient KubernetesAPIClient) (*Metadata, error) {
diff --git a/pkg/cloud/metadata/mock_metadata.go b/pkg/cloud/metadata/mock_metadata.go
index 386b1db7..d7ae84fd 100644
--- a/pkg/cloud/metadata/mock_metadata.go
+++ b/pkg/cloud/metadata/mock_metadata.go
@@ -134,20 +134,6 @@ func (mr *MockMetadataServiceMockRecorder) GetRegion() *gomock.Call {
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRegion", reflect.TypeOf((*MockMetadataService)(nil).GetRegion))
 }
 
-// UpdateMetadata mocks base method.
-func (m *MockMetadataService) UpdateMetadata() error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "UpdateMetadata")
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// UpdateMetadata indicates an expected call of UpdateMetadata.
-func (mr *MockMetadataServiceMockRecorder) UpdateMetadata() *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMetadata", reflect.TypeOf((*MockMetadataService)(nil).UpdateMetadata))
-}
-
 // MockEC2Metadata is a mock of EC2Metadata interface.
 type MockEC2Metadata struct {
 	ctrl     *gomock.Controller
diff --git a/pkg/cloud/mock_cloud.go b/pkg/cloud/mock_cloud.go
index ebc4d38d..9a33d16d 100644
--- a/pkg/cloud/mock_cloud.go
+++ b/pkg/cloud/mock_cloud.go
@@ -260,16 +260,16 @@ func (mr *MockCloudMockRecorder) ResizeOrModifyDisk(ctx, volumeID, newSizeBytes,
 }
 
 // WaitForAttachmentState mocks base method.
-func (m *MockCloud) WaitForAttachmentState(ctx context.Context, expectedState types.VolumeAttachmentState, volumeID, expectedInstance, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
+func (m *MockCloud) WaitForAttachmentState(ctx context.Context, volumeID, expectedState, expectedInstance, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "WaitForAttachmentState", ctx, expectedState, volumeID, expectedInstance, expectedDevice, alreadyAssigned)
+	ret := m.ctrl.Call(m, "WaitForAttachmentState", ctx, volumeID, expectedState, expectedInstance, expectedDevice, alreadyAssigned)
 	ret0, _ := ret[0].(*types.VolumeAttachment)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // WaitForAttachmentState indicates an expected call of WaitForAttachmentState.
-func (mr *MockCloudMockRecorder) WaitForAttachmentState(ctx, expectedState, volumeID, expectedInstance, expectedDevice, alreadyAssigned interface{}) *gomock.Call {
+func (mr *MockCloudMockRecorder) WaitForAttachmentState(ctx, volumeID, expectedState, expectedInstance, expectedDevice, alreadyAssigned interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitForAttachmentState", reflect.TypeOf((*MockCloud)(nil).WaitForAttachmentState), ctx, expectedState, volumeID, expectedInstance, expectedDevice, alreadyAssigned)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitForAttachmentState", reflect.TypeOf((*MockCloud)(nil).WaitForAttachmentState), ctx, volumeID, expectedState, expectedInstance, expectedDevice, alreadyAssigned)
 }
diff --git a/pkg/driver/constants.go b/pkg/driver/constants.go
index 2cca8e82..71dfe4f1 100644
--- a/pkg/driver/constants.go
+++ b/pkg/driver/constants.go
@@ -43,9 +43,6 @@ const (
 	// AllowAutoIOPSPerGBIncreaseKey represents key for allowing automatic increase of IOPS.
 	AllowAutoIOPSPerGBIncreaseKey = "allowautoiopspergbincrease"
 
-	// VolumeInitializationRateKey represents key for volume initialization rate when creating volumes from snapshots.
-	VolumeInitializationRateKey = "volumeinitializationrate"
-
 	// Iops represents key for IOPS for volume.
 	IopsKey = "iops"
 
diff --git a/pkg/driver/controller.go b/pkg/driver/controller.go
index 4f531470..352cc278 100644
--- a/pkg/driver/controller.go
+++ b/pkg/driver/controller.go
@@ -106,17 +106,16 @@ func (d *ControllerService) CreateVolume(ctx context.Context, req *csi.CreateVol
 	defer d.inFlight.Delete(volName)
 
 	var (
-		volumeType               string
-		iopsPerGB                int32
-		allowIOPSPerGBIncrease   bool
-		iops                     int32
-		throughput               int32
-		volumeInitializationRate int32
-		isEncrypted              bool
-		blockExpress             bool
-		kmsKeyID                 string
-		scTags                   []string
-		volumeTags               = map[string]string{
+		volumeType             string
+		iopsPerGB              int32
+		allowIOPSPerGBIncrease bool
+		iops                   int32
+		throughput             int32
+		isEncrypted            bool
+		blockExpress           bool
+		kmsKeyID               string
+		scTags                 []string
+		volumeTags             = map[string]string{
 			cloud.VolumeNameTagKey:   volName,
 			cloud.AwsEbsDriverTagKey: isManagedByDriver,
 		}
@@ -150,12 +149,6 @@ func (d *ControllerService) CreateVolume(ctx context.Context, req *csi.CreateVol
 				return nil, status.Errorf(codes.InvalidArgument, "Could not parse invalid iops: %v", err)
 			}
 			iops = int32(parseIopsKey)
-		case VolumeInitializationRateKey:
-			parseInitRate, parseInitRateErr := strconv.ParseInt(value, 10, 32)
-			if parseInitRateErr != nil {
-				return nil, status.Errorf(codes.InvalidArgument, "Could not parse invalid volumeInitializationRate: %v", err)
-			}
-			volumeInitializationRate = int32(parseInitRate)
 		case ThroughputKey:
 			parseThroughput, parseThroughputErr := strconv.ParseInt(value, 10, 32)
 			if parseThroughputErr != nil {
@@ -319,21 +312,20 @@ func (d *ControllerService) CreateVolume(ctx context.Context, req *csi.CreateVol
 	}
 
 	opts := &cloud.DiskOptions{
-		CapacityBytes:            volSizeBytes,
-		Tags:                     volumeTags,
-		VolumeType:               volumeType,
-		IOPSPerGB:                iopsPerGB,
-		AllowIOPSPerGBIncrease:   allowIOPSPerGBIncrease,
-		IOPS:                     iops,
-		Throughput:               throughput,
-		AvailabilityZone:         zone,
-		OutpostArn:               outpostArn,
-		Encrypted:                isEncrypted,
-		BlockExpress:             blockExpress,
-		KmsKeyID:                 kmsKeyID,
-		SnapshotID:               snapshotID,
-		MultiAttachEnabled:       multiAttach,
-		VolumeInitializationRate: volumeInitializationRate,
+		CapacityBytes:          volSizeBytes,
+		Tags:                   volumeTags,
+		VolumeType:             volumeType,
+		IOPSPerGB:              iopsPerGB,
+		AllowIOPSPerGBIncrease: allowIOPSPerGBIncrease,
+		IOPS:                   iops,
+		Throughput:             throughput,
+		AvailabilityZone:       zone,
+		OutpostArn:             outpostArn,
+		Encrypted:              isEncrypted,
+		BlockExpress:           blockExpress,
+		KmsKeyID:               kmsKeyID,
+		SnapshotID:             snapshotID,
+		MultiAttachEnabled:     multiAttach,
 	}
 
 	disk, err := d.cloud.CreateDisk(ctx, volName, opts)
diff --git a/pkg/driver/mock_k8s_client.go b/pkg/driver/mock_k8s_client.go
index 8f6ff512..852a5d73 100644
--- a/pkg/driver/mock_k8s_client.go
+++ b/pkg/driver/mock_k8s_client.go
@@ -56,7 +56,6 @@ import (
 	v1beta113 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1"
 	v1alpha3 "k8s.io/client-go/kubernetes/typed/resource/v1alpha3"
 	v1beta114 "k8s.io/client-go/kubernetes/typed/resource/v1beta1"
-	v1beta21 "k8s.io/client-go/kubernetes/typed/resource/v1beta2"
 	v115 "k8s.io/client-go/kubernetes/typed/scheduling/v1"
 	v1alpha16 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1"
 	v1beta115 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1"
@@ -761,20 +760,6 @@ func (mr *MockKubernetesClientMockRecorder) ResourceV1beta1() *gomock.Call {
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResourceV1beta1", reflect.TypeOf((*MockKubernetesClient)(nil).ResourceV1beta1))
 }
 
-// ResourceV1beta2 mocks base method.
-func (m *MockKubernetesClient) ResourceV1beta2() v1beta21.ResourceV1beta2Interface {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ResourceV1beta2")
-	ret0, _ := ret[0].(v1beta21.ResourceV1beta2Interface)
-	return ret0
-}
-
-// ResourceV1beta2 indicates an expected call of ResourceV1beta2.
-func (mr *MockKubernetesClientMockRecorder) ResourceV1beta2() *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResourceV1beta2", reflect.TypeOf((*MockKubernetesClient)(nil).ResourceV1beta2))
-}
-
 // SchedulingV1 mocks base method.
 func (m *MockKubernetesClient) SchedulingV1() v115.SchedulingV1Interface {
 	m.ctrl.T.Helper()
diff --git a/pkg/driver/node.go b/pkg/driver/node.go
index 9cbf7e04..5caac40a 100644
--- a/pkg/driver/node.go
+++ b/pkg/driver/node.go
@@ -49,6 +49,9 @@ const (
 
 	// VolumeOperationAlreadyExists is message fmt returned to CO when there is another in-flight call on the given volumeID.
 	VolumeOperationAlreadyExists = "An operation with the given volume=%q is already in progress"
+
+	// sbeDeviceVolumeAttachmentLimit refers to the maximum number of volumes that can be attached to an instance on snow.
+	sbeDeviceVolumeAttachmentLimit = 10
 )
 
 var (
@@ -570,10 +573,6 @@ func (d *NodeService) NodeGetCapabilities(ctx context.Context, req *csi.NodeGetC
 func (d *NodeService) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) {
 	klog.V(4).InfoS("NodeGetInfo: called", "args", req)
 
-	if err := d.metadata.UpdateMetadata(); err != nil {
-		klog.ErrorS(err, "Failed to update metadata, using cached values")
-	}
-
 	zone := d.metadata.GetAvailabilityZone()
 	osType := runtime.GOOS
 
@@ -770,6 +769,9 @@ func (d *NodeService) getVolumesLimit() int64 {
 		klog.V(4).InfoS("getVolumesLimit: VolumeAttachLimit manually set to", d.options.VolumeAttachLimit, "overriding the default value")
 		return d.options.VolumeAttachLimit
 	}
+	if util.IsSBE(d.metadata.GetRegion()) {
+		return sbeDeviceVolumeAttachmentLimit
+	}
 
 	instanceType := d.metadata.GetInstanceType()
 	klog.V(4).InfoS("getVolumesLimit:", "instanceType", instanceType)
diff --git a/pkg/metrics/async.go b/pkg/metrics/async.go
deleted file mode 100644
index 16bf95b8..00000000
--- a/pkg/metrics/async.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2025 The Kubernetes Authors.
-//
-// Licensed 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 metrics
-
-import (
-	"sync"
-	"time"
-
-	"github.com/aws/aws-sdk-go-v2/service/ec2/types"
-	"github.com/prometheus/client_golang/prometheus"
-)
-
-const (
-	metricAsyncDetachSeconds = namespace + "ec2_detach_pending_seconds_total"
-	asyncCollectorScrapes    = namespace + "ec2_collector_scrapes_total"
-	asyncCollectorDuration   = namespace + "ec2_collector_duration_seconds"
-)
-
-type attachment struct {
-	volumeID   string
-	instanceID string
-}
-
-type detachingVolume struct {
-	detachStart          time.Time
-	lastDetachStateCheck time.Time
-	attachmentState      types.VolumeAttachmentState
-}
-
-// AsyncEC2Collector contains metrics related to async EC2 operations and utilities for tracking what metrics should be emitted.
-type AsyncEC2Collector struct {
-	// Metrics
-	detachingDuration  *prometheus.Desc
-	collectionDuration prometheus.Histogram
-	scrapesTotal       prometheus.Counter
-
-	// Utilities
-	// detachingVolumes holds any attachment that the controller service expects to be detached but is not.
-	// We manage concurrency and memory safety within the struct through mutex and ticker instead of relying
-	// on an ExpiringCache because we require that getting a cached value doesn't reset expiration timer.
-	detachingVolumes map[attachment]detachingVolume
-	mutex            sync.Mutex
-	ticker           *time.Ticker
-	// lastCacheUpdate helps us not vend out-of-date metrics upon leader election change.
-	lastCacheUpdate time.Time
-	// minDurationThreshold for volume to not reach detached state for metric emission. Prevents cardinality bombs.
-	minDurationThreshold time.Duration
-}
-
-// Describe sends the descriptor of each metric in the AsyncEC2Collector to Prometheus.
-func (c *AsyncEC2Collector) Describe(ch chan<- *prometheus.Desc) {
-	ch <- c.detachingDuration
-	ch <- c.collectionDuration.Desc()
-	ch <- c.scrapesTotal.Desc()
-}
-
-// Collect is invoked by Prometheus at collection time for emitting AsyncEC2Collector metrics.
-func (c *AsyncEC2Collector) Collect(ch chan<- prometheus.Metric) {
-	// Meta metrics for metric collection
-	c.scrapesTotal.Inc()
-	start := time.Now()
-	defer func() {
-		duration := time.Since(start).Seconds()
-		c.collectionDuration.Observe(duration)
-
-		ch <- c.collectionDuration
-		ch <- c.scrapesTotal
-	}()
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	for k, v := range c.detachingVolumes {
-		if time.Since(v.detachStart) > c.minDurationThreshold {
-			if v.attachmentState != types.VolumeAttachmentStateDetached {
-				ch <- prometheus.MustNewConstMetric(c.detachingDuration, prometheus.CounterValue, time.Since(v.detachStart).Seconds(), k.volumeID, k.instanceID, string(v.attachmentState))
-			}
-		}
-	}
-}
-
-// TrackDetachment tracks the state of a volume that we expect to detach in our AsyncEC2Collector cache.
-func (c *AsyncEC2Collector) TrackDetachment(volumeID, instanceID string, attachmentState types.VolumeAttachmentState) {
-	if c == nil {
-		return
-	}
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	a := attachment{volumeID: volumeID, instanceID: instanceID}
-
-	// Clear if detached
-	if attachmentState == types.VolumeAttachmentStateDetached || attachmentState == "" {
-		delete(c.detachingVolumes, a)
-	}
-
-	// Check if first time tracking this attachment
-	var detachStart time.Time
-	now := time.Now()
-	dv, ok := c.detachingVolumes[a]
-	if ok {
-		detachStart = dv.detachStart
-	} else {
-		detachStart = now
-	}
-
-	c.detachingVolumes[a] = detachingVolume{
-		detachStart:          detachStart,
-		lastDetachStateCheck: now,
-		attachmentState:      attachmentState,
-	}
-}
-
-// ClearDetachMetric ensures AsyncEC2Collector is not emitting metrics for a given attachment.
-func (c *AsyncEC2Collector) ClearDetachMetric(volumeID, instanceID string) {
-	if c == nil {
-		return
-	}
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	a := attachment{volumeID: volumeID, instanceID: instanceID}
-	delete(c.detachingVolumes, a)
-}
-
-// cleanupCache clears the detachingVolumes cache if no update has been made since minTimeSinceLastUpdate ago.
-func (c *AsyncEC2Collector) cleanupCache(minTimeSinceLastUpdate time.Duration) {
-	if c == nil {
-		return
-	}
-
-	c.mutex.Lock()
-	defer c.mutex.Unlock()
-
-	for k, v := range c.detachingVolumes {
-		if time.Since(v.lastDetachStateCheck) > minTimeSinceLastUpdate {
-			delete(c.detachingVolumes, k)
-		}
-	}
-}
diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go
index 99751449..79c9ec69 100644
--- a/pkg/metrics/metrics.go
+++ b/pkg/metrics/metrics.go
@@ -52,9 +52,8 @@ var (
 )
 
 type metricRecorder struct {
-	registry        *prometheus.Registry
-	metrics         map[string]interface{}
-	asyncEC2Metrics *AsyncEC2Collector
+	registry *prometheus.Registry
+	metrics  map[string]interface{}
 }
 
 // Recorder returns the singleton instance of metricRecorder.
@@ -75,50 +74,10 @@ func InitializeRecorder(deprecatedMetrics bool) *metricRecorder {
 }
 
 // InitializeNVME registers the NVMe collector for gathering metrics from NVMe devices.
-func (m *metricRecorder) InitializeNVME(csiMountPointPath, instanceID string) {
+func InitializeNVME(r *metricRecorder, csiMountPointPath, instanceID string) {
 	registerNVMECollector(r, csiMountPointPath, instanceID)
 }
 
-// InitializeAsyncEC2Metrics initializes and registers AsyncEC2Collector for gathering metrics on async EC2 operations.
-func (m *metricRecorder) InitializeAsyncEC2Metrics(minimumEmissionThreshold time.Duration) {
-	variableLabels := []string{"volume_id", "instance_id", "attachment_state"}
-	cacheCleanupInterval := 15 * time.Minute
-
-	r.asyncEC2Metrics = &AsyncEC2Collector{
-		detachingDuration: prometheus.NewDesc(metricAsyncDetachSeconds, "Number of seconds csi driver has been waiting for volume to be detached from instance. Label attachment_state shows last seen state for attachment associated with volume_id and instance_id. Metric only valid if emitted from leader.", variableLabels, nil),
-		collectionDuration: prometheus.NewHistogram(prometheus.HistogramOpts{
-			Name:    asyncCollectorDuration,
-			Help:    "Histogram of async EC2 collector scrape duration in seconds.",
-			Buckets: []float64{0.01, 0.1, 0.5, 1, 2.5, 5, 10},
-		}),
-		scrapesTotal: prometheus.NewCounter(prometheus.CounterOpts{
-			Name: asyncCollectorScrapes,
-			Help: "Total number of async EC2 collector scrapes.",
-		}),
-		detachingVolumes:     make(map[attachment]detachingVolume),
-		minDurationThreshold: minimumEmissionThreshold,
-		lastCacheUpdate:      time.Now(),
-		ticker:               time.NewTicker(cacheCleanupInterval),
-	}
-	r.registry.MustRegister(r.asyncEC2Metrics)
-
-	// Prevent leaked memory in case of leader change by clearing cache if no detaches have been tracked in a while
-	go func() {
-		for {
-			<-r.asyncEC2Metrics.ticker.C
-			r.asyncEC2Metrics.cleanupCache(cacheCleanupInterval)
-		}
-	}()
-}
-
-// AsyncEC2Metrics returns AsyncEC2Collector if metrics are enabled.
-func AsyncEC2Metrics() *AsyncEC2Collector {
-	if r == nil {
-		return nil
-	}
-	return r.asyncEC2Metrics
-}
-
 // IncreaseCount increases the counter metric by 1.
 func (m *metricRecorder) IncreaseCount(name string, helpText string, labels map[string]string) {
 	if m == nil {
diff --git a/pkg/metrics/nvme.go b/pkg/metrics/nvme.go
index f48b096f..a2313cf9 100644
--- a/pkg/metrics/nvme.go
+++ b/pkg/metrics/nvme.go
@@ -37,26 +37,26 @@ import (
 
 const (
 	// Counter metrics.
-	metricReadOps         = namespace + "read_ops_total"
-	metricWriteOps        = namespace + "write_ops_total"
-	metricReadBytes       = namespace + "read_bytes_total"
-	metricWriteBytes      = namespace + "write_bytes_total"
-	metricReadOpsSeconds  = namespace + "read_seconds_total"
-	metricWriteOpsSeconds = namespace + "write_seconds_total"
-	metricExceededIOPS    = namespace + "exceeded_iops_seconds_total"
-	metricExceededTP      = namespace + "exceeded_tp_seconds_total"
-	metricEC2ExceededIOPS = namespace + "ec2_exceeded_iops_seconds_total"
-	metricEC2ExceededTP   = namespace + "ec2_exceeded_tp_seconds_total"
-	nvmeCollectorScrapes  = namespace + "nvme_collector_scrapes_total"
-	nvmeCollectorErrors   = namespace + "nvme_collector_errors_total"
+	metricReadOps          = namespace + "read_ops_total"
+	metricWriteOps         = namespace + "write_ops_total"
+	metricReadBytes        = namespace + "read_bytes_total"
+	metricWriteBytes       = namespace + "write_bytes_total"
+	metricReadOpsSeconds   = namespace + "read_seconds_total"
+	metricWriteOpsSeconds  = namespace + "write_seconds_total"
+	metricExceededIOPS     = namespace + "exceeded_iops_seconds_total"
+	metricExceededTP       = namespace + "exceeded_tp_seconds_total"
+	metricEC2ExceededIOPS  = namespace + "ec2_exceeded_iops_seconds_total"
+	metricEC2ExceededTP    = namespace + "ec2_exceeded_tp_seconds_total"
+	metricCollectorScrapes = namespace + "nvme_collector_scrapes_total"
+	metricCollectorErrors  = namespace + "nvme_collector_errors_total"
 
 	// Gauge metrics.
 	metricVolumeQueueLength = namespace + "volume_queue_length"
 
 	// Histogram metrics.
-	metricReadLatency     = namespace + "read_io_latency_seconds"
-	metricWriteLatency    = namespace + "write_io_latency_seconds"
-	nvmeCollectorDuration = namespace + "nvme_collector_duration_seconds"
+	metricReadLatency       = namespace + "read_io_latency_seconds"
+	metricWriteLatency      = namespace + "write_io_latency_seconds"
+	metricCollectorDuration = namespace + "nvme_collector_duration_seconds"
 
 	// Conversion factor.
 	microsecondsInSeconds = 1e6
@@ -154,18 +154,18 @@ func NewNVMECollector(path, instanceID string) *NVMECollector {
 		csiMountPointPath: filepath.Clean(path) + "/",
 		instanceID:        instanceID,
 		collectionDuration: prometheus.NewHistogram(prometheus.HistogramOpts{
-			Name:        nvmeCollectorDuration,
+			Name:        metricCollectorDuration,
 			Help:        "Histogram of NVMe collector scrape duration in seconds.",
 			Buckets:     []float64{0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10},
 			ConstLabels: constLabels,
 		}),
 		scrapesTotal: prometheus.NewCounter(prometheus.CounterOpts{
-			Name:        nvmeCollectorScrapes,
+			Name:        metricCollectorScrapes,
 			Help:        "Total number of NVMe collector scrapes.",
 			ConstLabels: constLabels,
 		}),
 		scrapeErrorsTotal: prometheus.NewCounter(prometheus.CounterOpts{
-			Name:        nvmeCollectorErrors,
+			Name:        metricCollectorErrors,
 			Help:        "Total number of NVMe collector scrape errors.",
 			ConstLabels: constLabels,
 		}),
diff --git a/pkg/mounter/mount_linux.go b/pkg/mounter/mount_linux.go
index c55cd70e..051e6a19 100644
--- a/pkg/mounter/mount_linux.go
+++ b/pkg/mounter/mount_linux.go
@@ -28,6 +28,7 @@ import (
 	"strconv"
 	"strings"
 
+	"github.com/kubernetes-sigs/aws-ebs-csi-driver/pkg/util"
 	"golang.org/x/sys/unix"
 	"k8s.io/klog/v2"
 	mountutils "k8s.io/mount-utils"
@@ -112,6 +113,15 @@ func (m *NodeMounter) FindDevicePath(devicePath, volumeID, partition, region str
 		klog.V(5).InfoS("[Debug] error searching for nvme path", "nvmeName", nvmeName, "err", err)
 	}
 
+	if util.IsSBE(region) {
+		klog.V(5).InfoS("[Debug] Falling back to snow volume lookup", "devicePath", devicePath)
+		// Snow completely ignores the requested device path and mounts volumes starting at /dev/vda .. /dev/vdb .. etc
+		// Morph the device path to the snow form by chopping off the last letter and prefixing with /dev/vd
+		// VMs on snow devices are currently limited to 10 block devices each - if that ever exceeds 26 this will need
+		// to be adapted
+		canonicalDevicePath = "/dev/vd" + devicePath[len(devicePath)-1:]
+	}
+
 	if canonicalDevicePath == "" {
 		return "", fmt.Errorf("no device path for device %q volume %q found", devicePath, volumeID)
 	}
diff --git a/pkg/util/util.go b/pkg/util/util.go
index ad4bb452..346dde5d 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -132,6 +132,10 @@ func GetAccessModes(caps []*csi.VolumeCapability) *[]string {
 	return &modes
 }
 
+func IsSBE(region string) bool {
+	return region == "snow"
+}
+
 // StringIsAlphanumeric returns true if a given string contains only English letters or numbers.
 func StringIsAlphanumeric(s string) bool {
 	return isAlphanumericRegex(s)


Test patch:
diff --git a/hack/e2e/config.sh b/hack/e2e/config.sh
index fc1591f6..c1a251e8 100644
--- a/hack/e2e/config.sh
+++ b/hack/e2e/config.sh
@@ -43,7 +43,6 @@ K8S_VERSION_EKSCTL=${K8S_VERSION_EKSCTL:-1.32}
 
 EBS_INSTALL_SNAPSHOT=${EBS_INSTALL_SNAPSHOT:-"true"}
 EBS_INSTALL_SNAPSHOT_VERSION=${EBS_INSTALL_SNAPSHOT_VERSION:-"v8.2.1"}
-EBS_INSTALL_SNAPSHOT_CUSTOM_IMAGE=${EBS_INSTALL_SNAPSHOT_CUSTOM_IMAGE:-}
 
 AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
 KOPS_BUCKET=${KOPS_BUCKET:-${AWS_ACCOUNT_ID}-ebs-csi-e2e-kops}
diff --git a/hack/e2e/eksctl/cluster.yaml b/hack/e2e/eksctl/cluster.yaml
index c2c6fc59..5b86ec16 100644
--- a/hack/e2e/eksctl/cluster.yaml
+++ b/hack/e2e/eksctl/cluster.yaml
@@ -32,8 +32,6 @@ managedNodeGroups:
   - name: ng-linux
     amiFamily: AmazonLinux2
     desiredCapacity: 3
-    # Test against no-IMDS environment to test k8s metadata
-    # and IRSA/Pod Identity support
     disablePodIMDS: true
     instanceTypes: [{{ .Env.INSTANCE_TYPE }}]
     ssh:
diff --git a/hack/e2e/run.sh b/hack/e2e/run.sh
index 803c0f1a..f8a2ef77 100755
--- a/hack/e2e/run.sh
+++ b/hack/e2e/run.sh
@@ -68,14 +68,10 @@ fi
 if [[ "${EBS_INSTALL_SNAPSHOT}" == true ]]; then
   loudecho "Applying snapshot controller and CRDs"
   kubectl apply --kubeconfig "${KUBECONFIG}" -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
+  kubectl apply --kubeconfig "${KUBECONFIG}" -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
   kubectl apply --kubeconfig "${KUBECONFIG}" -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
   kubectl apply --kubeconfig "${KUBECONFIG}" -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
   kubectl apply --kubeconfig "${KUBECONFIG}" -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
-  SNAPSHOT_CONTROLLER_MANIFEST="$(curl -L https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml)"
-  if [ -n "${EBS_INSTALL_SNAPSHOT_CUSTOM_IMAGE:-}" ]; then
-    SNAPSHOT_CONTROLLER_MANIFEST="$(yq ".spec.template.spec.containers[0].image=\"${EBS_INSTALL_SNAPSHOT_CUSTOM_IMAGE}\"" <<<${SNAPSHOT_CONTROLLER_MANIFEST})"
-  fi
-  kubectl apply --kubeconfig "${KUBECONFIG}" -f - <<<${SNAPSHOT_CONTROLLER_MANIFEST}
 fi
 
 if [[ "${HELM_CT_TEST}" != true ]]; then
diff --git a/hack/ebs-scale-test/README.md b/hack/ebs-scale-test/README.md
index a4c5a261..46260319 100644
--- a/hack/ebs-scale-test/README.md
+++ b/hack/ebs-scale-test/README.md
@@ -44,7 +44,7 @@ Note: The environment variables set when you run `scale-test setup` must remain
 # Affect test
 CLUSTER_TYPE              # Type of scalability cluster to create.
 TEST_TYPE                 # Type of scale test to run.
-REPLICAS                  # Number of StatefulSet replicas to create.
+REPLICAS                  # Number of StatefulSet replicas or snapshots to create.
 DRIVER_VALUES_FILEPATH    # Custom values file passed to EBS CSI Driver Helm chart.
 
 # Names
@@ -53,6 +53,9 @@ EXPORT_DIR                # Where to export scale test metrics/logs locally.
 S3_BUCKET                 # Name of S3 bucket used for holding scalability run results.
 SCALABILITY_TEST_RUN_NAME # Name of test run. Used as name of directory for adding run results in $S3_BUCKET.
 
+# Snapshot
+SNAPSHOTS_PER_VOLUME # How many snapshots per volume
+
 # Find default values at top of `scale-test` script. 
 ```
 
@@ -66,6 +69,7 @@ Set the `CLUSTER_TYPE` and `TEST_TYPE` environment variables to set up and run d
 - `TEST_TYPE` dictates what type of scalability test we want to run. Options include: 
   - 'scale-sts': Scales a StatefulSet to `$REPLICAS`. Waits for all pods to be ready. Delete Sts. Waits for all PVs to be deleted. Exercises the complete dynamic provisioning lifecycle for block volumes.
   - 'expand-and-modify': Creates `$REPLICAS` block volumes. Patches PVC capacity and VACName at rate of 5 PVCs per second. Ensures PVCs are expanded and modified before deleting them. Exercises ControllerExpandVolume & ControllerModifyVolume. Set `MODIFY_ONLY` or `EXPAND_ONLY` to 'true' to test solely volume modification/expansion.
+  - 'snapshot-volume-scale': Creates `$REPLICAS` number of volumes. Takes `$SNAPSHOTS_PER_VOLUME` snapshots of each volume.
 
 You can mix and match `CLUSTER_TYPE` and `TEST_TYPE`.
 
diff --git a/hack/ebs-scale-test/helpers/cluster-setup/manage-cluster.sh b/hack/ebs-scale-test/helpers/cluster-setup/manage-cluster.sh
index ba86de75..362934d5 100755
--- a/hack/ebs-scale-test/helpers/cluster-setup/manage-cluster.sh
+++ b/hack/ebs-scale-test/helpers/cluster-setup/manage-cluster.sh
@@ -41,13 +41,22 @@ cleanup_cluster() {
 
 check_lingering_volumes() {
   lingering_vol_count=$(aws ec2 describe-volumes \
-    --filters "Name=tag-key,Values=ebs-scale-test" \
+    --filters "Name=tag:ebs-scale-test,Values=${SCALABILITY_TEST_RUN_NAME}" \
     --query 'length(Volumes[*])' \
     --output text)
 
   [[ lingering_vol_count -ne 0 ]] && echo "WARNING: detected $lingering_vol_count lingering ebs-scale-test EBS volumes in $AWS_ACCOUNT_ID. Please run \`aws ec2 describe-volumes --filters 'Name=tag-key,Values=ebs-scale-test'\` and audit their AWS resource tags. Note these volumes may belong to a different scalability run than $SCALABILITY_TEST_RUN_NAME"
 }
 
+check_lingering_snapshots() {
+  lingering_snap_count=$(aws ec2 describe-snapshots \
+    --filters "Name=tag:ebs-scale-test,Values=${SCALABILITY_TEST_RUN_NAME}" \
+    --query 'length(Snapshots[*])' \
+    --output text)
+
+  [[ lingering_snap_count -ne 0 ]] && echo "WARNING: detected $lingering_snap_count lingering ebs-scale-test EBS snapshots from run ${SCALABILITY_TEST_RUN_NAME} in $AWS_ACCOUNT_ID. Please run \`aws ec2 describe-snapshots --filters 'Name=tag:ebs-scale-test,Values=${SCALABILITY_TEST_RUN_NAME}'\` and audit their AWS resource tags."
+}
+
 ## EBS CSI Driver
 
 deploy_ebs_csi_driver() {
@@ -67,3 +76,12 @@ deploy_ebs_csi_driver() {
   echo "This script is not meant to be run directly, only sourced as a helper!"
   exit 1
 )
+
+deploy_snapshot_controller() {
+  echo "Deploying snapshot controller and CRDs"
+  kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
+  kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
+  kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
+  kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
+  kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${EBS_INSTALL_SNAPSHOT_VERSION}"/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
+}
diff --git a/hack/ebs-scale-test/helpers/cluster-setup/scale-driver-values.yaml b/hack/ebs-scale-test/helpers/cluster-setup/scale-driver-values.yaml
index c6b9239d..244f5c97 100644
--- a/hack/ebs-scale-test/helpers/cluster-setup/scale-driver-values.yaml
+++ b/hack/ebs-scale-test/helpers/cluster-setup/scale-driver-values.yaml
@@ -27,3 +27,6 @@ sidecars:
     additionalArgs: ["--http-endpoint=:8082"]
   attacher:
     additionalArgs: ["--http-endpoint=:8084"]
+  snapshotter:
+    additionalArgs: ["--http-endpoint=:8085"]
+  
\ No newline at end of file
diff --git a/hack/ebs-scale-test/helpers/scale-test/collect-and-export-metrics.sh b/hack/ebs-scale-test/helpers/scale-test/collect-and-export-metrics.sh
index d4ad1b2f..1a1538da 100755
--- a/hack/ebs-scale-test/helpers/scale-test/collect-and-export-metrics.sh
+++ b/hack/ebs-scale-test/helpers/scale-test/collect-and-export-metrics.sh
@@ -48,9 +48,11 @@ collect_metrics() {
   PID_8082=$!
   kubectl port-forward "$CONTROLLER_POD_NAME" 8084:8084 -n kube-system &
   PID_8084=$!
+  kubectl port-forward "$CONTROLLER_POD_NAME" 8085:8085 -n kube-system &
+  PID_8085=$!
 
   echo "Collecting metrics"
-  for port in 3301 8081 8082 8084; do
+  for port in 3301 8081 8082 8084 8085; do
     curl "http://localhost:${port}/metrics" >>"$METRICS_FILEPATH" && continue
     echo "Failed to collect metrics from port ${port}, retrying after 5s..."
     sleep 5
@@ -63,7 +65,7 @@ collect_metrics() {
     echo "WARNING: Could not collect metrics from port ${port}. Something may be wrong in cluster."
   done
   # Stop forwarding ports after metrics collected.
-  kill $PID_3301 $PID_8081 $PID_8082 $PID_8084
+  kill $PID_3301 $PID_8081 $PID_8082 $PID_8084 $PID_8085
 }
 
 clean_metrics() {
diff --git a/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.sh b/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.sh
new file mode 100644
index 00000000..a3d9e9b7
--- /dev/null
+++ b/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.sh
@@ -0,0 +1,193 @@
+#!/bin/bash
+
+# Copyright 2025 The Kubernetes Authors.
+#
+# Licensed 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.
+
+# We expect this helper script is sourced from hack/ebs-scale-test
+path_to_snapshot_test_dir="${BASE_DIR}/helpers/scale-test/snapshot-volume-scale-test"
+
+export SNAPSHOTS_PER_VOLUME=${SNAPSHOTS_PER_VOLUME:=1}
+
+snapshot_scale_test() {
+  manifest_path="$path_to_snapshot_test_dir/snapshot-volume-scale.yaml"
+  export_manifest_path="$EXPORT_DIR/snapshot-manifest.yaml"
+
+  echo "Applying $manifest_path. Exported to $export_manifest_path"
+  gomplate -f "$manifest_path" -o "$export_manifest_path"
+  kubectl apply -f "$export_manifest_path"
+
+  trap 'echo "Test interrupted! Deleting test resources to prevent leak"; cleanup_snapshot_resources' EXIT
+
+  echo "Waiting for all PVCs to be bound"
+  wait_for_pvcs_bound
+
+  echo "Creating $REPLICAS volume snapshots ($SNAPSHOTS_PER_VOLUME per volume)"
+  create_snapshots
+
+  echo "Waiting for snapshots to be ready"
+  wait_for_snapshots_ready
+
+  echo "Restoring volumes from snapshots"
+  restore_volumes_from_snapshots
+
+  echo "Waiting for restored PVCs to be bound"
+  wait_for_restored_pvcs_bound
+
+  echo "Deleting snapshots"
+  delete_snapshots
+
+  echo "Waiting for VolumeSnapshotContents to be deleted"
+  wait_for_volume_snapshot_contents_deleted
+
+  echo "Deleting PVCs"
+  delete_pvcs
+
+  echo "Waiting for PVs to be deleted"
+  wait_for_pvs_deleted
+
+  echo "Cleaning up snapshot resources"
+  cleanup_snapshot_resources
+
+  trap - EXIT
+}
+
+wait_for_pvcs_bound() {
+  while true; do
+    bound_pvc_count=$(kubectl get pvc -l app=snapshot-scale-test -o json | jq '.items | map(select(.status.phase == "Bound")) | length')
+    if [[ "$bound_pvc_count" -ge "$REPLICAS" ]]; then
+      echo "All PVCs bound, proceeding..."
+      break
+    else
+      echo "Only $bound_pvc_count PVCs are bound, waiting for a total of $REPLICAS..."
+      sleep 5
+    fi
+  done
+}
+
+create_snapshots() {
+  for i in {0..$(($REPLICAS - 1))}; do
+    for j in {1..$SNAPSHOTS_PER_VOLUME}; do
+      cat <<EOF | kubectl apply -f -
+apiVersion: snapshot.storage.k8s.io/v1
+kind: VolumeSnapshot
+metadata:
+  name: snapshot-volume-$i-$j
+  labels:
+    app: snapshot-scale-test
+spec:
+  volumeSnapshotClassName: csi-aws-vsc
+  source:
+    persistentVolumeClaimName: snapshot-pvc-$i
+EOF
+    done
+  done
+}
+
+wait_for_snapshots_ready() {
+  expected_REPLICAS=$((REPLICAS * SNAPSHOTS_PER_VOLUME))
+  while true; do
+    ready_REPLICAS=$(kubectl get volumesnapshot -l app=snapshot-scale-test -o json | jq '.items | map(select(.status.readyToUse == true)) | length')
+    if [[ "$ready_REPLICAS" -ge "$expected_REPLICAS" ]]; then
+      echo "All snapshots ready to use, proceeding..."
+      break
+    else
+      echo "$ready_REPLICAS/$expected_REPLICAS snapshots ready to use, waiting..."
+      sleep 5
+    fi
+  done
+}
+
+restore_volumes_from_snapshots() {
+  for i in $(seq 0 $(($REPLICAS - 1))); do
+    cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: restored-pvc-$i
+  labels:
+    app: snapshot-scale-test
+    type: restored
+spec:
+  accessModes:
+    - ReadWriteOnce
+  storageClassName: ebs-snapshot-test
+  resources:
+    requests:
+      storage: 1Gi
+  dataSource:
+    name: snapshot-volume-$i-1
+    kind: VolumeSnapshot
+    apiGroup: snapshot.storage.k8s.io
+EOF
+  done
+}
+
+wait_for_restored_pvcs_bound() {
+  while true; do
+    bound_pvc_count=$(kubectl get pvc -l app=snapshot-scale-test,type=restored -o json | jq '.items | map(select(.status.phase == "Bound")) | length')
+    if [[ "$bound_pvc_count" -ge "$REPLICAS" ]]; then
+      echo "All restored PVCs bound, proceeding..."
+      break
+    else
+      echo "Only $bound_pvc_count restored PVCs are bound, waiting for a total of $REPLICAS..."
+      sleep 5
+    fi
+  done
+}
+
+delete_snapshots() {
+  kubectl delete volumesnapshot -l app=snapshot-scale-test
+}
+
+wait_for_volume_snapshot_contents_deleted() {
+  while true; do
+    snapshot_content_count=$(kubectl get volumesnapshotcontent -o json | jq '.items | map(select(.spec.volumeSnapshotRef.name | startswith("snapshot-volume-"))) | length')
+    if [[ "$snapshot_content_count" -eq 0 ]]; then
+      echo "All VolumeSnapshotContents deleted, proceeding..."
+      break
+    else
+      echo "$snapshot_content_count VolumeSnapshotContents still exist, waiting..."
+      sleep 5
+    fi
+  done
+}
+
+delete_pvcs() {
+  kubectl delete pvc -l app=snapshot-scale-test
+}
+
+wait_for_pvs_deleted() {
+  while true; do
+    pv_count=$(kubectl get pv -o json | jq '.items | map(select(.spec.claimRef.name | startswith("snapshot-pvc-") or startswith("restored-pvc-"))) | length')
+    if [[ "$pv_count" -eq 0 ]]; then
+      echo "All PVs deleted, proceeding..."
+      break
+    else
+      echo "$pv_count PVs still exist, waiting..."
+      sleep 5
+    fi
+  done
+}
+
+cleanup_snapshot_resources() {
+  kubectl delete volumesnapshotclass csi-aws-vsc --ignore-not-found=true
+  kubectl delete sc ebs-snapshot-test --ignore-not-found=true
+  kubectl delete volumesnapshot -l app=snapshot-scale-test --ignore-not-found=true
+  kubectl delete pvc -l app=snapshot-scale-test --ignore-not-found=true
+}
+
+(return 0 2>/dev/null) || (
+  echo "This script is not meant to be run directly, only sourced as a helper!"
+  exit 1
+)
diff --git a/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.yaml b/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.yaml
new file mode 100644
index 00000000..503bb3ee
--- /dev/null
+++ b/hack/ebs-scale-test/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.yaml
@@ -0,0 +1,50 @@
+# Copyright 2025 The Kubernetes Authors.
+#
+# Licensed 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.
+
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: ebs-snapshot-test
+provisioner: ebs.csi.aws.com
+reclaimPolicy: Delete
+volumeBindingMode: Immediate
+parameters:
+  type: gp2
+  tagSpecification_1: "ebs-scale-test={{ .Env.SCALABILITY_TEST_RUN_NAME }}"
+---
+apiVersion: snapshot.storage.k8s.io/v1
+kind: VolumeSnapshotClass
+metadata:
+  name: csi-aws-vsc
+driver: ebs.csi.aws.com
+deletionPolicy: Delete
+parameters:
+  tagSpecification_1: "ebs-scale-test={{ .Env.SCALABILITY_TEST_RUN_NAME }}"
+---
+{{- range $index := seq 0 (sub .Env.REPLICAS 1) }}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: snapshot-pvc-{{ $index }}
+  labels:
+    app: snapshot-scale-test
+spec:
+  accessModes:
+    - ReadWriteOnce
+  storageClassName: ebs-snapshot-test
+  resources:
+    requests:
+      storage: 1Gi
+---
+{{- end }}
diff --git a/hack/ebs-scale-test/scale-test b/hack/ebs-scale-test/scale-test
index e0ac3738..ff554b8e 100755
--- a/hack/ebs-scale-test/scale-test
+++ b/hack/ebs-scale-test/scale-test
@@ -31,6 +31,7 @@ export SCALABILITY_TEST_RUN_NAME
 CLUSTER_TYPE=${CLUSTER_TYPE:="pre-allocated"}
 TEST_TYPE=${TEST_TYPE:="scale-sts"}
 REPLICAS=${REPLICAS:=1000}
+EBS_INSTALL_SNAPSHOT_VERSION=${EBS_INSTALL_SNAPSHOT_VERSION:-"v8.2.1"}
 DRIVER_VALUES_FILEPATH=${DRIVER_VALUES_FILEPATH:="$BASE_DIR/helpers/cluster-setup/scale-driver-values.yaml"}
 
 CLUSTER_NAME=${CLUSTER_NAME:="ebs-scale-$CLUSTER_TYPE"}
@@ -57,6 +58,7 @@ source "${BASE_DIR}/helpers/scale-test/pre_test_validation.sh"
 
 source "${BASE_DIR}/helpers/scale-test/scale-sts-test/scale-sts.sh"
 source "${BASE_DIR}/helpers/scale-test/expand-and-modify-test/expand-and-modify.sh"
+source "${BASE_DIR}/helpers/scale-test/snapshot-volume-scale-test/snapshot-volume-scale.sh"
 
 usage() {
   echo "Usage: $0 [base-cmd]"
@@ -80,6 +82,7 @@ check_dependencies_helper() {
 # Functions sourced from helpers/cluster-setup/manage-cluster.sh
 setup_scale() {
   create_cluster
+  deploy_snapshot_controller
   deploy_ebs_csi_driver
 }
 
@@ -90,8 +93,9 @@ run_scale() {
   case "$TEST_TYPE" in
   *scale-sts*) sts_scale_test ;;
   *expand-and-modify*) expand_and_modify_test ;;
+  *snapshot-volume-scale*) snapshot_scale_test ;;
   *)
-    echo "Invalid TEST_TYPE '$TEST_TYPE'. Please set to 'scale-sts' or 'expand-and-modify'"
+    echo "Invalid TEST_TYPE '$TEST_TYPE'."
     exit 1
     ;;
   esac
@@ -103,6 +107,7 @@ run_scale() {
 clean_scale() {
   cleanup_cluster
   check_lingering_volumes
+  check_lingering_snapshots
 }
 
 main() {
diff --git a/pkg/cloud/cloud_test.go b/pkg/cloud/cloud_test.go
index 4d1ff280..64a5ac4d 100644
--- a/pkg/cloud/cloud_test.go
+++ b/pkg/cloud/cloud_test.go
@@ -42,6 +42,7 @@ import (
 const (
 	defaultZone     = "test-az"
 	expZone         = "us-west-2b"
+	snowZone        = "snow"
 	defaultVolumeID = "vol-test-1234"
 	defaultNodeID   = "node-1234"
 	defaultPath     = "/dev/xvdaa"
@@ -1262,6 +1263,41 @@ func TestCreateDisk(t *testing.T) {
 			},
 			expErr: nil,
 		},
+		{
+			name:       "success: create volume when zone is snow and add tags",
+			volumeName: "vol-test-name",
+			diskOptions: &DiskOptions{
+				CapacityBytes:    util.GiBToBytes(1),
+				Tags:             map[string]string{VolumeNameTagKey: "vol-test", AwsEbsDriverTagKey: "true"},
+				AvailabilityZone: snowZone,
+				VolumeType:       "sbp1",
+			},
+			expCreateVolumeInput: &ec2.CreateVolumeInput{},
+			expDisk: &Disk{
+				VolumeID:         "vol-test",
+				CapacityGiB:      1,
+				AvailabilityZone: snowZone,
+			},
+			expErr: nil,
+		},
+		{
+			name:       "fail: zone is snow and add tags throws error",
+			volumeName: "vol-test-name",
+			diskOptions: &DiskOptions{
+				CapacityBytes:    util.GiBToBytes(1),
+				Tags:             map[string]string{VolumeNameTagKey: "vol-test", AwsEbsDriverTagKey: "true"},
+				AvailabilityZone: snowZone,
+				VolumeType:       "sbg1",
+			},
+			expCreateVolumeInput: &ec2.CreateVolumeInput{},
+			expCreateTagsErr:     errors.New("CreateTags generic error"),
+			expDisk: &Disk{
+				VolumeID:         "vol-test",
+				CapacityGiB:      1,
+				AvailabilityZone: snowZone,
+			},
+			expErr: errors.New("could not attach tags to volume: vol-test. CreateTags generic error"),
+		},
 		{
 			name:       "success: create default volume with throughput",
 			volumeName: "vol-test-name",
@@ -1300,40 +1336,6 @@ func TestCreateDisk(t *testing.T) {
 			},
 			expErr: nil,
 		},
-		{
-			name:       "success: create volume from snapshot with initialization rate",
-			volumeName: "vol-test-name",
-			diskOptions: &DiskOptions{
-				CapacityBytes:            util.GiBToBytes(1),
-				Tags:                     map[string]string{VolumeNameTagKey: "vol-test", AwsEbsDriverTagKey: "true"},
-				SnapshotID:               "snapshot-test",
-				VolumeInitializationRate: 200,
-			},
-			expDisk: &Disk{
-				VolumeID:         "vol-test",
-				CapacityGiB:      1,
-				AvailabilityZone: defaultZone,
-			},
-			expCreateVolumeInput: &ec2.CreateVolumeInput{
-				VolumeInitializationRate: aws.Int32(200),
-			},
-			expErr: nil,
-		},
-		{
-			name:       "failure: create volume from snapshot with initialization rate when snapshotID is missing",
-			volumeName: "vol-test-name",
-			diskOptions: &DiskOptions{
-				CapacityBytes:            util.GiBToBytes(1),
-				Tags:                     map[string]string{VolumeNameTagKey: "vol-test", AwsEbsDriverTagKey: "true"},
-				VolumeInitializationRate: 200,
-			},
-			expDisk: nil,
-			expCreateVolumeInput: &ec2.CreateVolumeInput{
-				VolumeInitializationRate: aws.Int32(200),
-			},
-			expCreateVolumeErr: errors.New("InvalidParameterCombination"),
-			expErr:             fmt.Errorf("could not create volume in EC2: %w", errors.New("InvalidParameterCombination")),
-		},
 		{
 			name:       "failure: multi-attach with GP3",
 			volumeName: "vol-test-name",
@@ -1403,6 +1405,10 @@ func TestCreateDisk(t *testing.T) {
 						},
 					},
 				}, tc.expDescVolumeErr).AnyTimes()
+				if tc.diskOptions.AvailabilityZone == "snow" {
+					mockEC2.EXPECT().CreateTags(gomock.Any(), gomock.Any()).Return(&ec2.CreateTagsOutput{}, tc.expCreateTagsErr)
+					mockEC2.EXPECT().DeleteVolume(gomock.Any(), gomock.Any(), gomock.Any()).Return(&ec2.DeleteVolumeOutput{}, nil).AnyTimes()
+				}
 				if len(tc.diskOptions.SnapshotID) > 0 {
 					mockEC2.EXPECT().DescribeSnapshots(gomock.Any(), gomock.Any()).Return(&ec2.DescribeSnapshotsOutput{Snapshots: []types.Snapshot{snapshot}}, nil).AnyTimes()
 				}
@@ -3240,7 +3246,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 	testCases := []struct {
 		name             string
 		volumeID         string
-		expectedState    types.VolumeAttachmentState
+		expectedState    string
 		expectedInstance string
 		expectedDevice   string
 		alreadyAssigned  bool
@@ -3249,7 +3255,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "success: attached",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3258,7 +3264,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "success: detached",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateDetached,
+			expectedState:    volumeDetachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3267,7 +3273,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "success: disk not found, assumed detached",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateDetached,
+			expectedState:    volumeDetachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3276,7 +3282,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "success: multiple attachments with Multi-Attach enabled",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3285,7 +3291,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: disk not found, expected attached",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3294,7 +3300,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: unexpected device",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   "/dev/xvdab",
 			alreadyAssigned:  false,
@@ -3303,7 +3309,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: unexpected instance",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1235",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3312,7 +3318,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: already assigned but detached state",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  true,
@@ -3321,7 +3327,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: already assigned but attaching state",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  true,
@@ -3330,7 +3336,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 		{
 			name:             "failure: multiple attachments with Multi-Attach disabled",
 			volumeID:         "vol-test-1234",
-			expectedState:    types.VolumeAttachmentStateAttached,
+			expectedState:    volumeAttachedState,
 			expectedInstance: "1234",
 			expectedDevice:   defaultPath,
 			alreadyAssigned:  false,
@@ -3396,7 +3402,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 				mockEC2.EXPECT().DescribeVolumes(gomock.Any(), gomock.Any()).Return(&ec2.DescribeVolumesOutput{Volumes: []types.Volume{attachedVol}}, nil).AnyTimes()
 			}
 
-			attachment, err := c.WaitForAttachmentState(ctx, tc.expectedState, tc.volumeID, tc.expectedInstance, tc.expectedDevice, tc.alreadyAssigned)
+			attachment, err := c.WaitForAttachmentState(ctx, tc.volumeID, tc.expectedState, tc.expectedInstance, tc.expectedDevice, tc.alreadyAssigned)
 
 			if tc.expectError {
 				if err == nil {
@@ -3407,7 +3413,7 @@ func TestWaitForAttachmentState(t *testing.T) {
 					t.Fatalf("WaitForAttachmentState() failed: expected no error, got %v", err)
 				}
 
-				if tc.expectedState == types.VolumeAttachmentStateAttached {
+				if tc.expectedState == volumeAttachedState {
 					if attachment == nil {
 						t.Fatal("WaiForAttachmentState() failed: expected attachment, got nothing")
 					}
diff --git a/pkg/cloud/metadata/metadata_test.go b/pkg/cloud/metadata/metadata_test.go
index aa1ffd43..57a1d5ac 100644
--- a/pkg/cloud/metadata/metadata_test.go
+++ b/pkg/cloud/metadata/metadata_test.go
@@ -152,13 +152,7 @@ func TestNewMetadataService(t *testing.T) {
 				require.EqualError(t, err, tc.expectedError.Error())
 			} else {
 				require.NoError(t, err)
-				assert.Equal(t, tc.expectedMetadata.InstanceID, metadata.GetInstanceID())
-				assert.Equal(t, tc.expectedMetadata.InstanceType, metadata.GetInstanceType())
-				assert.Equal(t, tc.expectedMetadata.Region, metadata.GetRegion())
-				assert.Equal(t, tc.expectedMetadata.AvailabilityZone, metadata.GetAvailabilityZone())
-				assert.Equal(t, tc.expectedMetadata.NumAttachedENIs, metadata.GetNumAttachedENIs())
-				assert.Equal(t, tc.expectedMetadata.NumBlockDeviceMappings, metadata.GetNumBlockDeviceMappings())
-				assert.Equal(t, tc.expectedMetadata.OutpostArn, metadata.GetOutpostArn())
+				require.Equal(t, tc.expectedMetadata, metadata)
 			}
 		})
 	}
@@ -169,10 +163,11 @@ func TestEC2MetadataInstanceInfo(t *testing.T) {
 	defer ctrl.Finish()
 
 	testCases := []struct {
-		name             string
-		mockEC2Metadata  func(m *MockEC2Metadata)
-		expectedMetadata *Metadata
-		expectedError    error
+		name              string
+		regionFromSession string
+		mockEC2Metadata   func(m *MockEC2Metadata)
+		expectedMetadata  *Metadata
+		expectedError     error
 	}{
 		{
 			name: "TestEC2MetadataInstanceInfo: Error getting instance identity document",
@@ -367,6 +362,33 @@ func TestEC2MetadataInstanceInfo(t *testing.T) {
 				OutpostArn:             arn.ARN{},
 			},
 		},
+		{
+			name:              "TestEC2MetadataInstanceInfo: Valid metadata retrieving snow region/AZ from session",
+			regionFromSession: "snow",
+			mockEC2Metadata: func(m *MockEC2Metadata) {
+				m.EXPECT().GetInstanceIdentityDocument(gomock.Any(), &imds.GetInstanceIdentityDocumentInput{}).Return(&imds.GetInstanceIdentityDocumentOutput{
+					InstanceIdentityDocument: imds.InstanceIdentityDocument{
+						InstanceID:       "i-1234567890abcdef0",
+						InstanceType:     "c5.xlarge",
+						Region:           "",
+						AvailabilityZone: "",
+					},
+				}, nil)
+				m.EXPECT().GetMetadata(gomock.Any(), &imds.GetMetadataInput{Path: EnisEndpoint}).Return(&imds.GetMetadataOutput{
+					Content: io.NopCloser(strings.NewReader("01:23:45:67:89:ab\n02:23:45:67:89:ab")),
+				}, nil)
+				m.EXPECT().GetMetadata(gomock.Any(), &imds.GetMetadataInput{Path: OutpostArnEndpoint}).Return(nil, errors.New("404 - Not Found"))
+			},
+			expectedMetadata: &Metadata{
+				InstanceID:             "i-1234567890abcdef0",
+				InstanceType:           "c5.xlarge",
+				Region:                 "snow",
+				AvailabilityZone:       "snow",
+				NumAttachedENIs:        2,
+				NumBlockDeviceMappings: 0,
+				OutpostArn:             arn.ARN{},
+			},
+		},
 	}
 
 	for _, tc := range testCases {
@@ -377,20 +399,14 @@ func TestEC2MetadataInstanceInfo(t *testing.T) {
 			mockEC2Metadata := NewMockEC2Metadata(mockCtrl)
 			tc.mockEC2Metadata(mockEC2Metadata)
 
-			metadata, err := EC2MetadataInstanceInfo(mockEC2Metadata)
+			metadata, err := EC2MetadataInstanceInfo(mockEC2Metadata, tc.regionFromSession)
 
 			if tc.expectedError != nil {
 				require.EqualError(t, err, tc.expectedError.Error())
 				require.Nil(t, metadata)
 			} else {
 				require.NoError(t, err)
-				assert.Equal(t, tc.expectedMetadata.InstanceID, metadata.GetInstanceID())
-				assert.Equal(t, tc.expectedMetadata.InstanceType, metadata.GetInstanceType())
-				assert.Equal(t, tc.expectedMetadata.Region, metadata.GetRegion())
-				assert.Equal(t, tc.expectedMetadata.AvailabilityZone, metadata.GetAvailabilityZone())
-				assert.Equal(t, tc.expectedMetadata.NumAttachedENIs, metadata.GetNumAttachedENIs())
-				assert.Equal(t, tc.expectedMetadata.NumBlockDeviceMappings, metadata.GetNumBlockDeviceMappings())
-				assert.Equal(t, tc.expectedMetadata.OutpostArn, metadata.GetOutpostArn())
+				require.Equal(t, tc.expectedMetadata, metadata)
 			}
 		})
 	}
diff --git a/pkg/driver/controller_test.go b/pkg/driver/controller_test.go
index 2183bad6..b80e56f7 100644
--- a/pkg/driver/controller_test.go
+++ b/pkg/driver/controller_test.go
@@ -377,101 +377,6 @@ func TestCreateVolume(t *testing.T) {
 				checkExpectedErrorCode(t, err, codes.AlreadyExists)
 			},
 		},
-		{
-			name: "success with valid initialization rate from snapshot",
-			testFunc: func(t *testing.T) {
-				t.Helper()
-				req := &csi.CreateVolumeRequest{
-					Name:               "vol-test",
-					CapacityRange:      stdCapRange,
-					VolumeCapabilities: stdVolCap,
-					Parameters: map[string]string{
-						VolumeInitializationRateKey: "200",
-					},
-					VolumeContentSource: &csi.VolumeContentSource{
-						Type: &csi.VolumeContentSource_Snapshot{
-							Snapshot: &csi.VolumeContentSource_SnapshotSource{
-								SnapshotId: "snapshot-test",
-							},
-						},
-					},
-				}
-
-				mockDisk := &cloud.Disk{
-					VolumeID:         req.GetName(),
-					AvailabilityZone: expZone,
-					CapacityGiB:      util.BytesToGiB(stdVolSize),
-					SnapshotID:       "snapshot-test",
-				}
-
-				mockCtl := gomock.NewController(t)
-				defer mockCtl.Finish()
-
-				mockCloud := cloud.NewMockCloud(mockCtl)
-				mockCloud.EXPECT().CreateDisk(gomock.Eq(t.Context()), gomock.Eq(req.GetName()),
-					gomock.Any()).DoAndReturn(func(_ context.Context, _ string, diskOptions *cloud.DiskOptions) (*cloud.Disk, error) {
-					if diskOptions.VolumeInitializationRate != 200 {
-						t.Errorf("Expected VolumeInitializationRate to be 200, got %d", diskOptions.VolumeInitializationRate)
-					}
-					return mockDisk, nil
-				})
-
-				awsDriver := ControllerService{
-					cloud:    mockCloud,
-					inFlight: internal.NewInFlight(),
-					options:  &Options{},
-				}
-
-				if _, err := awsDriver.CreateVolume(t.Context(), req); err != nil {
-					t.Fatalf("CreateVolume failed: %v", err)
-				}
-			},
-		},
-		{
-			name: "fail with invalid initialization rate value",
-			testFunc: func(t *testing.T) {
-				t.Helper()
-				req := &csi.CreateVolumeRequest{
-					Name:               "vol-test",
-					CapacityRange:      stdCapRange,
-					VolumeCapabilities: stdVolCap,
-					Parameters: map[string]string{
-						VolumeInitializationRateKey: "invalid",
-					},
-					VolumeContentSource: &csi.VolumeContentSource{
-						Type: &csi.VolumeContentSource_Snapshot{
-							Snapshot: &csi.VolumeContentSource_SnapshotSource{
-								SnapshotId: "snapshot-test",
-							},
-						},
-					},
-				}
-
-				mockCtl := gomock.NewController(t)
-				defer mockCtl.Finish()
-
-				mockCloud := cloud.NewMockCloud(mockCtl)
-
-				awsDriver := ControllerService{
-					cloud:    mockCloud,
-					inFlight: internal.NewInFlight(),
-					options:  &Options{},
-				}
-
-				_, err := awsDriver.CreateVolume(t.Context(), req)
-				if err == nil {
-					t.Fatal("Expected CreateVolume to fail but got no error")
-				}
-
-				srvErr, ok := status.FromError(err)
-				if !ok {
-					t.Fatalf("Could not get error status code from error: %v", srvErr)
-				}
-				if srvErr.Code() != codes.InvalidArgument {
-					t.Fatalf("Expected InvalidArgument but got: %s", srvErr.Code())
-				}
-			},
-		},
 		{
 			name: "fail no name",
 			testFunc: func(t *testing.T) {
diff --git a/pkg/driver/driver_test.go b/pkg/driver/driver_test.go
index 49bd0d25..73c44abb 100644
--- a/pkg/driver/driver_test.go
+++ b/pkg/driver/driver_test.go
@@ -30,7 +30,6 @@ func TestNewDriver(t *testing.T) {
 	mockCloud := cloud.NewMockCloud(ctrl)
 	mockMetadataService := metadata.NewMockMetadataService(ctrl)
 	mockMounter := mounter.NewMockMounter(ctrl)
-
 	mockKubernetesClient := NewMockKubernetesClient(ctrl)
 	testCases := []struct {
 		name          string
diff --git a/pkg/driver/node_test.go b/pkg/driver/node_test.go
index 6e3e8563..94452103 100644
--- a/pkg/driver/node_test.go
+++ b/pkg/driver/node_test.go
@@ -1057,6 +1057,18 @@ func TestGetVolumesLimit(t *testing.T) {
 			},
 			expectedVal: 10,
 		},
+		{
+			name: "sbeDeviceVolumeAttachmentLimit",
+			options: &Options{
+				VolumeAttachLimit: -1,
+			},
+			expectedVal: sbeDeviceVolumeAttachmentLimit,
+			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
+				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("snow")
+				return m
+			},
+		},
 		{
 			name: "t2.medium_volume_attach_limit",
 			options: &Options{
@@ -1066,6 +1078,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 38,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetInstanceType().Return("t2.medium")
 				return m
@@ -1080,6 +1093,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 36,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("t2.medium")
 				return m
 			},
@@ -1093,6 +1107,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 23,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("m5d.large")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(3)
@@ -1108,6 +1123,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 1,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("d3en.12xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1123,6 +1139,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 1,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("d3.8xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1138,6 +1155,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 127,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("m7i.48xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				return m
@@ -1151,6 +1169,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 1,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("t3.xlarge")
 				m.EXPECT().GetNumAttachedENIs().Return(40)
 				return m
@@ -1165,6 +1184,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 15,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("mac1.metal")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1180,6 +1200,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 18,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("u-12tb1.metal")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1195,6 +1216,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 24,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("g4dn.xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1210,6 +1232,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 24,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("g4ad.xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1225,6 +1248,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 21,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("g4dn.12xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1240,6 +1264,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 14,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("dl1.24xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1256,6 +1281,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 8,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("g5.48xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1272,6 +1298,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 25,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("inf1.xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1288,6 +1315,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 25,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("inf1.2xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1304,6 +1332,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 22,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("inf1.6xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1320,6 +1349,7 @@ func TestGetVolumesLimit(t *testing.T) {
 			expectedVal: 10,
 			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
 				m := metadata.NewMockMetadataService(ctrl)
+				m.EXPECT().GetRegion().Return("us-west-2")
 				m.EXPECT().GetInstanceType().Return("inf1.24xlarge")
 				m.EXPECT().GetNumBlockDeviceMappings().Return(0)
 				m.EXPECT().GetNumAttachedENIs().Return(1)
@@ -1929,29 +1959,6 @@ func TestNodeGetInfo(t *testing.T) {
 				m := metadata.NewMockMetadataService(ctrl)
 				m.EXPECT().GetInstanceID().Return("i-1234567890abcdef0")
 				m.EXPECT().GetAvailabilityZone().Return("us-west-2a")
-				m.EXPECT().UpdateMetadata().Return(nil)
-				m.EXPECT().GetOutpostArn().Return(arn.ARN{})
-				return m
-			},
-			expectedResp: &csi.NodeGetInfoResponse{
-				NodeId: "i-1234567890abcdef0",
-				AccessibleTopology: &csi.Topology{
-					Segments: map[string]string{
-						ZoneTopologyKey:          "us-west-2a",
-						WellKnownZoneTopologyKey: "us-west-2a",
-						OSTopologyKey:            runtime.GOOS,
-					},
-				},
-			},
-		},
-		{
-			name: "update_metadata_error",
-			metadataMock: func(ctrl *gomock.Controller) *metadata.MockMetadataService {
-				m := metadata.NewMockMetadataService(ctrl)
-				// When UpdateMedata returns an error, NodeGetInfo should continue execution.
-				m.EXPECT().UpdateMetadata().Return(errors.New("metadata update failed"))
-				m.EXPECT().GetInstanceID().Return("i-1234567890abcdef0")
-				m.EXPECT().GetAvailabilityZone().Return("us-west-2a")
 				m.EXPECT().GetOutpostArn().Return(arn.ARN{})
 				return m
 			},
@@ -1972,7 +1979,6 @@ func TestNodeGetInfo(t *testing.T) {
 				m := metadata.NewMockMetadataService(ctrl)
 				m.EXPECT().GetInstanceID().Return("i-1234567890abcdef0")
 				m.EXPECT().GetAvailabilityZone().Return("us-west-2a")
-				m.EXPECT().UpdateMetadata().Return(nil)
 				m.EXPECT().GetOutpostArn().Return(arn.ARN{
 					Partition: "aws",
 					Service:   "outposts",
diff --git a/pkg/metrics/async_test.go b/pkg/metrics/async_test.go
deleted file mode 100644
index 88732be7..00000000
--- a/pkg/metrics/async_test.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2025 The Kubernetes Authors.
-//
-// Licensed 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 metrics
-
-import (
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/aws/aws-sdk-go-v2/service/ec2/types"
-	"github.com/prometheus/client_golang/prometheus/testutil"
-	"github.com/prometheus/common/expfmt"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-// TODO: Replace sleep with time-based tests once Go testing/synctest stable in Go 1.25.
-const windowsRequiredSleepDuration = time.Millisecond * 75
-
-func TestAsyncCollector(t *testing.T) {
-	t.Parallel()
-
-	// Setup env
-	recorder := InitializeRecorder(false)
-	recorder.InitializeAsyncEC2Metrics(0)
-	reg := recorder.registry
-	a := assert.New(t)
-	req := require.New(t)
-
-	// Ensure no metrics exist on startup
-	a.Equal(0, testutil.CollectAndCount(reg, metricAsyncDetachSeconds))
-
-	// Track 3 async detachments
-	AsyncEC2Metrics().TrackDetachment("vol-a", "i-a", types.VolumeAttachmentStateDetaching)
-	AsyncEC2Metrics().TrackDetachment("vol-b", "i-b", types.VolumeAttachmentStateDetaching)
-	AsyncEC2Metrics().TrackDetachment("vol-c", "i-a", types.VolumeAttachmentStateDetaching)
-	time.Sleep(windowsRequiredSleepDuration)
-
-	// Validate metrics
-	metrics, err := testutil.CollectAndFormat(reg, expfmt.TypeTextPlain, metricAsyncDetachSeconds)
-	req.NoError(err)
-	splitmetrics := strings.Split(strings.ReplaceAll(string(metrics), "\r\n", "\n"), "\n") // Windows...
-
-	a.Equal(3, testutil.CollectAndCount(reg, metricAsyncDetachSeconds))
-	assertSomeMetricHasLabels(a, splitmetrics, []string{"vol-a", "i-a", string(types.VolumeAttachmentStateDetaching)})
-	assertSomeMetricHasLabels(a, splitmetrics, []string{"vol-b", "i-b", string(types.VolumeAttachmentStateDetaching)})
-	assertSomeMetricHasLabels(a, splitmetrics, []string{"vol-c", "i-a", string(types.VolumeAttachmentStateDetaching)})
-
-	// Lint all metrics
-	lint, err := testutil.GatherAndLint(reg)
-	req.NoError(err)
-	a.Empty(lint)
-
-	// Update 2 detachments
-	AsyncEC2Metrics().TrackDetachment("vol-a", "i-a", types.VolumeAttachmentStateBusy)
-	AsyncEC2Metrics().TrackDetachment("vol-c", "i-a", types.VolumeAttachmentStateDetaching)
-
-	// Clear 1 detachment
-	AsyncEC2Metrics().ClearDetachMetric("vol-b", "i-b")
-	time.Sleep(windowsRequiredSleepDuration)
-
-	// Validate metrics
-	metrics, err = testutil.CollectAndFormat(reg, expfmt.TypeTextPlain, metricAsyncDetachSeconds)
-	req.NoError(err)
-	splitmetrics = strings.Split(strings.ReplaceAll(string(metrics), "\r\n", "\n"), "\n") // Windows...
-
-	a.Equal(2, testutil.CollectAndCount(reg, metricAsyncDetachSeconds))
-	assertSomeMetricHasLabels(a, splitmetrics, []string{"vol-a", "i-a", string(types.VolumeAttachmentStateBusy)})
-	assertSomeMetricHasLabels(a, splitmetrics, []string{"vol-c", "i-a", string(types.VolumeAttachmentStateDetaching)})
-
-	assertNoMetricHasLabels(a, splitmetrics, []string{"vol-b", "i-b"})
-
-	// Test cleanup helper
-	AsyncEC2Metrics().cleanupCache(0)
-	time.Sleep(windowsRequiredSleepDuration)
-
-	a.Empty(AsyncEC2Metrics().detachingVolumes)
-	a.Equal(0, testutil.CollectAndCount(reg, metricAsyncDetachSeconds))
-}
-
-func assertSomeMetricHasLabels(assert *assert.Assertions, metrics, labels []string) {
-	assert.False(noMetricWithLabels(metrics, labels), "AsyncEC2Metrics are missing a metric with expected labels")
-}
-
-func assertNoMetricHasLabels(assert *assert.Assertions, metrics, labels []string) {
-	assert.True(noMetricWithLabels(metrics, labels), "AsyncEC2Metrics has a metric that shouldn't exist")
-}
-
-func noMetricWithLabels(metrics, labels []string) bool {
-	for _, m := range metrics {
-		b := true
-		for _, l := range labels {
-			if !strings.Contains(m, l) {
-				b = false
-			}
-		}
-		if b {
-			return false
-		}
-	}
-	return true
-}
diff --git a/pkg/mounter/mount_linux_test.go b/pkg/mounter/mount_linux_test.go
index b8665f38..0f44eb74 100644
--- a/pkg/mounter/mount_linux_test.go
+++ b/pkg/mounter/mount_linux_test.go
@@ -219,6 +219,18 @@ func TestFindDevicePath(t *testing.T) {
 			cmdOutputFsType: "ext4",
 			expectedErr:     fmt.Errorf("no device path for device %q volume %q found", "/temp/vol-1234567890abcdef0", "vol-1234567890abcdef0"),
 		},
+		{
+			name:            "SBE region fallback",
+			volumeID:        "vol-1234567890abcdef0",
+			partition:       "1",
+			region:          "snow",
+			createTempDir:   false,
+			symlink:         false,
+			verifyErr:       nil,
+			deviceSize:      "1024",
+			cmdOutputFsType: "ext4",
+			expectedErr:     nil,
+		},
 	}
 
 	for _, tc := range testCases {
@@ -275,6 +287,10 @@ func TestFindDevicePath(t *testing.T) {
 
 			result, err := fakeMounter.FindDevicePath(devicePath, tc.volumeID, tc.partition, tc.region)
 
+			if tc.region == "snow" {
+				expectedResult = "/dev/vd" + tc.volumeID[len(tc.volumeID)-1:] + tc.partition
+			}
+
 			if tc.expectedErr == nil {
 				assert.Equal(t, expectedResult, result)
 				assert.NoError(t, err)
diff --git a/tests/e2e/requires_aws_api.go b/tests/e2e/requires_aws_api.go
index ec4846d7..c5a56965 100644
--- a/tests/e2e/requires_aws_api.go
+++ b/tests/e2e/requires_aws_api.go
@@ -17,7 +17,6 @@ package e2e
 import (
 	"context"
 	"fmt"
-	"strconv"
 
 	"github.com/aws/aws-sdk-go-v2/aws"
 	"github.com/aws/aws-sdk-go-v2/config"
@@ -178,79 +177,6 @@ var _ = Describe("[ebs-csi-e2e] [single-az] [requires-aws-api] Dynamic Provision
 		test.Run(cs, snapshotrcs, ns)
 	})
 
-	It("should create a volume from a snapshot with initialization rate", func() {
-		restoredTagKey := generateTagName()
-		restoredTagVal := "volume-init-rate-test"
-		initRate := "200"
-
-		originalPod := testsuites.PodDetails{
-			Cmd: testsuites.PodCmdWriteToVolume("/mnt/test-1"),
-			Volumes: []testsuites.VolumeDetails{
-				{
-					CreateVolumeParameters: map[string]string{
-						ebscsidriver.VolumeTypeKey: awscloud.VolumeTypeGP3,
-						ebscsidriver.FSTypeKey:     ebscsidriver.FSTypeExt4,
-					},
-					ClaimSize:   driver.MinimumSizeForVolumeType(awscloud.VolumeTypeGP3),
-					VolumeMount: testsuites.DefaultGeneratedVolumeMount,
-				},
-			},
-		}
-
-		restoredPod := testsuites.PodDetails{
-			Cmd: testsuites.PodCmdGrepVolumeData("/mnt/test-1"),
-			Volumes: []testsuites.VolumeDetails{
-				{
-					CreateVolumeParameters: map[string]string{
-						ebscsidriver.VolumeTypeKey:               awscloud.VolumeTypeGP3,
-						ebscsidriver.FSTypeKey:                   ebscsidriver.FSTypeExt4,
-						ebscsidriver.VolumeInitializationRateKey: initRate,
-						ebscsidriver.TagKeyPrefix:                fmt.Sprintf("%s=%s", restoredTagKey, restoredTagVal),
-					},
-					ClaimSize:   driver.MinimumSizeForVolumeType(awscloud.VolumeTypeGP3),
-					VolumeMount: testsuites.DefaultGeneratedVolumeMount,
-				},
-			},
-		}
-
-		test := testsuites.DynamicallyProvisionedVolumeSnapshotTest{
-			CSIDriver:   ebsDriver,
-			Pod:         originalPod,
-			RestoredPod: restoredPod,
-
-			ValidateFunc: func(snapshot *volumesnapshotv1.VolumeSnapshot) {
-				intInitRate, err := strconv.Atoi(initRate)
-				if err != nil {
-					Fail(fmt.Sprintf("failed to parse initRate: %v", err))
-				}
-
-				result, err := ec2Client.DescribeVolumes(context.Background(), &ec2.DescribeVolumesInput{
-					Filters: []types.Filter{
-						{
-							Name:   aws.String("tag:" + restoredTagKey),
-							Values: []string{restoredTagVal},
-						},
-					},
-				})
-				if err != nil {
-					Fail(fmt.Sprintf("failed to describe volume: %v", err))
-				}
-				if len(result.Volumes) != 1 {
-					Fail(fmt.Sprintf("expected 1 volume, got %d", len(result.Volumes)))
-				}
-
-				vol := result.Volumes[0]
-				if vol.VolumeInitializationRate == nil {
-					Fail("VolumeInitializationRate is unexpectedly nil")
-				}
-				if *vol.VolumeInitializationRate != int32(intInitRate) {
-					Fail(fmt.Sprintf("VolumeInitializationRate mismatch: got %d, expected %d", *vol.VolumeInitializationRate, intInitRate))
-				}
-			},
-		}
-		test.Run(cs, snapshotrcs, ns)
-	})
-
 	It("should create a snapshot with FSR enabled", func() {
 		azList, err := ec2Client.DescribeAvailabilityZones(context.Background(), &ec2.DescribeAvailabilityZonesInput{})
 		if err != nil {
diff --git a/tests/sanity/fake_sanity_cloud.go b/tests/sanity/fake_sanity_cloud.go
index 065f6bdd..3861db1f 100644
--- a/tests/sanity/fake_sanity_cloud.go
+++ b/tests/sanity/fake_sanity_cloud.go
@@ -214,6 +214,6 @@ func (d *fakeCloud) ModifyTags(ctx context.Context, volumeID string, tagOptions
 	return nil
 }
 
-func (d *fakeCloud) WaitForAttachmentState(ctx context.Context, expectedState types.VolumeAttachmentState, volumeID string, expectedInstance string, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
+func (d *fakeCloud) WaitForAttachmentState(ctx context.Context, volumeID, expectedState, expectedInstance, expectedDevice string, alreadyAssigned bool) (*types.VolumeAttachment, error) {
 	return &types.VolumeAttachment{}, nil
 }
diff --git a/tests/sanity/fake_sanity_metadata_service.go b/tests/sanity/fake_sanity_metadata_service.go
index 9ab8c7bd..ea6b7eba 100644
--- a/tests/sanity/fake_sanity_metadata_service.go
+++ b/tests/sanity/fake_sanity_metadata_service.go
@@ -33,11 +33,6 @@ func newFakeMetadataService(id string, r string, az string, oa arn.ARN) *fakeMet
 		outpostArn:       oa,
 	}
 }
-
-func (m *fakeMetadataService) UpdateMetadata() error {
-	return nil
-}
-
 func (m *fakeMetadataService) GetInstanceID() string {
 	return m.instanceID
 }