From d6986137470dae669ffb748e2cc069ae409b74e5 Mon Sep 17 00:00:00 2001 From: water <672684719@qq.com> Date: Thu, 27 Aug 2026 21:31:55 +0800 Subject: [PATCH] fix: use auth_client_required instead of removed auth_supported for RBD Ceph Tentacle 20.2.4 removed the legacy `auth_supported` librados option. CloudStack builds RBD connection strings with `auth_supported=cephx`/`none`, so every RBD operation through the KVM agent fails with "failed to set RADOS option: auth_supported". Switch the RBD string builder to `auth_client_required`, the modern option used by the qemu rbd driver and accepted by current Ceph releases. --- .../com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java | 4 ++-- .../cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java index 8a9d69c97954..b3b55f484e4d 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java @@ -54,9 +54,9 @@ public static String RBDStringBuilder(KVMStoragePool storagePool, String image) rbdOpts += ":mon_host=" + composeOptionForMonHosts(monHost, monPort); if (authUserName == null) { - rbdOpts += ":auth_supported=none"; + rbdOpts += ":auth_client_required=none"; } else { - rbdOpts += ":auth_supported=cephx"; + rbdOpts += ":auth_client_required=cephx"; rbdOpts += ":id=" + authUserName; rbdOpts += ":key=" + authSecret; } diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java index 098f3e1b8bdb..9129d0ad545d 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java @@ -44,7 +44,7 @@ public void testRBDStringBuilder() { Mockito.doReturn(authUserName).when(kvmStoragePoolMock).getAuthUserName(); Mockito.doReturn(authSecret).when(kvmStoragePoolMock).getAuthSecret(); - String expected = "rbd:volume1:mon_host=ceph-monitor\\:8000:auth_supported=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; + String expected = "rbd:volume1:mon_host=ceph-monitor\\:8000:auth_client_required=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; String result = KVMPhysicalDisk.RBDStringBuilder(kvmStoragePoolMock, "volume1"); Assert.assertEquals(expected, result); @@ -62,7 +62,7 @@ public void testRBDStringBuilder2() { String expected = "rbd:volume1:" + "mon_host=ceph-monitor1\\:3300\\;ceph-monitor2\\:3300\\;ceph-monitor3\\:3300:" + - "auth_supported=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; + "auth_client_required=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; String actualResult = KVMPhysicalDisk.RBDStringBuilder(kvmStoragePoolMock, "volume1"); Assert.assertEquals(expected, actualResult); @@ -80,7 +80,7 @@ public void testRBDStringBuilder3() { String expected = "rbd:volume1:" + "mon_host=[fc00\\:1234\\:\\:1]\\:3300\\;[fc00\\:1234\\:\\:2]\\:3300\\;[fc00\\:1234\\:\\:3]\\:3300:" + - "auth_supported=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; + "auth_client_required=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30"; String actualResult = KVMPhysicalDisk.RBDStringBuilder(kvmStoragePoolMock, "volume1"); Assert.assertEquals(expected, actualResult);