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

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

commit edb62b490c676852460dc8db1f4699f03ed710bd
Merge: 315cd52fd1a bbc23a74683
Author: Daan Hoogland <[email protected]>
AuthorDate: Mon Jan 26 13:30:26 2026 +0100

    Merge branch '4.20' into 4.22

 .../org/apache/cloudstack/query/QueryService.java  |  2 +-
 .../main/java/com/cloud/storage/dao/VolumeDao.java |  6 +--
 .../java/com/cloud/storage/dao/VolumeDaoImpl.java  |  6 +--
 .../storage/configdrive/ConfigDriveBuilder.java    |  4 +-
 .../configdrive/ConfigDriveBuilderTest.java        | 12 ++---
 .../storage/image/SecondaryStorageServiceImpl.java |  2 +-
 .../storage/image/TemplateDataFactoryImpl.java     |  3 ++
 .../storage/image/TemplateServiceImpl.java         |  7 +--
 .../storage/datastore/PrimaryDataStoreImpl.java    |  2 +-
 .../cloudstack/framework/config/ConfigKey.java     | 28 ++++++++++-
 packaging/el8/cloud.spec                           |  2 +-
 .../apache/cloudstack/sioc/SiocManagerImpl.java    |  2 +-
 .../com/cloud/ovm/hypervisor/OvmResourceBase.java  |  2 +-
 .../driver/DateraPrimaryDataStoreDriver.java       |  2 +-
 .../datastore/provider/DateraHostListener.java     |  4 +-
 .../driver/SolidFirePrimaryDataStoreDriver.java    |  2 +-
 .../datastore/provider/SolidFireHostListener.java  |  4 +-
 .../driver/StorPoolPrimaryDataStoreDriver.java     |  2 +-
 scripts/storage/secondary/cloud-install-sys-tmplt  |  1 +
 scripts/storage/secondary/setup-sysvm-tmplt        |  1 +
 .../router/VirtualNetworkApplianceManagerImpl.java |  1 +
 .../com/cloud/resource/ResourceManagerImpl.java    |  4 +-
 .../main/java/com/cloud/server/StatsCollector.java |  2 +-
 .../java/com/cloud/storage/StorageManagerImpl.java | 16 ++++---
 .../cloud/storage/StoragePoolAutomationImpl.java   |  2 +-
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  |  2 +-
 .../cloud/resource/ResourceManagerImplTest.java    | 12 ++---
 .../com/cloud/storage/StorageManagerImplTest.java  | 56 +++++++++++++++++++++-
 28 files changed, 138 insertions(+), 51 deletions(-)

diff --cc 
framework/config/src/main/java/org/apache/cloudstack/framework/config/ConfigKey.java
index 0ea910fcb6d,27b04ddf893..c19ec751153
--- 
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
@@@ -380,35 -224,37 +388,51 @@@ 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;
      }
  
 -    protected T valueInScope(Scope scope, Long id) {
 -        if (id == null) {
 +    protected T valueInGlobalOrAvailableParentScope(Scope scope, Long id) {
 +        if (scopes.size() <= 1) {
              return value();
          }
 +        Pair<Scope, Long> s = new Pair<>(scope, id);
 +        do {
 +            s = s_depot != null ? s_depot.getParentScope(s.first(), 
s.second()) : null;
 +            if (s != null && scopes.contains(s.first())) {
 +                return valueInScope(s.first(), s.second());
 +            }
 +        } while (s != null);
 +        logger.trace("Global value for config ({}): {}", _name, _value);
 +        return value();
 +    }
  
 +    public T valueInScope(Scope scope, Long id) {
 +        if (id == null) {
 +            return value();
 +        }
          String value = s_depot != null ? s_depot.getConfigStringValue(_name, 
scope, id) : null;
          if (value == null) {
 -            return value();
 +            return valueInGlobalOrAvailableParentScope(scope, id);
          }
 +        logger.trace("Scope({}) value for config ({}): {}", scope, _name, 
_value);
+ 
+         if (value.isEmpty() && _defaultValueIfEmpty != null) {
+             return valueOf(_defaultValueIfEmpty);
+         }
          return valueOf(value);
      }
  

Reply via email to