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

bstoyanov pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 4adb7195701 Allow modification of user vm details if 
user.vm.readonly.details is empty (#10456)
4adb7195701 is described below

commit 4adb7195701f2b28b86456f739ad59ec9f369abf
Author: Pearl Dsilva <[email protected]>
AuthorDate: Mon Jan 26 04:18:12 2026 -0500

    Allow modification of user vm details if user.vm.readonly.details is empty 
(#10456)
---
 .../org/apache/cloudstack/query/QueryService.java  |  2 +-
 .../cloudstack/framework/config/ConfigKey.java     | 28 ++++++++++++++++++++--
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/query/QueryService.java 
b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
index 828f9d5e064..5181ebe2b76 100644
--- a/api/src/main/java/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
@@ -118,7 +118,7 @@ public interface QueryService {
 
     ConfigKey<String> UserVMReadOnlyDetails = new ConfigKey<>(String.class,
     "user.vm.readonly.details", "Advanced", "dataDiskController, 
rootDiskController",
-            "List of read-only VM settings/details as comma separated string", 
true, ConfigKey.Scope.Global, null, null, null, null, null, ConfigKey.Kind.CSV, 
null);
+            "List of read-only VM settings/details as comma separated string", 
true, ConfigKey.Scope.Global, null, null, null, null, null, ConfigKey.Kind.CSV, 
null, "");
 
     ConfigKey<Boolean> SortKeyAscending = new ConfigKey<>("Advanced", 
Boolean.class, "sortkey.algorithm", "true",
             "Sort algorithm - ascending or descending - to use. For entities 
that use sort key(template, disk offering, service offering, " +
diff --git 
a/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
 
b/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
index 00cf56345c8..27b04ddf893 100644
--- 
a/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
+++ 
b/framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
@@ -120,10 +120,18 @@ public class ConfigKey<T> {
 
     static ConfigDepotImpl s_depot = null;
 
-    static public void init(ConfigDepotImpl depot) {
+    private String _defaultValueIfEmpty = null;
+
+    public static void init(ConfigDepotImpl depot) {
         s_depot = depot;
     }
 
+    public ConfigKey(Class<T> type, String name, String category, String 
defaultValue, String description, boolean isDynamic, Scope scope, T multiplier,
+                     String displayText, String parent, Ternary<String, 
String, Long> group, Pair<String, Long> subGroup, Kind kind, String options, 
String defaultValueIfEmpty) {
+        this(type, name, category, defaultValue, description, isDynamic, 
scope, multiplier, displayText, parent, group, subGroup, kind, options);
+        this._defaultValueIfEmpty = defaultValueIfEmpty;
+    }
+
     public ConfigKey(String category, Class<T> type, String name, String 
defaultValue, String description, boolean isDynamic, Scope scope) {
         this(type, name, category, defaultValue, description, isDynamic, 
scope, null);
     }
@@ -216,7 +224,19 @@ public class ConfigKey<T> {
     public T value() {
         if (_value == null || isDynamic()) {
             String value = s_depot != null ? 
s_depot.getConfigStringValue(_name, Scope.Global, null) : null;
-            _value = valueOf((value == null) ? defaultValue() : value);
+
+            String effective;
+            if (value != null) {
+                if (value.isEmpty() && _defaultValueIfEmpty != null) {
+                    effective = _defaultValueIfEmpty;
+                } else {
+                    effective = value;
+                }
+            } else {
+                effective = _defaultValueIfEmpty != null ? 
_defaultValueIfEmpty : defaultValue();
+            }
+
+            _value = valueOf(effective);
         }
 
         return _value;
@@ -231,6 +251,10 @@ public class ConfigKey<T> {
         if (value == null) {
             return value();
         }
+
+        if (value.isEmpty() && _defaultValueIfEmpty != null) {
+            return valueOf(_defaultValueIfEmpty);
+        }
         return valueOf(value);
     }
 

Reply via email to