diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index e45291d38b8..bf72dc2246b 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -701,7 +701,7 @@ public enum Config { "system.vm.use.local.storage", "false", "Indicates whether to use local storage pools or shared storage pools for system VMs.", - null), + null, ConfigKey.Scope.Zone.toString()), SystemVMAutoReserveCapacity( "Advanced", ManagementServer.class, diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index f9546156ab1..c2a5ff5f0da 100644 --- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -198,6 +198,8 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy @Inject protected StoragePoolHostDao _poolHostDao; + @Inject + protected DataCenterDao _zoneDao; @Inject protected VolumeDao _volsDao; @Inject @@ -1271,7 +1273,18 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy boolean useLocalStorage = false; if (vmProfile.getType() != VirtualMachine.Type.User) { String ssvmUseLocalStorage = _configDao.getValue(Config.SystemVMUseLocalStorage.key()); - if (ssvmUseLocalStorage.equalsIgnoreCase("true")) { + + DataCenterVO zone = _zoneDao.findById(plan.getDataCenterId()); + + // It should not happen to have a "null" zone here. There can be NO instance if there is NO zone, + // so this part of the code would never be reached if no zone has been created. + // + // Added the check and the comment just to make it clear. + boolean zoneUsesLocalStorage = zone != null ? zone.isLocalStorageEnabled() : false; + + // Local storage is used for the NON User VMs if, and only if, the Zone is marked to use local storage AND + // the global settings (ssvmUseLocalStorage) is set to true. Otherwise, the global settings won't be applied. + if (ssvmUseLocalStorage.equalsIgnoreCase("true") && zoneUsesLocalStorage) { useLocalStorage = true; } } else {