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

DaanHoogland pushed a commit to branch ghi10752-configCleanup
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit fc1fc9ba88dca3b07227a96ebd3e63c6169bc2ff
Author: Daan Hoogland <[email protected]>
AuthorDate: Fri Aug 14 07:50:40 2026 +0200

    move storage configuration items from deprecated Config enum to services
---
 .../java/com/cloud/storage/VolumeApiService.java   | 12 ++++
 .../subsystem/api/storage/StorageCacheManager.java | 15 +++++
 .../java/com/cloud/template/TemplateManager.java   |  4 ++
 .../cache/manager/StorageCacheManagerImpl.java     | 19 +++++-
 .../StorageCacheReplacementAlgorithmLRU.java       | 11 ++--
 .../storage/motion/AncientDataMotionStrategy.java  | 15 +++--
 .../motion/StorageSystemDataMotionStrategy.java    |  2 +-
 .../storage/volume/VolumeServiceImpl.java          | 17 +++---
 .../driver/LinstorPrimaryDataStoreDriverImpl.java  | 13 ++---
 .../driver/ScaleIOPrimaryDataStoreDriver.java      |  4 +-
 .../datastore/manager/ScaleIOSDCManagerImpl.java   |  7 +--
 .../driver/ScaleIOPrimaryDataStoreDriverTest.java  |  4 --
 .../datastore/driver/StorPoolStatsCollector.java   |  3 +-
 .../main/java/com/cloud/configuration/Config.java  | 67 ----------------------
 .../main/java/com/cloud/server/StatsCollector.java |  7 ++-
 .../com/cloud/storage/VolumeApiServiceImpl.java    | 11 ++--
 .../storage/download/DownloadMonitorImpl.java      |  5 +-
 .../cloud/storage/snapshot/SnapshotManager.java    |  6 ++
 .../storage/snapshot/SnapshotManagerImpl.java      |  7 +--
 .../com/cloud/template/TemplateManagerImpl.java    |  3 +-
 20 files changed, 104 insertions(+), 128 deletions(-)

diff --git a/api/src/main/java/com/cloud/storage/VolumeApiService.java 
b/api/src/main/java/com/cloud/storage/VolumeApiService.java
index 372eb038561..904ab5b9bc9 100644
--- a/api/src/main/java/com/cloud/storage/VolumeApiService.java
+++ b/api/src/main/java/com/cloud/storage/VolumeApiService.java
@@ -61,6 +61,18 @@ public interface VolumeApiService {
             true,
             ConfigKey.Scope.Zone);
 
+    ConfigKey<Integer> CopyVolumeWait = new ConfigKey<>("Storage", 
Integer.class, "copy.volume.wait", "10800",
+            "In second, timeout for copy volume command", true);
+
+    ConfigKey<Integer> CreateVolumeFromSnapshotWait = new 
ConfigKey<>("Storage", Integer.class, "create.volume.from.snapshot.wait", 
"10800",
+            "In second, timeout for creating volume from snapshot", true);
+
+    ConfigKey<Long> MaxUploadVolumeSize = new ConfigKey<>("Storage", 
Long.class, "storage.max.volume.upload.size", "500",
+            "The maximum size for a uploaded volume(in GB).", true);
+
+    ConfigKey<Integer> StoragePoolMaxWaitSeconds = new ConfigKey<>("Storage", 
Integer.class, "storage.pool.max.waitseconds", "3600",
+            "Timeout (in seconds) to synchronize storage pool operations.", 
true);
+
     /**
      * Creates the database object for a volume based on the given criteria
      *
diff --git 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
index b8aeb5cf751..d17adf16cc6 100644
--- 
a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
+++ 
b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
@@ -18,7 +18,22 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import org.apache.cloudstack.framework.config.ConfigKey;
+
 public interface StorageCacheManager {
+
+    ConfigKey<Boolean> StorageCacheReplacementEnabled = new 
ConfigKey<>("Storage", Boolean.class,
+            "storage.cache.replacement.enabled", "true",
+            "enable or disable cache storage replacement algorithm.", true);
+
+    ConfigKey<Integer> StorageCacheReplacementInterval = new 
ConfigKey<>("Storage", Integer.class,
+            "storage.cache.replacement.interval", "86400",
+            "time interval between cache replacement threads (in seconds).", 
true);
+
+    ConfigKey<Integer> StorageCacheReplacementLRUTimeInterval = new 
ConfigKey<>("Storage", Integer.class,
+            "storage.cache.replacement.lru.interval", "30",
+            "time interval for unused data on cache storage (in days).", true);
+
     DataStore getCacheStorage(Scope scope);
 
     DataStore getCacheStorage(DataObject data, Scope scope);
diff --git 
a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java 
b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
index 8c11fe6c93a..0cadaac4c96 100644
--- 
a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
+++ 
b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
@@ -85,6 +85,10 @@ public interface TemplateManager {
             true,
             ConfigKey.Scope.Cluster);
 
+    ConfigKey<Integer> CreatePrivateTemplateFromSnapshotWait = new 
ConfigKey<>("Storage", Integer.class,
+            "create.private.template.from.snapshot.wait", "10800",
+            "In second, timeout for CreatePrivateTemplateFromSnapshotCommand", 
true);
+
     // KVM/libvirt maps deviceSeq=3 to hdc (hda/hdb are taken by the root 
volume on i440fx/IDE).
     // user_vm.iso_id has always pointed at this slot; additional cdroms live 
in vm_iso_map.
     int CDROM_PRIMARY_DEVICE_SEQ = 3;
diff --git 
a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
 
b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
index 21ef851fb2f..931f5e5281e 100644
--- 
a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
+++ 
b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
@@ -47,6 +47,8 @@ import 
org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
 import org.apache.cloudstack.framework.async.AsyncCallFuture;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.storage.cache.allocator.StorageCacheAllocator;
@@ -64,8 +66,9 @@ import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.exception.CloudRuntimeException;
 
-public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
+public class StorageCacheManagerImpl implements StorageCacheManager, Manager, 
Configurable {
     protected Logger logger = LogManager.getLogger(getClass());
+
     @Inject
     List<StorageCacheAllocator> storageCacheAllocator;
     @Inject
@@ -159,13 +162,23 @@ public class StorageCacheManagerImpl implements 
StorageCacheManager, Manager {
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
-        cacheReplacementEnabled = 
Boolean.parseBoolean(configDao.getValue(Config.StorageCacheReplacementEnabled.key()));
-        cacheReplaceMentInterval = 
NumbersUtil.parseInt(configDao.getValue(Config.StorageCacheReplacementInterval.key()),
 86400);
+        cacheReplacementEnabled = StorageCacheReplacementEnabled.value();
+        cacheReplaceMentInterval = StorageCacheReplacementInterval.value();
         workers = 
NumbersUtil.parseInt(configDao.getValue(Config.ExpungeWorkers.key()), 10);
         executors = Executors.newScheduledThreadPool(workers, new 
NamedThreadFactory("StorageCacheManager-cache-replacement"));
         return true;
     }
 
+    @Override
+    public String getConfigComponentName() {
+        return StorageCacheManager.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] {StorageCacheReplacementEnabled, 
StorageCacheReplacementInterval, StorageCacheReplacementLRUTimeInterval};
+    }
+
     protected class CacheReplacementRunner extends ManagedContextRunnable {
 
         @Override
diff --git 
a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java
 
b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java
index 7042ee45333..3a4c590fa5f 100644
--- 
a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java
+++ 
b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheReplacementAlgorithmLRU.java
@@ -28,22 +28,19 @@ import 
org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import 
org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 
-import com.cloud.configuration.Config;
 import com.cloud.utils.DateUtil;
-import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria;
 
 public class StorageCacheReplacementAlgorithmLRU implements 
StorageCacheReplacementAlgorithm {
-    @Inject
-    ConfigurationDao configDao;
+
     @Inject
     TemplateDataFactory templateFactory;
     @Inject
@@ -59,7 +56,7 @@ public class StorageCacheReplacementAlgorithmLRU implements 
StorageCacheReplacem
 
     @PostConstruct
     public void initialize() {
-        /* Avoid using configDao at this time, we can't be sure that the 
database is already upgraded
+        /* Avoid resolving the config value at this time, we can't be sure 
that the database is already upgraded
          * and there might be fatal errors when using a dao.
          */
     }
@@ -71,7 +68,7 @@ public class StorageCacheReplacementAlgorithmLRU implements 
StorageCacheReplacem
     @Override
     public DataObject chooseOneToBeReplaced(DataStore store) {
         if (unusedTimeInterval == null) {
-            unusedTimeInterval = 
NumbersUtil.parseInt(configDao.getValue(Config.StorageCacheReplacementLRUTimeInterval.key()),
 30);
+            unusedTimeInterval = 
StorageCacheManager.StorageCacheReplacementLRUTimeInterval.value();
         }
         Calendar cal = Calendar.getInstance();
         cal.setTime(DateUtil.now());
diff --git 
a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
 
b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index bbf775de27a..51c1f3425a6 100644
--- 
a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ 
b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -79,9 +79,12 @@ import com.cloud.storage.StorageManager;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.VolumeDao;
+import com.cloud.storage.snapshot.SnapshotManager;
+import com.cloud.template.TemplateManager;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -340,8 +343,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
                 srcData = cacheSnapshotChain(snapshot, new 
ZoneScope(pool.getDataCenterId()));
             }
 
-            String value = 
configDao.getValue(Config.CreateVolumeFromSnapshotWait.toString());
-            int _createVolumeFromSnapshotWait = NumbersUtil.parseInt(value, 
Integer.parseInt(Config.CreateVolumeFromSnapshotWait.getDefaultValue()));
+            int _createVolumeFromSnapshotWait = 
VolumeApiService.CreateVolumeFromSnapshotWait.value();
 
             EndPoint ep = null;
             if (srcData.getDataStore().getRole() == DataStoreRole.Primary) {
@@ -425,8 +427,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
     }
 
     protected Answer copyVolumeBetweenPools(DataObject srcData, DataObject 
destData) {
-        String value = configDao.getValue(Config.CopyVolumeWait.key());
-        int _copyvolumewait = NumbersUtil.parseInt(value, 
Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
+        int _copyvolumewait = VolumeApiService.CopyVolumeWait.value();
 
         Scope destScope = getZoneScope(destData.getDataStore().getScope());
         DataStore cacheStore = cacheMgr.getCacheStorage(destScope);
@@ -733,8 +734,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
     @DB
     protected Answer createTemplateFromSnapshot(DataObject srcData, DataObject 
destData) {
 
-        String value = 
configDao.getValue(Config.CreatePrivateTemplateFromSnapshotWait.toString());
-        int _createprivatetemplatefromsnapshotwait = 
NumbersUtil.parseInt(value, 
Integer.parseInt(Config.CreatePrivateTemplateFromSnapshotWait.getDefaultValue()));
+        int _createprivatetemplatefromsnapshotwait = 
TemplateManager.CreatePrivateTemplateFromSnapshotWait.value();
 
         boolean needCache = false;
         if (needCacheStorage(srcData, destData)) {
@@ -767,8 +767,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
     }
 
     protected Answer copySnapshot(DataObject srcData, DataObject destData) {
-        String value = 
configDao.getValue(Config.BackupSnapshotWait.toString());
-        int _backupsnapshotwait = NumbersUtil.parseInt(value, 
Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
+        int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value();
 
         DataObject cacheData = null;
         SnapshotInfo snapshotInfo = (SnapshotInfo)srcData;
diff --git 
a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
 
b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
index 7674f1ce25a..a98e1fa893b 100644
--- 
a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
+++ 
b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java
@@ -1608,7 +1608,7 @@ public class StorageSystemDataMotionStrategy implements 
DataMotionStrategy {
 
             AsyncCallFuture<VolumeApiResult> future = 
_volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore());
 
-            int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(_configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+            int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
 
             VolumeApiResult result = future.get(storagePoolMaxWaitSeconds, 
TimeUnit.SECONDS);
 
diff --git 
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
 
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index 6502de70a1f..d9d23903bdc 100644
--- 
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ 
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -106,7 +106,6 @@ import com.cloud.agent.api.to.DataObjectType;
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.alert.AlertManager;
-import com.cloud.configuration.Config;
 import com.cloud.configuration.Resource.ResourceType;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.event.EventTypes;
@@ -138,6 +137,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.VolumeApiServiceImpl;
 import com.cloud.storage.Volume.State;
 import com.cloud.storage.VolumeDetailVO;
@@ -155,7 +155,6 @@ import com.cloud.storage.template.TemplateProp;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.ResourceLimitService;
-import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GlobalLock;
@@ -669,7 +668,7 @@ public class VolumeServiceImpl implements VolumeService {
     }
 
     private TemplateInfo waitForTemplateDownloaded(PrimaryDataStore store, 
TemplateInfo template) {
-        int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+        int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
         int sleepTime = 120;
         int tries = storagePoolMaxWaitSeconds / sleepTime;
         while (tries > 0) {
@@ -705,7 +704,7 @@ public class VolumeServiceImpl implements VolumeService {
         AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = 
AsyncCallbackDispatcher.create(this);
         caller.setCallback(caller.getTarget().copyBaseImageCallback(null, 
null)).setContext(context);
 
-        int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+        int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
         if (logger.isDebugEnabled()) {
             logger.debug("Acquire lock on VMTemplateStoragePool " + 
templatePoolRefId + " with timeout " + storagePoolMaxWaitSeconds + " seconds");
         }
@@ -980,7 +979,7 @@ public class VolumeServiceImpl implements VolumeService {
         // At this point, we have an entry in the DB that points to our cached 
template.
         // We need to lock it as there may be other VMs that may get started 
using the same template.
         // We want to avoid having to create multiple cache copies of the same 
template.
-        int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+        int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
         long templatePoolRefId = templatePoolRef.getId();
 
         templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, 
storagePoolMaxWaitSeconds);
@@ -1045,7 +1044,7 @@ public class VolumeServiceImpl implements VolumeService {
     private void copyTemplateToManagedTemplateVolume(TemplateInfo 
srcTemplateInfo, TemplateInfo templateOnPrimary, VMTemplateStoragePoolVO 
templatePoolRef, PrimaryDataStore destPrimaryDataStore,
             Host destHost) throws StorageAccessException {
         AsyncCallFuture<VolumeApiResult> copyTemplateFuture = new 
AsyncCallFuture<>();
-        int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+        int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
         long templatePoolRefId = templatePoolRef.getId();
 
         try {
@@ -1432,7 +1431,7 @@ public class VolumeServiceImpl implements VolumeService {
                 throw new CloudRuntimeException("Unable to create managed 
storage template, couldn't get global lock on " + 
templateIdManagedPoolIdLockString);
             }
 
-            int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+            int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
             if (!lock.lock(storagePoolMaxWaitSeconds)) {
                 logger.debug("Unable to create managed storage template, 
couldn't lock on " + templateIdManagedPoolIdLockString);
                 throw new CloudRuntimeException("Unable to create managed 
storage template, couldn't lock on " + templateIdManagedPoolIdLockString);
@@ -1539,7 +1538,7 @@ public class VolumeServiceImpl implements VolumeService {
                     throw new CloudRuntimeException("Unable to create managed 
storage template/volume, couldn't get global lock on " + 
tmplIdManagedPoolIdLockString);
                 }
 
-                int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+                int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
                 if (!lock.lock(storagePoolMaxWaitSeconds)) {
                     logger.debug("Unable to create managed storage 
template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString);
                     throw new CloudRuntimeException("Unable to create managed 
storage template/volume, couldn't lock on " + tmplIdManagedPoolIdLockString);
@@ -1611,7 +1610,7 @@ public class VolumeServiceImpl implements VolumeService {
                 throw new CloudRuntimeException("Unable to create volume from 
template, couldn't get global lock on " + 
tmplIdManagedPoolIdDestinationHostLockString);
             }
 
-            int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+            int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
             if (!lock.lock(storagePoolMaxWaitSeconds)) {
                 logger.debug("Unable to create volume from template, couldn't 
lock on " + tmplIdManagedPoolIdDestinationHostLockString);
                 throw new CloudRuntimeException("Unable to create volume from 
template, couldn't lock on " + tmplIdManagedPoolIdDestinationHostLockString);
diff --git 
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
 
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
index bc0e0a89706..02b2904e97e 100644
--- 
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
+++ 
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
@@ -71,6 +71,7 @@ import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
@@ -80,6 +81,7 @@ import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.dao.VolumeDetailsDao;
+import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -666,9 +668,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements 
PrimaryDataStoreDriver
         final String rscName)
     throws ApiException {
         String resultMsg = null;
-        String value = 
_configDao.getValue(Config.BackupSnapshotWait.toString());
-        int _backupsnapshotwait = NumbersUtil.parseInt(
-            value, 
Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
+        int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value();
 
         LinstorRevertBackupSnapshotCommand cmd = new 
LinstorRevertBackupSnapshotCommand(
             snapshot.getTO(),
@@ -1018,8 +1018,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements 
PrimaryDataStoreDriver
         // uses the format of the base volume and we backup snapshots as QCOW2
         // 
https://github.com/apache/cloudstack/pull/8802#issuecomment-2024019927
         to.setFormat(Storage.ImageFormat.RAW);
-        int nMaxExecutionSeconds = NumbersUtil.parseInt(
-                _configDao.getValue(Config.CopyVolumeWait.key()), 10800);
+        int nMaxExecutionSeconds = VolumeApiService.CopyVolumeWait.value();
         CopyCommand cmd = new CopyCommand(
                 to,
                 dstData.getTO(),
@@ -1106,9 +1105,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements 
PrimaryDataStoreDriver
     }
 
     protected Answer copySnapshot(DataObject srcData, DataObject destData) {
-        String value = 
_configDao.getValue(Config.BackupSnapshotWait.toString());
-        int _backupsnapshotwait = NumbersUtil.parseInt(
-            value, 
Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
+        int _backupsnapshotwait = SnapshotManager.BackupSnapshotWait.value();
 
         SnapshotObject snapshotObject = (SnapshotObject)srcData;
         Boolean snapshotFullBackup = snapshotObject.getFullBackup();
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
index 14cb82a4c2b..0b257122404 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriver.java
@@ -95,6 +95,7 @@ import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolHostVO;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
@@ -836,8 +837,7 @@ public class ScaleIOPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
     protected Answer copyOfflineVolume(DataObject srcData, DataObject 
destData, Host destHost) {
         // Copy PowerFlex/ScaleIO volume
         logger.debug("Initiating copy from PowerFlex template volume on host 
{}", destHost != null ? destHost : "<not specified>");
-        String value = configDao.getValue(Config.CopyVolumeWait.key());
-        int copyVolumeWait = NumbersUtil.parseInt(value, 
Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
+        int copyVolumeWait = VolumeApiService.CopyVolumeWait.value();
 
         CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), 
copyVolumeWait, VirtualMachineManager.ExecuteInSequence.value());
 
diff --git 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java
 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java
index cb111e9ccac..41455dc7f27 100644
--- 
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java
+++ 
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/manager/ScaleIOSDCManagerImpl.java
@@ -46,14 +46,13 @@ import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PrepareStorageClientAnswer;
 import com.cloud.agent.api.PrepareStorageClientCommand;
 import com.cloud.agent.api.UnprepareStorageClientCommand;
-import com.cloud.configuration.Config;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.OperationTimedoutException;
 import com.cloud.host.Host;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.dao.StoragePoolHostDao;
-import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -134,7 +133,7 @@ public class ScaleIOSDCManagerImpl implements 
ScaleIOSDCManager, Configurable {
                 throw new CloudRuntimeException("Unable to prepare SDC, 
couldn't get global lock on " + hostIdStorageSystemIdLockString);
             }
 
-            int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+            int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
             if (!hostIdStorageSystemIdLock.lock(storagePoolMaxWaitSeconds)) {
                 logger.debug("Unable to prepare SDC, couldn't lock on " + 
hostIdStorageSystemIdLockString);
                 throw new CloudRuntimeException("Unable to prepare SDC, 
couldn't lock on " + hostIdStorageSystemIdLockString);
@@ -280,7 +279,7 @@ public class ScaleIOSDCManagerImpl implements 
ScaleIOSDCManager, Configurable {
                 throw new CloudRuntimeException("Unable to unprepare SDC, 
couldn't get global lock on " + hostIdStorageSystemIdLockString);
             }
 
-            int storagePoolMaxWaitSeconds = 
NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()),
 3600);
+            int storagePoolMaxWaitSeconds = 
VolumeApiService.StoragePoolMaxWaitSeconds.value();
             if (!lock.lock(storagePoolMaxWaitSeconds)) {
                 logger.debug("Unable to unprepare SDC, couldn't lock on " + 
hostIdStorageSystemIdLockString);
                 throw new CloudRuntimeException("Unable to unprepare SDC, 
couldn't lock on " + hostIdStorageSystemIdLockString);
diff --git 
a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
 
b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
index 610b595ee05..f31d9a82b08 100644
--- 
a/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
+++ 
b/plugins/storage/volume/scaleio/src/test/java/org/apache/cloudstack/storage/datastore/driver/ScaleIOPrimaryDataStoreDriverTest.java
@@ -512,8 +512,6 @@ public class ScaleIOPrimaryDataStoreDriverTest {
 
     @Test
     public void testCopyOfflineVolume() {
-        
when(configDao.getValue(Config.CopyVolumeWait.key())).thenReturn("3600");
-
         DataObject srcData = Mockito.mock(DataObject.class);
         DataTO srcDataTO = Mockito.mock(DataTO.class);
         when(srcData.getTO()).thenReturn(srcDataTO);
@@ -535,8 +533,6 @@ public class ScaleIOPrimaryDataStoreDriverTest {
 
     @Test
     public void testCopyOfflineVolumeFailureWhenNoEndpointFound() {
-        
when(configDao.getValue(Config.CopyVolumeWait.key())).thenReturn("3600");
-
         DataObject srcData = Mockito.mock(DataObject.class);
         DataTO srcDataTO = Mockito.mock(DataTO.class);
         when(srcData.getTO()).thenReturn(srcDataTO);
diff --git 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java
 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java
index a2c8b274ce9..487dbb30495 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolStatsCollector.java
@@ -40,6 +40,7 @@ import 
org.apache.cloudstack.storage.snapshot.StorPoolConfigurationManager;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
+import com.cloud.server.StatsCollector;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.dao.SnapshotDao;
@@ -84,7 +85,7 @@ public class StorPoolStatsCollector extends ManagerBase {
         List<StoragePoolVO> spPools = 
storagePoolDao.findPoolsByProvider(StorPoolUtil.SP_PROVIDER_NAME);
         if (CollectionUtils.isNotEmpty(spPools)) {
             executor = Executors.newScheduledThreadPool(3, new 
NamedThreadFactory("StorPoolStatsCollector"));
-            long storageStatsInterval = 
NumbersUtil.parseLong(configurationDao.getValue("storage.stats.interval"), 
60000L);
+            long storageStatsInterval = 
StatsCollector.StorageStatsInterval.value();
             long volumeStatsInterval = 
NumbersUtil.parseLong(configurationDao.getValue("volume.stats.interval"), 
60000L);
 
             if (StorPoolConfigurationManager.VolumesStatsInterval.value() > 0 
&& volumeStatsInterval > 0) {
diff --git a/server/src/main/java/com/cloud/configuration/Config.java 
b/server/src/main/java/com/cloud/configuration/Config.java
index af9133ae4d3..f017741e3c5 100644
--- a/server/src/main/java/com/cloud/configuration/Config.java
+++ b/server/src/main/java/com/cloud/configuration/Config.java
@@ -58,64 +58,6 @@ public enum Config {
 
     // Storage
 
-    StorageStatsInterval(
-            "Storage",
-            ManagementServer.class,
-            String.class,
-            "storage.stats.interval",
-            "60000",
-            "The interval (in milliseconds) when storage stats (per host) are 
retrieved from agents.",
-            null),
-    StorageCacheReplacementLRUTimeInterval(
-            "Storage",
-            ManagementServer.class,
-            Integer.class,
-            "storage.cache.replacement.lru.interval",
-            "30",
-            "time interval for unused data on cache storage (in days).",
-            null),
-    StorageCacheReplacementEnabled(
-            "Storage",
-            ManagementServer.class,
-            Boolean.class,
-            "storage.cache.replacement.enabled",
-            "true",
-            "enable or disable cache storage replacement algorithm.",
-            null),
-    StorageCacheReplacementInterval(
-            "Storage",
-            ManagementServer.class,
-            Integer.class,
-            "storage.cache.replacement.interval",
-            "86400",
-            "time interval between cache replacement threads (in seconds).",
-            null),
-    MaxUploadVolumeSize("Storage", ManagementServer.class, Integer.class, 
"storage.max.volume.upload.size", "500", "The maximum size for a uploaded 
volume(in GB).", null),
-    TotalRetries(
-            "Storage",
-            AgentManager.class,
-            Integer.class,
-            "total.retries",
-            "4",
-            "The number of times each command sent to a host should be retried 
in case of failure.",
-            null),
-    StoragePoolMaxWaitSeconds(
-            "Storage",
-            ManagementServer.class,
-            Integer.class,
-            "storage.pool.max.waitseconds",
-            "3600",
-            "Timeout (in seconds) to synchronize storage pool operations.",
-            null),
-    CreateVolumeFromSnapshotWait(
-            "Storage",
-            StorageManager.class,
-            Integer.class,
-            "create.volume.from.snapshot.wait",
-            "10800",
-            "In second, timeout for creating volume from snapshot",
-            null),
-    CopyVolumeWait("Storage", StorageManager.class, Integer.class, 
"copy.volume.wait", "10800", "In second, timeout for copy volume command", 
null),
     CreatePrivateTemplateFromVolumeWait(
             "Storage",
             UserVmManager.class,
@@ -124,15 +66,6 @@ public enum Config {
             "10800",
             "In second, timeout for CreatePrivateTemplateFromVolumeCommand",
             null),
-    CreatePrivateTemplateFromSnapshotWait(
-            "Storage",
-            UserVmManager.class,
-            Integer.class,
-            "create.private.template.from.snapshot.wait",
-            "10800",
-            "In second, timeout for CreatePrivateTemplateFromSnapshotCommand",
-            null),
-    BackupSnapshotWait("Storage", StorageManager.class, Integer.class, 
"backup.snapshot.wait", "21600", "In second, timeout for 
BackupSnapshotCommand", null),
     HAStorageMigration(
             "Storage",
             ManagementServer.class,
diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java 
b/server/src/main/java/com/cloud/server/StatsCollector.java
index 293b28c6cb4..2e53bd1c017 100644
--- a/server/src/main/java/com/cloud/server/StatsCollector.java
+++ b/server/src/main/java/com/cloud/server/StatsCollector.java
@@ -275,6 +275,8 @@ public class StatsCollector extends ManagerBase implements 
ComponentMethodInterc
     private static final ConfigKey<Integer> StatsTimeout = new 
ConfigKey<>("Advanced", Integer.class, "stats.timeout", "60000",
             "The timeout for stats call in milli seconds.", true,
             ConfigKey.Scope.Cluster);
+    public static final ConfigKey<Long> StorageStatsInterval = new 
ConfigKey<>("Storage", Long.class, "storage.stats.interval", "60000",
+            "The interval (in milliseconds) when storage stats (per host) are 
retrieved from agents.", true);
     private static final ConfigKey<String> statsOutputUri = new 
ConfigKey<>("Advanced", String.class, "stats.output.uri", "",
             "URI to send StatsCollector statistics to. The collector is 
defined on the URI scheme. Example: graphite://graphite-hostaddress:port or 
influxdb://influxdb-hostaddress/dbname. Note that the port is optional, if not 
added the default port for the respective collector (graphite or influxdb) will 
be used. Additionally, the database name '/dbname' is  also optional; default 
db name is 'cloudstack'. You must create and configure the database if using 
influxdb.",
             true);
@@ -445,7 +447,7 @@ public class StatsCollector extends ManagerBase implements 
ComponentMethodInterc
 
         hostStatsInterval = 
NumbersUtil.parseLong(configs.get("host.stats.interval"), 
ONE_MINUTE_IN_MILLISCONDS);
         vmStatsInterval = 
NumbersUtil.parseLong(configs.get("vm.stats.interval"), 
ONE_MINUTE_IN_MILLISCONDS);
-        storageStatsInterval = 
NumbersUtil.parseLong(configs.get("storage.stats.interval"), 
ONE_MINUTE_IN_MILLISCONDS);
+        storageStatsInterval = StorageStatsInterval.value();
         volumeStatsInterval = 
NumbersUtil.parseLong(configs.get("volume.stats.interval"), 
ONE_MINUTE_IN_MILLISCONDS);
         autoScaleStatsInterval = 
AutoScaleManager.AutoScaleStatsInterval.value();
         ManagementServerStatusAdministrator 
managementServerStatusAdministrator = new ManagementServerStatusAdministrator();
@@ -2208,7 +2210,8 @@ public class StatsCollector extends ManagerBase 
implements ComponentMethodInterc
             vmStatsIncrementMetrics, vmStatsMaxRetentionTime, 
vmStatsCollectUserVMOnly, vmDiskStatsRetentionEnabled, 
vmDiskStatsMaxRetentionTime,
                 MANAGEMENT_SERVER_STATUS_COLLECTION_INTERVAL,
                 DATABASE_SERVER_STATUS_COLLECTION_INTERVAL,
-                DATABASE_SERVER_LOAD_HISTORY_RETENTION_NUMBER};
+                DATABASE_SERVER_LOAD_HISTORY_RETENTION_NUMBER,
+                StorageStatsInterval};
     }
 
     public double getImageStoreCapacityThreshold() {
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java 
b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index 535946ecdbc..665aa59d7bb 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -560,7 +560,7 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
                     command.setLocalPath(volumeStore.getLocalDownloadPath());
                     //using the existing max upload size configuration
                     
command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"),
 3600));
-                    
command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
+                    
command.setMaxUploadSize(String.valueOf(MaxUploadVolumeSize.value()));
 
                     long accountId = vol.getAccountId();
                     Account account = _accountDao.findById(accountId);
@@ -4873,9 +4873,6 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
         if (secStore == null) {
             throw new InvalidParameterValueException(String.format("Secondary 
storage to satisfy storage needs cannot be found for zone: %d", zoneId));
         }
-        String value = _configDao.getValue(Config.CopyVolumeWait.toString());
-        NumbersUtil.parseInt(value, 
Integer.parseInt(Config.CopyVolumeWait.getDefaultValue()));
-
         // Copy volume from primary to secondary storage
         VolumeInfo srcVol = volFactory.getVolume(volumeId);
         VolumeInfo destVol = volFactory.getVolume(volumeId, 
DataStoreRole.Image);
@@ -5786,7 +5783,11 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
                 MatchStoragePoolTagsWithDiskOffering,
                 UseHttpsToUpload,
                 WaitDetachDevice,
-                AllowCheckAndRepairVolume
+                AllowCheckAndRepairVolume,
+                CopyVolumeWait,
+                CreateVolumeFromSnapshotWait,
+                MaxUploadVolumeSize,
+                StoragePoolMaxWaitSeconds
         };
     }
 }
diff --git 
a/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java 
b/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java
index 5258f433755..3344fe0f235 100644
--- a/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java
+++ b/server/src/main/java/com/cloud/storage/download/DownloadMonitorImpl.java
@@ -53,6 +53,7 @@ import com.cloud.configuration.Config;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.RegisterVolumePayload;
 import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.storage.template.TemplateConstants;
 import com.cloud.storage.upload.UploadListener;
@@ -336,7 +337,7 @@ public class DownloadMonitorImpl extends ManagerBase 
implements DownloadMonitor
 
     private Long getMaxVolumeSizeInBytes() {
         try {
-            return 
Long.parseLong(_configDao.getValue("storage.max.volume.upload.size")) * 1024L * 
1024L * 1024L;
+            return VolumeApiService.MaxUploadVolumeSize.value() * 1024L * 
1024L * 1024L;
         } catch (NumberFormatException e) {
             return null;
         }
@@ -344,7 +345,7 @@ public class DownloadMonitorImpl extends ManagerBase 
implements DownloadMonitor
 
     private Long getMaxSnapshotSizeInBytes() {
         try {
-            return 
Long.parseLong(_configDao.getValue("storage.max.volume.upload.size")) * 1024L * 
1024L * 1024L;
+            return VolumeApiService.MaxUploadVolumeSize.value() * 1024L * 
1024L * 1024L;
         } catch (NumberFormatException e) {
             return null;
         }
diff --git 
a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java 
b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
index 10dcc2683de..0e802be3371 100644
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManager.java
@@ -72,6 +72,12 @@ public interface SnapshotManager extends Configurable {
             "For snapshot copy to another primary storage in a different zone. 
This is supported only for StorPool storage for now.",
             true, ConfigKey.Scope.StoragePool, null);
 
+    ConfigKey<Integer> BackupSnapshotWait = new ConfigKey<>("Storage", 
Integer.class, "backup.snapshot.wait", "21600",
+            "In second, timeout for BackupSnapshotCommand", true);
+
+    ConfigKey<Integer> TotalRetries = new ConfigKey<>("Storage", 
Integer.class, "total.retries", "4",
+            "The number of times each command sent to a host should be retried 
in case of failure.", true);
+
     void deletePoliciesForVolume(Long volumeId);
 
     /**
diff --git 
a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java 
b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index dc33a4442a3..fe3f9add5a0 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -310,7 +310,8 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
     @Override
     public ConfigKey<?>[] getConfigKeys() {
         return new ConfigKey<?>[] {BackupRetryAttempts, BackupRetryInterval, 
SnapshotHourlyMax, SnapshotDailyMax, SnapshotMonthlyMax, SnapshotWeeklyMax, 
usageSnapshotSelection,
-                SnapshotInfo.BackupSnapshotAfterTakingSnapshot, 
VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, 
snapshotShowChainSize, UseStorageReplication, KVMSnapshotEnabled};
+                SnapshotInfo.BackupSnapshotAfterTakingSnapshot, 
VmStorageSnapshotKvm, kvmIncrementalSnapshot, snapshotDeltaMax, 
snapshotShowChainSize, UseStorageReplication, KVMSnapshotEnabled,
+                BackupSnapshotWait, TotalRetries};
     }
 
     @Override
@@ -1882,13 +1883,11 @@ public class SnapshotManagerImpl extends 
MutualExclusiveIdsManagerBase implement
     @Override
     public boolean configure(String name, Map<String, Object> params) throws 
ConfigurationException {
 
-        String value = 
_configDao.getValue(Config.BackupSnapshotWait.toString());
-
         Type.HOURLY.setMax(SnapshotHourlyMax.value());
         Type.DAILY.setMax(SnapshotDailyMax.value());
         Type.WEEKLY.setMax(SnapshotWeeklyMax.value());
         Type.MONTHLY.setMax(SnapshotMonthlyMax.value());
-        _totalRetries = 
NumbersUtil.parseInt(_configDao.getValue("total.retries"), 4);
+        _totalRetries = TotalRetries.value();
         _pauseInterval = 2 * 
NumbersUtil.parseInt(_configDao.getValue("ping.interval"), 60);
 
         snapshotBackupRetries = BackupRetryAttempts.value();
diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java 
b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
index 41668470719..21c6e674db1 100755
--- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
@@ -2753,7 +2753,8 @@ public class TemplateManagerImpl extends ManagerBase 
implements TemplateManager,
                 TemplateDeleteFromPrimaryStorage,
                 PublicTemplateSecStorageCopy,
                 PrivateTemplateSecStorageCopy,
-                VmIsoMaxCount};
+                VmIsoMaxCount,
+                CreatePrivateTemplateFromSnapshotWait};
     }
 
     public List<TemplateAdapter> getTemplateAdapters() {

Reply via email to