Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.apache.cloudstack.query;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.cloudstack.affinity.AffinityGroupResponse;
Expand Down Expand Up @@ -120,7 +121,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, Collections.singletonList(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, " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,10 +267,18 @@ public String toString() {

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, List<Scope> scopes, 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, scopes, 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);
}
Expand Down Expand Up @@ -380,7 +388,19 @@ public boolean isSameKeyAs(Object obj) {
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;
}
Expand Down Expand Up @@ -409,6 +429,9 @@ public T valueInScope(Scope scope, Long id) {
return valueInGlobalOrAvailableParentScope(scope, id);
}
logger.trace("Scope({}) value for config ({}): {}", scope, _name, _value);
if (value.isEmpty() && _defaultValueIfEmpty != null) {
return valueOf(_defaultValueIfEmpty);
}
return valueOf(value);
}

Expand Down
Loading