Repository: rook/rook
Pull request #15066 (2024-11-26 14:18:51)

osd: fix device class label on osd pod
commit1: 
we were adding the device class as the
disk rotational type, but device class
can be user-defined, so if the user has
added the device class, use that value

commit2:
currently device class and device type
labels were clubbed with each other
create a separate label, as these two labels
can be separate

<!-- Thank you for contributing to Rook! -->

<!-- STEPS TO FOLLOW:
  1. Add a description of the changes (frequently the same as the commit description)
  2. Enter the issue number next to "Resolves #" below (if there is no tracking issue resolved, **remove that section**)
  3. Review our Contributing documentation at https://rook.io/docs/rook/latest/Contributing/development-flow/
  4. Follow the steps in the checklist below, starting with the **Commit Message Formatting**.
-->

<!-- Uncomment this section with the issue number if an issue is being resolved
**Issue resolved by this Pull Request:**
Resolves #
--->

**Checklist:**

- [ ] **Commit Message Formatting**: Commit titles and messages follow guidelines in the [developer guide](https://rook.io/docs/rook/latest/Contributing/development-flow/#commit-structure).
- [ ] Reviewed the developer guide on [Submitting a Pull Request](https://rook.io/docs/rook/latest/Contributing/development-flow/#submitting-a-pull-request)
- [ ] [Pending release notes](https://github.com/rook/rook/blob/master/PendingReleaseNotes.md) updated with breaking and/or notable changes for the next minor release.
- [ ] Documentation has been updated, if necessary.
- [ ] Unit tests have been added, if necessary.
- [ ] Integration tests have been added, if necessary.


parth-gr: Testing
```
  generateName: rook-ceph-osd-0-6ff7b44fd8-
  labels:
    app: rook-ceph-osd
    app.kubernetes.io/component: cephclusters.ceph.rook.io
    app.kubernetes.io/created-by: rook-ceph-operator
    app.kubernetes.io/instance: "0"
    app.kubernetes.io/managed-by: rook-ceph-operator
    app.kubernetes.io/name: ceph-osd
    app.kubernetes.io/part-of: ocs-storagecluster-cephcluster
    ceph-osd-id: "0"
    ceph.rook.io/DeviceSet: ocs-deviceset-0
    ceph.rook.io/pvc: ocs-deviceset-0-data-0q92gw
    ceph_daemon_id: "0"
    ceph_daemon_type: osd
    device-class: ssd
    device-type: ""

```
sp98: @parth-gr A few questions: 
- How will the device-class and device-type labels be used in the end? 
- The first commit mentions about using user-defined device class. How is that implemented? `GetDiskDeviceType` only returns `hdd`, `nvme` or `ssd`. 
sp98: > @parth-gr A few questions:
> 
> * How will the device-class and device-type labels be used in the end?
> * The first commit mentions about using user-defined device class. How is that implemented? `GetDiskDeviceType` only returns `hdd`, `nvme` or `ssd`.

Got the answer for my second question. Its being read from `CrushDeviceClassVarName` env. 
parth-gr: >How will the device-class and device-type labels be used in the end?

Device-class label will be used with topological spread constraints downstream, `device-type` label was planned to be used with monitoring but currently, it's not used...


sp98: > > How will the device-class and device-type labels be used in the end?
> 
> Device-class label will be used with topological spread constraints downstream, `device-type` label was planned to be used with monitoring but currently, it's not used...

should we remove `device-type` label if its not required? 
parth-gr: >So if 'device-type` label was added in this PR and it won't be used, then I think it should be removed.

I think it is still an important part of QA automation and dev debugging the clusters, as it is easy to look around the osd label to identify the disks

Patch:
diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml
index 3b31ef3e5..692eb645f 100644
--- a/.github/workflows/scorecards.yml
+++ b/.github/workflows/scorecards.yml
@@ -64,6 +64,6 @@ jobs:
       # Upload the results to GitHub's code scanning dashboard (optional).
       # Commenting out will disable upload of results to your repo's Code Scanning dashboard
       - name: "Upload to code-scanning"
-        uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
+        uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
         with:
           sarif_file: results.sarif
diff --git a/.mergify.yml b/.mergify.yml
index 45938a112..28efa4c2c 100644
--- a/.mergify.yml
+++ b/.mergify.yml
@@ -15,6 +15,111 @@ pull_request_rules:
       comment:
         message: Hi @{{author}}, this pull request was opened against a release branch, is it expected? Normally patches should go in the master branch first and then be backported to release branches.
 
+  # release-1.11 branch
+  - name: automerge backport release-1.11
+    conditions:
+      - author=mergify[bot]
+      - base=release-1.11
+      - label!=do-not-merge
+      - "status-success=DCO"
+      - "check-success=linux-build-all (1.19)"
+      - "check-success=unittests"
+      - "check-success=golangci-lint"
+      - "check-success=codegen"
+      - "check-success=codespell"
+      - "check-success=lint"
+      - "check-success=modcheck"
+      - "check-success=Shellcheck"
+      - "check-success=yaml-linter"
+      - "check-success=lint-test"
+      - "check-success=gen-rbac"
+      - "check-success=crds-gen"
+      - "check-success=docs-check"
+      - "check-success=pylint"
+      - "check-success=canary"
+      - "check-success=raw-disk"
+      - "check-success=two-osds-in-device"
+      - "check-success=osd-with-metadata-device"
+      - "check-success=encryption"
+      - "check-success=lvm"
+      - "check-success=pvc"
+      - "check-success=pvc-db"
+      - "check-success=pvc-db-wal"
+      - "check-success=encryption-pvc"
+      - "check-success=encryption-pvc-db"
+      - "check-success=encryption-pvc-db-wal"
+      - "check-success=encryption-pvc-kms-vault-token-auth"
+      - "check-success=encryption-pvc-kms-vault-k8s-auth"
+      - "check-success=lvm-pvc"
+      - "check-success=rgw-multisite-testing"
+      - "check-success=TestCephSmokeSuite (v1.21.14)"
+      - "check-success=TestCephSmokeSuite (v1.26.1)"
+      - "check-success=TestCephHelmSuite (v1.21.14)"
+      - "check-success=TestCephHelmSuite (v1.26.1)"
+      - "check-success=TestCephMultiClusterDeploySuite (v1.26.1)"
+      - "check-success=TestCephUpgradeSuite (v1.21.14)"
+      - "check-success=TestCephUpgradeSuite (v1.26.1)"
+      - "check-success=TestHelmUpgradeSuite (v1.21.14)"
+      - "check-success=TestHelmUpgradeSuite (v1.26.1)"
+    actions:
+      merge:
+        method: merge
+      dismiss_reviews: {}
+      delete_head_branch: {}
+
+  # release-1.12 branch
+  - name: automerge backport release-1.12
+    conditions:
+      - author=mergify[bot]
+      - base=release-1.12
+      - label!=do-not-merge
+      - "status-success=DCO"
+      - "check-success=linux-build-all (1.21)"
+      - "check-success=unittests"
+      - "check-success=golangci-lint"
+      - "check-success=codegen"
+      - "check-success=codespell"
+      - "check-success=lint"
+      - "check-success=modcheck"
+      - "check-success=Shellcheck"
+      - "check-success=yaml-linter"
+      - "check-success=lint-test"
+      - "check-success=gen-rbac"
+      - "check-success=crds-gen"
+      - "check-success=docs-check"
+      - "check-success=pylint"
+      - "check-success=canary"
+      - "check-success=raw-disk"
+      - "check-success=two-osds-in-device"
+      - "check-success=osd-with-metadata-device"
+      - "check-success=encryption"
+      - "check-success=lvm"
+      - "check-success=pvc"
+      - "check-success=pvc-db"
+      - "check-success=pvc-db-wal"
+      - "check-success=encryption-pvc"
+      - "check-success=encryption-pvc-db"
+      - "check-success=encryption-pvc-db-wal"
+      - "check-success=encryption-pvc-kms-vault-token-auth"
+      - "check-success=encryption-pvc-kms-vault-k8s-auth"
+      - "check-success=lvm-pvc"
+      - "check-success=rgw-multisite-testing"
+      - "check-success=TestCephSmokeSuite (v1.22.17)"
+      - "check-success=TestCephSmokeSuite (v1.28.0)"
+      - "check-success=TestCephHelmSuite (v1.22.17)"
+      - "check-success=TestCephHelmSuite (v1.28.0)"
+      - "check-success=TestCephMultiClusterDeploySuite (v1.28.0)"
+      - "check-success=TestCephObjectSuite (v1.27.2)"
+      - "check-success=TestCephUpgradeSuite (v1.22.17)"
+      - "check-success=TestCephUpgradeSuite (v1.28.0)"
+      - "check-success=TestHelmUpgradeSuite (v1.22.17)"
+      - "check-success=TestHelmUpgradeSuite (v1.28.0)"
+    actions:
+      merge:
+        method: merge
+      dismiss_reviews: {}
+      delete_head_branch: {}
+
   # release-1.13 branch
   - name: automerge backport release-1.13
     conditions:
@@ -186,64 +291,23 @@ pull_request_rules:
       dismiss_reviews: {}
       delete_head_branch: {}
 
-  # release-1.16 branch
-  - name: automerge backport release-1.16
+  # release-1.11 branch
+  - actions:
+      backport:
+        branches:
+          - release-1.11
     conditions:
-      - author=mergify[bot]
-      - base=release-1.16
-      - label!=do-not-merge
-      - "status-success=DCO"
-      - "check-success=linux-build-all (1.22)"
-      - "check-success=unittests"
-      - "check-success=golangci-lint"
-      - "check-success=codegen"
-      - "check-success=codespell"
-      - "check-success=lint"
-      - "check-success=modcheck"
-      - "check-success=Shellcheck"
-      - "check-success=yaml-linter"
-      - "check-success=lint-test"
-      - "check-success=gen-rbac"
-      - "check-success=crds-gen"
-      - "check-success=docs-check"
-      - "check-success=pylint"
-      - "check-success=canary-tests / canary (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / raw-disk-with-object (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / two-osds-in-device (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / osd-with-metadata-partition-device (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / osd-with-metadata-device (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / lvm (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / pvc (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / pvc-db (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / pvc-db-wal (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc-db (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc-db-wal (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc-kms-vault-token-auth (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc-kms-vault-k8s-auth (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / lvm-pvc (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / multi-cluster-mirroring (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / rgw-multisite-testing (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / encryption-pvc-kms-ibm-kp (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / multus-public-and-cluster (quay.io/ceph/ceph:v18)"
-      - "check-success=canary-tests / csi-hostnetwork-disabled (quay.io/ceph/ceph:v18)"
-      - "check-success=TestCephSmokeSuite (v1.27.16)"
-      - "check-success=TestCephSmokeSuite (v1.31.0)"
-      - "check-success=TestCephHelmSuite (v1.27.16)"
-      - "check-success=TestCephHelmSuite (v1.31.0)"
-      - "check-success=TestCephMultiClusterDeploySuite (v1.31.0)"
-      - "check-success=TestCephObjectSuite (v1.27.16)"
-      - "check-success=TestCephObjectSuite (v1.31.0)"
-      - "check-success=TestCephUpgradeSuite (v1.27.16)"
-      - "check-success=TestCephUpgradeSuite (v1.31.0)"
-      - "check-success=TestHelmUpgradeSuite (v1.27.16)"
-      - "check-success=TestHelmUpgradeSuite (v1.31.0)"
-    actions:
-      merge:
-        method: merge
-      dismiss_reviews: {}
-      delete_head_branch: {}
+      - label=backport-release-1.11
+    name: backport release-1.11
+
+  # release-1.12 branch
+  - actions:
+      backport:
+        branches:
+          - release-1.12
+    conditions:
+      - label=backport-release-1.12
+    name: backport release-1.12
 
   # release-1.13 branch
   - actions:
@@ -271,12 +335,3 @@ pull_request_rules:
     conditions:
       - label=backport-release-1.15
     name: backport release-1.15
-
-  # release-1.16 branch
-  - actions:
-      backport:
-        branches:
-          - release-1.16
-    conditions:
-      - label=backport-release-1.16
-    name: backport release-1.16
diff --git a/Documentation/Getting-Started/Prerequisites/prerequisites.md b/Documentation/Getting-Started/Prerequisites/prerequisites.md
index 914736435..587347ebc 100644
--- a/Documentation/Getting-Started/Prerequisites/prerequisites.md
+++ b/Documentation/Getting-Started/Prerequisites/prerequisites.md
@@ -7,7 +7,7 @@ and Rook is granted the required privileges (see below for more information).
 
 ## Kubernetes Version
 
-Kubernetes versions **v1.27** through **v1.31** are supported.
+Kubernetes versions **v1.26** through **v1.31** are supported.
 
 ## CPU Architecture
 
diff --git a/Documentation/Getting-Started/quickstart.md b/Documentation/Getting-Started/quickstart.md
index b4672df54..f7b732cc4 100644
--- a/Documentation/Getting-Started/quickstart.md
+++ b/Documentation/Getting-Started/quickstart.md
@@ -12,7 +12,7 @@ This guide will walk through the basic setup of a Ceph cluster and enable K8s ap
 
 ## Kubernetes Version
 
-Kubernetes versions **v1.27** through **v1.31** are supported.
+Kubernetes versions **v1.26** through **v1.31** are supported.
 
 ## CPU Architecture
 
diff --git a/Documentation/Helm-Charts/operator-chart.md b/Documentation/Helm-Charts/operator-chart.md
index 1b1e0b2b3..7fc7ec887 100644
--- a/Documentation/Helm-Charts/operator-chart.md
+++ b/Documentation/Helm-Charts/operator-chart.md
@@ -60,13 +60,13 @@ The following table lists the configurable parameters of the rook-operator chart
 | `csi.cephFSPluginUpdateStrategy` | CSI CephFS plugin daemonset update strategy, supported values are OnDelete and RollingUpdate | `RollingUpdate` |
 | `csi.cephFSPluginUpdateStrategyMaxUnavailable` | A maxUnavailable parameter of CSI cephFS plugin daemonset update strategy. | `1` |
 | `csi.cephcsi.repository` | Ceph CSI image repository | `"quay.io/cephcsi/cephcsi"` |
-| `csi.cephcsi.tag` | Ceph CSI image tag | `"v3.12.3"` |
+| `csi.cephcsi.tag` | Ceph CSI image tag | `"v3.12.2"` |
 | `csi.cephfsLivenessMetricsPort` | CSI CephFS driver metrics port | `9081` |
 | `csi.cephfsPodLabels` | Labels to add to the CSI CephFS Deployments and DaemonSets Pods | `nil` |
 | `csi.clusterName` | Cluster name identifier to set as metadata on the CephFS subvolume and RBD images. This will be useful in cases like for example, when two container orchestrator clusters (Kubernetes/OCP) are using a single ceph cluster | `nil` |
 | `csi.csiAddons.enabled` | Enable CSIAddons | `false` |
 | `csi.csiAddons.repository` | CSIAddons sidecar image repository | `"quay.io/csiaddons/k8s-sidecar"` |
-| `csi.csiAddons.tag` | CSIAddons sidecar image tag | `"v0.11.0"` |
+| `csi.csiAddons.tag` | CSIAddons sidecar image tag | `"v0.10.0"` |
 | `csi.csiAddonsPort` | CSI Addons server port | `9070` |
 | `csi.csiCephFSPluginResource` | CEPH CSI CephFS plugin resource requirement list | see values.yaml |
 | `csi.csiCephFSPluginVolume` | The volume of the CephCSI CephFS plugin DaemonSet | `nil` |
diff --git a/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md b/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
index d0264755e..d06bb58ae 100644
--- a/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
+++ b/Documentation/Storage-Configuration/Ceph-CSI/ceph-csi-drivers.md
@@ -166,9 +166,9 @@ that the controller inspects and forwards to one or more CSI-Addons sidecars for
 Deploy the controller by running the following commands:
 
 ```console
-kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.11.0/crds.yaml
-kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.11.0/rbac.yaml
-kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.11.0/setup-controller.yaml
+kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.10.0/crds.yaml
+kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.10.0/rbac.yaml
+kubectl create -f https://github.com/csi-addons/kubernetes-csi-addons/releases/download/v0.10.0/setup-controller.yaml
 ```
 
 This creates the required CRDs and configures permissions.
@@ -196,31 +196,31 @@ Execute the following to enable the CSI-Addons sidecars:
 CSI-Addons supports the following operations:
 
 * Reclaim Space
-    * [Creating a ReclaimSpaceJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/reclaimspace.md#reclaimspacejob)
-    * [Creating a ReclaimSpaceCronJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/reclaimspace.md#reclaimspacecronjob)
-    * [Annotating PersistentVolumeClaims](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/reclaimspace.md#annotating-perstentvolumeclaims)
-    * [Annotating Namespace](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/reclaimspace.md#annotating-namespace)
-    * [Annotating StorageClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/reclaimspace.md#annotating-storageclass)
+    * [Creating a ReclaimSpaceJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/reclaimspace.md#reclaimspacejob)
+    * [Creating a ReclaimSpaceCronJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/reclaimspace.md#reclaimspacecronjob)
+    * [Annotating PersistentVolumeClaims](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/reclaimspace.md#annotating-perstentvolumeclaims)
+    * [Annotating Namespace](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/reclaimspace.md#annotating-namespace)
+    * [Annotating StorageClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/reclaimspace.md#annotating-storageclass)
 * Network Fencing
-    * [Creating a NetworkFence](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/networkfence.md)
+    * [Creating a NetworkFence](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/networkfence.md)
 * Volume Replication
-    * [Creating VolumeReplicationClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/volumereplicationclass.md)
-    * [Creating VolumeReplication CR](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/volumereplication.md)
+    * [Creating VolumeReplicationClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/volumereplicationclass.md)
+    * [Creating VolumeReplication CR](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/volumereplication.md)
 * Key Rotation Job for PV encryption
-    * [Creating EncryptionKeyRotationJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/encryptionkeyrotation.md#encryptionkeyrotationjob)
-    * [Creating EncryptionKeyRotationCronJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/encryptionkeyrotation.md#encryptionkeyrotationcronjob)
-    * [Annotating PersistentVolumeClaims](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/encryptionkeyrotation.md#annotating-persistentvolumeclaims)
-    * [Annotating Namespace](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/encryptionkeyrotation.md#annotating-namespace)
-    * [Annotating StorageClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.11.0/docs/encryptionkeyrotation.md#annotating-storageclass)
+    * [Creating EncryptionKeyRotationJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/encryptionkeyrotation.md#encryptionkeyrotationjob)
+    * [Creating EncryptionKeyRotationCronJob](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/encryptionkeyrotation.md#encryptionkeyrotationcronjob)
+    * [Annotating PersistentVolumeClaims](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/encryptionkeyrotation.md#annotating-persistentvolumeclaims)
+    * [Annotating Namespace](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/encryptionkeyrotation.md#annotating-namespace)
+    * [Annotating StorageClass](https://github.com/csi-addons/kubernetes-csi-addons/blob/v0.10.0/docs/encryptionkeyrotation.md#annotating-storageclass)
 
 ## Enable RBD and CephFS Encryption Support
 
 Ceph-CSI supports encrypting PersistentVolumeClaims (PVCs) for both RBD and CephFS.
 This can be achieved using LUKS for RBD and fscrypt for CephFS. More details on encrypting RBD PVCs can be found
-[here](https://github.com/ceph/ceph-csi/blob/v3.12.3/docs/deploy-rbd.md#encryption-for-rbd-volumes),
+[here](https://github.com/ceph/ceph-csi/blob/v3.12.2/docs/deploy-rbd.md#encryption-for-rbd-volumes),
 which includes a full list of supported encryption configurations.
-More details on encrypting CephFS PVCs can be found [here](https://github.com/ceph/ceph-csi/blob/v3.12.3/docs/deploy-cephfs.md#cephfs-volume-encryption).
-A sample KMS configmap can be found [here](https://github.com/ceph/ceph-csi/blob/v3.12.3/examples/kms/vault/kms-config.yaml).
+More details on encrypting CephFS PVCs can be found [here](https://github.com/ceph/ceph-csi/blob/v3.12.2/docs/deploy-cephfs.md#cephfs-volume-encryption).
+A sample KMS configmap can be found [here](https://github.com/ceph/ceph-csi/blob/v3.12.2/examples/kms/vault/kms-config.yaml).
 
 !!! note
     Not all KMS are compatible with fscrypt. Generally, KMS that either store secrets to use directly (like Vault)
diff --git a/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md b/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
index c2e328825..86beab48d 100644
--- a/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
+++ b/Documentation/Storage-Configuration/Ceph-CSI/custom-images.md
@@ -18,13 +18,13 @@ kubectl -n $ROOK_OPERATOR_NAMESPACE edit configmap rook-ceph-operator-config
 The default upstream images are included below, which you can change to your desired images.
 
 ```yaml
-ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.3"
+ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.2"
 ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1"
 ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v5.0.1"
 ROOK_CSI_ATTACHER_IMAGE: "registry.k8s.io/sig-storage/csi-attacher:v4.6.1"
 ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.11.1"
 ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1"
-ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.11.0"
+ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.10.0"
 ```
 
 ### **Use private repository**
diff --git a/deploy/charts/rook-ceph/templates/role.yaml b/deploy/charts/rook-ceph/templates/role.yaml
index 8e3643d1d..ee6a3e4d7 100644
--- a/deploy/charts/rook-ceph/templates/role.yaml
+++ b/deploy/charts/rook-ceph/templates/role.yaml
@@ -74,7 +74,7 @@ rules:
 {{- if and .Values.csi.csiAddons .Values.csi.csiAddons.enabled }}
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
@@ -95,7 +95,7 @@ metadata:
 rules:
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
@@ -119,7 +119,7 @@ rules:
   {{- if and .Values.csi.csiAddons .Values.csi.csiAddons.enabled }}
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
diff --git a/deploy/charts/rook-ceph/values.yaml b/deploy/charts/rook-ceph/values.yaml
index b16d8234d..8b5ceb82f 100644
--- a/deploy/charts/rook-ceph/values.yaml
+++ b/deploy/charts/rook-ceph/values.yaml
@@ -480,7 +480,7 @@ csi:
     # -- Ceph CSI image repository
     repository: quay.io/cephcsi/cephcsi
     # -- Ceph CSI image tag
-    tag: v3.12.3
+    tag: v3.12.2
 
   registrar:
     # -- Kubernetes CSI registrar image repository
@@ -530,7 +530,7 @@ csi:
     # -- CSIAddons sidecar image repository
     repository: quay.io/csiaddons/k8s-sidecar
     # -- CSIAddons sidecar image tag
-    tag: v0.11.0
+    tag: v0.10.0
 
   nfs:
     # -- Enable the nfs csi driver
diff --git a/deploy/examples/common.yaml b/deploy/examples/common.yaml
index 6e3c08a37..713b39fa6 100644
--- a/deploy/examples/common.yaml
+++ b/deploy/examples/common.yaml
@@ -779,7 +779,7 @@ rules:
     verbs: ["get", "watch", "list", "delete", "update", "create"]
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
@@ -798,7 +798,7 @@ metadata:
 rules:
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
@@ -820,7 +820,7 @@ rules:
     verbs: ["get", "watch", "list", "delete", "update", "create"]
   - apiGroups: ["csiaddons.openshift.io"]
     resources: ["csiaddonsnodes"]
-    verbs: ["get", "create", "update", "delete"]
+    verbs: ["get", "create", "update"]
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["get"]
diff --git a/deploy/examples/images.txt b/deploy/examples/images.txt
index 8052af0b6..b84f8adbd 100644
--- a/deploy/examples/images.txt
+++ b/deploy/examples/images.txt
@@ -2,8 +2,8 @@
  gcr.io/k8s-staging-sig-storage/objectstorage-sidecar:v20240513-v0.1.0-35-gefb3255
  quay.io/ceph/ceph:v18.2.4
  quay.io/ceph/cosi:v0.1.2
- quay.io/cephcsi/cephcsi:v3.12.3
- quay.io/csiaddons/k8s-sidecar:v0.11.0
+ quay.io/cephcsi/cephcsi:v3.12.2
+ quay.io/csiaddons/k8s-sidecar:v0.10.0
  registry.k8s.io/sig-storage/csi-attacher:v4.6.1
  registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1
  registry.k8s.io/sig-storage/csi-provisioner:v5.0.1
diff --git a/deploy/examples/operator-openshift.yaml b/deploy/examples/operator-openshift.yaml
index ca427af04..1186fd184 100644
--- a/deploy/examples/operator-openshift.yaml
+++ b/deploy/examples/operator-openshift.yaml
@@ -189,7 +189,7 @@ data:
   # The default version of CSI supported by Rook will be started. To change the version
   # of the CSI driver to something other than what is officially supported, change
   # these images to the desired release of the CSI driver.
-  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.3"
+  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.2"
   # ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1"
   # ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.11.1"
   # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v5.0.1"
@@ -550,7 +550,7 @@ data:
   CSI_ENABLE_CSIADDONS: "false"
   # Enable watch for faster recovery from rbd rwo node loss
   ROOK_WATCH_FOR_NODE_FAILURE: "true"
-  # ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.11.0"
+  # ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.10.0"
   # The GCSI RPC timeout value (in seconds). It should be >= 120. If this variable is not set or is an invalid value, it's default to 150.
   CSI_GRPC_TIMEOUT_SECONDS: "150"
 
diff --git a/deploy/examples/operator.yaml b/deploy/examples/operator.yaml
index c0ccbc693..b11549be5 100644
--- a/deploy/examples/operator.yaml
+++ b/deploy/examples/operator.yaml
@@ -119,7 +119,7 @@ data:
   # The default version of CSI supported by Rook will be started. To change the version
   # of the CSI driver to something other than what is officially supported, change
   # these images to the desired release of the CSI driver.
-  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.3"
+  # ROOK_CSI_CEPH_IMAGE: "quay.io/cephcsi/cephcsi:v3.12.2"
   # ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1"
   # ROOK_CSI_RESIZER_IMAGE: "registry.k8s.io/sig-storage/csi-resizer:v1.11.1"
   # ROOK_CSI_PROVISIONER_IMAGE: "registry.k8s.io/sig-storage/csi-provisioner:v5.0.1"
@@ -500,7 +500,7 @@ data:
   CSI_ENABLE_CSIADDONS: "false"
   # Enable watch for faster recovery from rbd rwo node loss
   ROOK_WATCH_FOR_NODE_FAILURE: "true"
-  # ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.11.0"
+  # ROOK_CSIADDONS_IMAGE: "quay.io/csiaddons/k8s-sidecar:v0.10.0"
   # The CSI GRPC timeout value (in seconds). It should be >= 120. If this variable is not set or is an invalid value, it's default to 150.
   CSI_GRPC_TIMEOUT_SECONDS: "150"
 
diff --git a/pkg/apis/ceph.rook.io/v1/annotations.go b/pkg/apis/ceph.rook.io/v1/annotations.go
index 4eaa64878..efd40793f 100644
--- a/pkg/apis/ceph.rook.io/v1/annotations.go
+++ b/pkg/apis/ceph.rook.io/v1/annotations.go
@@ -110,20 +110,14 @@ func (a Annotations) ApplyToObjectMeta(t *metav1.ObjectMeta) {
 // original Annotations with the attributes of the supplied one. The supplied
 // Annotation attributes will override the original ones if defined.
 func (a Annotations) Merge(with map[string]string) Annotations {
-	// Create a new map of type Annotations to hold the merged results
-	ret := Annotations{}
-
-	// Copy the contents of the original map (a) into ret
-	for k, v := range a {
-		ret[k] = v
+	ret := a
+	if ret == nil {
+		ret = map[string]string{}
 	}
-
-	// Add entries from the 'with' map only if the key does not already exist
 	for k, v := range with {
-		if _, exists := ret[k]; !exists {
+		if _, ok := ret[k]; !ok {
 			ret[k] = v
 		}
 	}
-
 	return ret
 }
diff --git a/pkg/daemon/ceph/client/mirror.go b/pkg/daemon/ceph/client/mirror.go
index d9c2dc8a8..a37a95d87 100644
--- a/pkg/daemon/ceph/client/mirror.go
+++ b/pkg/daemon/ceph/client/mirror.go
@@ -27,7 +27,6 @@ import (
 	cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
 	"github.com/rook/rook/pkg/clusterd"
 	cephver "github.com/rook/rook/pkg/operator/ceph/version"
-	"github.com/rook/rook/pkg/util/exec"
 	"k8s.io/apimachinery/pkg/util/sets"
 )
 
@@ -88,7 +87,7 @@ func ImportRBDMirrorBootstrapPeer(context *clusterd.Context, clusterInfo *Cluste
 	cmd := NewRBDCommand(context, clusterInfo, args)
 
 	// Run command
-	output, err := cmd.RunWithTimeout(exec.CephCommandsTimeout)
+	output, err := cmd.Run()
 	if err != nil {
 		return errors.Wrapf(err, "failed to add rbd-mirror peer token for pool %q. %s", poolName, output)
 	}
diff --git a/pkg/daemon/ceph/osd/device.go b/pkg/daemon/ceph/osd/device.go
index 3e4bd57f6..0d2385748 100644
--- a/pkg/daemon/ceph/osd/device.go
+++ b/pkg/daemon/ceph/osd/device.go
@@ -94,5 +94,5 @@ func (d *DesiredDevice) UpdateDeviceClass(agent *OsdAgent, device *sys.LocalDisk
 		}
 	}
 
-	d.DeviceClass = sys.GetDiskDeviceClass(device)
+	d.DeviceClass = sys.GetDiskDeviceType(device)
 }
diff --git a/pkg/daemon/ceph/osd/volume.go b/pkg/daemon/ceph/osd/volume.go
index 75029082b..83e53597c 100644
--- a/pkg/daemon/ceph/osd/volume.go
+++ b/pkg/daemon/ceph/osd/volume.go
@@ -1161,7 +1161,12 @@ func GetCephVolumeRawOSDs(context *clusterd.Context, clusterInfo *client.Cluster
 			if err != nil {
 				return nil, errors.Wrapf(err, "failed to get device info for %q", blockPath)
 			}
-			osd.DeviceClass = sys.GetDiskDeviceClass(diskInfo)
+			deviceType := sys.GetDiskDeviceType(diskInfo)
+			osd.DeviceType = deviceType
+			logger.Infof("setting device type %q for device %q", osd.DeviceType, diskInfo.Name)
+
+			crushDeviceClass := sys.GetDiskDeviceClass(oposd.CrushDeviceClassVarName, deviceType)
+			osd.DeviceClass = crushDeviceClass
 			logger.Infof("setting device class %q for device %q", osd.DeviceClass, diskInfo.Name)
 		}
 
diff --git a/pkg/operator/ceph/cluster/osd/key_rotation.go b/pkg/operator/ceph/cluster/osd/key_rotation.go
index e69973310..db0aca375 100644
--- a/pkg/operator/ceph/cluster/osd/key_rotation.go
+++ b/pkg/operator/ceph/cluster/osd/key_rotation.go
@@ -271,7 +271,7 @@ func (c *Cluster) reconcileKeyRotationCronJob() error {
 			return errors.Errorf("pvc name label %q for osd %q is empty",
 				OSDOverPVCLabelKey, osdDep.Name)
 		}
-		osdProps, err := c.getOSDPropsForPVC(pvcName, osd.DeviceClass)
+		osdProps, err := c.getOSDPropsForPVC(pvcName)
 		if err != nil {
 			return errors.Wrapf(err, "failed to generate config for osd %q", osdDep.Name)
 		}
diff --git a/pkg/operator/ceph/cluster/osd/labels.go b/pkg/operator/ceph/cluster/osd/labels.go
index f663311f0..aea609806 100644
--- a/pkg/operator/ceph/cluster/osd/labels.go
+++ b/pkg/operator/ceph/cluster/osd/labels.go
@@ -60,6 +60,9 @@ func (c *Cluster) getOSDLabels(osd OSDInfo, failureDomainValue string, portable
 	labels[portableKey] = strconv.FormatBool(portable)
 	labels[deviceClass] = osd.DeviceClass
 	labels[osdStore] = osd.Store
+	if osd.DeviceType != "" {
+		labels[deviceType] = osd.DeviceType
+	}
 
 	for k, v := range getOSDTopologyLocationLabels(osd.Location) {
 		labels[k] = v
diff --git a/pkg/operator/ceph/cluster/osd/osd.go b/pkg/operator/ceph/cluster/osd/osd.go
index eb2886e19..0189446c7 100644
--- a/pkg/operator/ceph/cluster/osd/osd.go
+++ b/pkg/operator/ceph/cluster/osd/osd.go
@@ -73,6 +73,7 @@ const (
 	bluestorePVCData               = "data"
 	deviceClass                    = "device-class"
 	osdStore                       = "osd-store"
+	deviceType                     = "device-type"
 )
 
 // Cluster keeps track of the OSDs
@@ -121,6 +122,7 @@ type OSDInfo struct {
 	ExportService    bool   `json:"exportService"`
 	NodeName         string `json:"nodeName"`
 	PVCName          string `json:"pvcName"`
+	DeviceType       string `json:"device-type"`
 }
 
 // OrchestrationStatus represents the status of an OSD orchestration
@@ -406,7 +408,7 @@ func deploymentOnNode(c *Cluster, osd *OSDInfo, nodeName string, config *provisi
 func deploymentOnPVC(c *Cluster, osd *OSDInfo, pvcName string, config *provisionConfig) (*appsv1.Deployment, error) {
 	osdLongName := fmt.Sprintf("OSD %d on PVC %q", osd.ID, pvcName)
 
-	osdProps, err := c.getOSDPropsForPVC(pvcName, osd.DeviceClass)
+	osdProps, err := c.getOSDPropsForPVC(pvcName)
 	if err != nil {
 		return nil, errors.Wrapf(err, "failed to generate config for %s", osdLongName)
 	}
@@ -466,7 +468,7 @@ func (c *Cluster) getOSDPropsForNode(nodeName, deviceClass string) (osdPropertie
 	return osdProps, nil
 }
 
-func (c *Cluster) getOSDPropsForPVC(pvcName, osdDeviceClass string) (osdProperties, error) {
+func (c *Cluster) getOSDPropsForPVC(pvcName string) (osdProperties, error) {
 	for _, deviceSet := range c.deviceSets {
 		// The data PVC template is required.
 		dataSource, dataOK := deviceSet.PVCSources[bluestorePVCData]
@@ -489,7 +491,7 @@ func (c *Cluster) getOSDPropsForPVC(pvcName, osdDeviceClass string) (osdProperti
 			}
 
 			if deviceSet.Resources.Limits == nil && deviceSet.Resources.Requests == nil {
-				deviceSet.Resources = cephv1.GetOSDResources(c.spec.Resources, osdDeviceClass)
+				deviceSet.Resources = cephv1.GetOSDResources(c.spec.Resources, deviceSet.CrushDeviceClass)
 			}
 
 			osdProps := osdProperties{
diff --git a/pkg/operator/ceph/csi/spec.go b/pkg/operator/ceph/csi/spec.go
index 761494b90..0f587270f 100644
--- a/pkg/operator/ceph/csi/spec.go
+++ b/pkg/operator/ceph/csi/spec.go
@@ -131,13 +131,13 @@ var (
 // manually challenging.
 var (
 	// image names
-	DefaultCSIPluginImage   = "quay.io/cephcsi/cephcsi:v3.12.3"
+	DefaultCSIPluginImage   = "quay.io/cephcsi/cephcsi:v3.12.2"
 	DefaultRegistrarImage   = "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1"
 	DefaultProvisionerImage = "registry.k8s.io/sig-storage/csi-provisioner:v5.0.1"
 	DefaultAttacherImage    = "registry.k8s.io/sig-storage/csi-attacher:v4.6.1"
 	DefaultSnapshotterImage = "registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1"
 	DefaultResizerImage     = "registry.k8s.io/sig-storage/csi-resizer:v1.11.1"
-	DefaultCSIAddonsImage   = "quay.io/csiaddons/k8s-sidecar:v0.11.0"
+	DefaultCSIAddonsImage   = "quay.io/csiaddons/k8s-sidecar:v0.10.0"
 
 	// image pull policy
 	DefaultCSIImagePullPolicy = string(corev1.PullIfNotPresent)
diff --git a/pkg/util/sys/device.go b/pkg/util/sys/device.go
index 4a7f93f1b..fc9d2f64a 100644
--- a/pkg/util/sys/device.go
+++ b/pkg/util/sys/device.go
@@ -19,6 +19,7 @@ package sys
 import (
 	"encoding/json"
 	"fmt"
+	"os"
 	osexec "os/exec"
 	"strconv"
 	"strings"
@@ -279,7 +280,7 @@ func GetDiskUUID(device string, executor exec.Executor) (string, error) {
 	return parseUUID(device, output)
 }
 
-func GetDiskDeviceClass(disk *LocalDisk) string {
+func GetDiskDeviceType(disk *LocalDisk) string {
 	if disk.Rotational {
 		return "hdd"
 	}
@@ -289,6 +290,15 @@ func GetDiskDeviceClass(disk *LocalDisk) string {
 	return "ssd"
 }
 
+func GetDiskDeviceClass(crushDeviceClassVarName, deviceType string) string {
+	crushDeviceClass := os.Getenv(crushDeviceClassVarName)
+	if crushDeviceClass != "" {
+		return crushDeviceClass
+	} else {
+		return deviceType
+	}
+}
+
 // CheckIfDeviceAvailable checks if a device is available for consumption. The caller
 // needs to decide based on the return values whether it is available.
 func CheckIfDeviceAvailable(executor exec.Executor, devicePath string, pvcBacked bool) (bool, string, error) {


Test patch:
diff --git a/.github/workflows/integration-test-helm-suite.yaml b/.github/workflows/integration-test-helm-suite.yaml
index f0fcafa30..8d30d681c 100644
--- a/.github/workflows/integration-test-helm-suite.yaml
+++ b/.github/workflows/integration-test-helm-suite.yaml
@@ -28,7 +28,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/integration-test-keystone-auth-suite.yaml b/.github/workflows/integration-test-keystone-auth-suite.yaml
index 85d9bacc2..5d4db9c53 100644
--- a/.github/workflows/integration-test-keystone-auth-suite.yaml
+++ b/.github/workflows/integration-test-keystone-auth-suite.yaml
@@ -28,7 +28,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/integration-test-object-suite.yaml b/.github/workflows/integration-test-object-suite.yaml
index 77eecc343..fa13bcd91 100644
--- a/.github/workflows/integration-test-object-suite.yaml
+++ b/.github/workflows/integration-test-object-suite.yaml
@@ -28,7 +28,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/integration-test-smoke-suite.yaml b/.github/workflows/integration-test-smoke-suite.yaml
index e16ff3b88..5712ed754 100644
--- a/.github/workflows/integration-test-smoke-suite.yaml
+++ b/.github/workflows/integration-test-smoke-suite.yaml
@@ -28,7 +28,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/integration-test-upgrade-suite.yaml b/.github/workflows/integration-test-upgrade-suite.yaml
index d8eb22d5f..c4c384e87 100644
--- a/.github/workflows/integration-test-upgrade-suite.yaml
+++ b/.github/workflows/integration-test-upgrade-suite.yaml
@@ -28,7 +28,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -73,7 +73,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/.github/workflows/integration-tests-on-release.yaml b/.github/workflows/integration-tests-on-release.yaml
index 0512356df..e4fb4c5c3 100644
--- a/.github/workflows/integration-tests-on-release.yaml
+++ b/.github/workflows/integration-tests-on-release.yaml
@@ -21,7 +21,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.28.12", "v1.29.7", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.28.12", "v1.29.7", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -61,7 +61,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.28.12", "v1.29.7", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.28.12", "v1.29.7", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -102,7 +102,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.28.12", "v1.29.7", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.28.12", "v1.29.7", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -140,7 +140,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.28.12", "v1.29.7", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.28.12", "v1.29.7", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -178,7 +178,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.28.12", "v1.29.7", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.28.12", "v1.29.7", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
@@ -219,7 +219,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        kubernetes-versions: ["v1.27.16", "v1.31.0"]
+        kubernetes-versions: ["v1.26.15", "v1.31.0"]
     steps:
       - name: checkout
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
diff --git a/pkg/apis/ceph.rook.io/v1/annotations_test.go b/pkg/apis/ceph.rook.io/v1/annotations_test.go
index 465ccbd23..c3137d8ed 100644
--- a/pkg/apis/ceph.rook.io/v1/annotations_test.go
+++ b/pkg/apis/ceph.rook.io/v1/annotations_test.go
@@ -62,7 +62,6 @@ func TestCephAnnotationsMerge(t *testing.T) {
 		"mgr":            {"mgrkey": "mgrval"},
 		"cmdreporter":    {"myversions": "detect"},
 		"crashcollector": {"crash": "crashval"},
-		"osd":            {"osdkey": "osdval"},
 	}
 	a = GetMonAnnotations(testAnnotations)
 	assert.Equal(t, "allval1", a["allkey1"])
@@ -81,10 +80,6 @@ func TestCephAnnotationsMerge(t *testing.T) {
 	assert.Equal(t, "crashval", c["crash"])
 	assert.Equal(t, "allval1", c["allkey1"])
 	assert.Equal(t, "allval2", c["allkey2"])
-	d := GetOSDAnnotations(testAnnotations)
-	assert.Equal(t, "allval1", d["allkey1"])
-	assert.Equal(t, "allval2", d["allkey2"])
-	assert.Equal(t, "osdval", d["osdkey"])
 }
 
 func TestAnnotationsSpec(t *testing.T) {
diff --git a/pkg/operator/ceph/csi/util_test.go b/pkg/operator/ceph/csi/util_test.go
index 2e974a1d0..3c8afc0ba 100644
--- a/pkg/operator/ceph/csi/util_test.go
+++ b/pkg/operator/ceph/csi/util_test.go
@@ -284,7 +284,7 @@ func Test_getImage(t *testing.T) {
 			args: args{
 				data:         map[string]string{},
 				settingName:  "ROOK_CSI_CEPH_IMAGE",
-				defaultImage: "quay.io/cephcsi/cephcsi:v3.12.3",
+				defaultImage: "quay.io/cephcsi/cephcsi:v3.12.2",
 			},
 			want: DefaultCSIPluginImage,
 		},
diff --git a/pkg/util/sys/device_test.go b/pkg/util/sys/device_test.go
index 01023c0ff..03e085902 100644
--- a/pkg/util/sys/device_test.go
+++ b/pkg/util/sys/device_test.go
@@ -197,12 +197,21 @@ func TestListDevicesChildListDevicesChild(t *testing.T) {
 	assert.Equal(t, 3, len(child))
 }
 
-func TestGetDiskDeviceClass(t *testing.T) {
+func TestGetDiskDeviceType(t *testing.T) {
 	d := &LocalDisk{}
-	assert.Equal(t, "ssd", GetDiskDeviceClass(d))
+	assert.Equal(t, "ssd", GetDiskDeviceType(d))
 	d.Rotational = true
-	assert.Equal(t, "hdd", GetDiskDeviceClass(d))
+	assert.Equal(t, "hdd", GetDiskDeviceType(d))
 	d.Rotational = false
 	d.RealPath = "nvme"
-	assert.Equal(t, "nvme", GetDiskDeviceClass(d))
+	assert.Equal(t, "nvme", GetDiskDeviceType(d))
+}
+
+func TestGetDiskDeviceClass(t *testing.T) {
+	t.Setenv("ROOK_OSD_CRUSH_DEVICE_CLASS", "test")
+	assert.Equal(t, "test", GetDiskDeviceClass("ROOK_OSD_CRUSH_DEVICE_CLASS", "hdd"))
+	t.Setenv("ROOK_OSD_CRUSH_DEVICE_CLASS", "test1")
+	assert.Equal(t, "test1", GetDiskDeviceClass("ROOK_OSD_CRUSH_DEVICE_CLASS", "hdd"))
+	t.Setenv("ROOK_OSD_CRUSH_DEVICE_CLASS", "")
+	assert.Equal(t, "nvme", GetDiskDeviceClass("ROOK_OSD_CRUSH_DEVICE_CLASS", "nvme"))
 }
diff --git a/tests/scripts/csiaddons.sh b/tests/scripts/csiaddons.sh
index 2b048b807..6b91a847b 100755
--- a/tests/scripts/csiaddons.sh
+++ b/tests/scripts/csiaddons.sh
@@ -16,7 +16,7 @@
 
 set -xEo pipefail
 
-CSIADDONS_VERSION="v0.11.0"
+CSIADDONS_VERSION="v0.10.0"
 CSIADDONS_CRD_NAME="csiaddonsnodes.csiaddons.openshift.io"
 CSIADDONS_CONTAINER_NAME="csi-addons"