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);
}