From 9321bcbba66b94007953382717236ae42c3b5754 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 22 Oct 2026 11:35:46 +0200 Subject: [PATCH] use ConfigKeys for deployment planning, ELB, API rate limit, LB and firewall settings Part of the split of #13884 (phase out the Config enum, #10752). Co-Authored-By: Claude Opus 5.5 --- .../admin/ratelimit/ResetApiLimitCmd.java | 5 +- .../user/ratelimit/GetApiLimitCmd.java | 5 +- .../ratelimit/ApiRateLimitServiceImpl.java | 23 ++----- .../ratelimit/ApiRateLimitTest.java | 65 +++++++++++++++++-- .../cloud/deploy/UserDispersingPlanner.java | 6 +- .../element/ElasticLoadBalancerElement.java | 6 +- .../lb/ElasticLoadBalancerManagerImpl.java | 9 +-- .../network/element/NetscalerElement.java | 10 +-- .../PaloAltoExternalFirewallElement.java | 5 +- .../allocator/impl/FirstFitAllocator.java | 3 +- .../ConfigurationManagerImpl.java | 4 +- .../deploy/DeploymentPlanningManagerImpl.java | 14 ++-- .../com/cloud/deploy/FirstFitPlanner.java | 11 ++-- .../ExternalFirewallDeviceManager.java | 2 - .../ExternalFirewallDeviceManagerImpl.java | 3 +- ...ExternalLoadBalancerDeviceManagerImpl.java | 4 +- .../network/firewall/FirewallManagerImpl.java | 4 +- .../network/lb/LBHealthCheckManagerImpl.java | 3 +- .../cloud/server/ManagementServerImpl.java | 30 ++++++--- .../com/cloud/vm/FirstFitPlannerTest.java | 3 +- 20 files changed, 122 insertions(+), 93 deletions(-) diff --git a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/admin/ratelimit/ResetApiLimitCmd.java b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/admin/ratelimit/ResetApiLimitCmd.java index 663b4fa83544..f123a4078cff 100644 --- a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/admin/ratelimit/ResetApiLimitCmd.java +++ b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/admin/ratelimit/ResetApiLimitCmd.java @@ -18,7 +18,6 @@ import javax.inject.Inject; - import org.apache.cloudstack.api.ACL; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; @@ -31,8 +30,8 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.ratelimit.ApiRateLimitService; +import com.cloud.server.ManagementServer; -import com.cloud.configuration.Config; import com.cloud.user.Account; @APICommand(name = "resetApiLimit", responseObject = SuccessResponse.class, description = "Reset api count", @@ -82,7 +81,7 @@ public long getEntityOwnerId() { @Override public void execute() { - boolean apiLimitEnabled = Boolean.parseBoolean(_configDao.getValue(Config.ApiLimitEnabled.key())); + boolean apiLimitEnabled = ManagementServer.ApiLimitEnabled.value(); if (!apiLimitEnabled) { throw new ServerApiException(ApiErrorCode.UNSUPPORTED_ACTION_ERROR, "This api is only available when api.throttling.enabled = true."); } diff --git a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/user/ratelimit/GetApiLimitCmd.java b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/user/ratelimit/GetApiLimitCmd.java index eafe2782d33f..ddef1e4066aa 100644 --- a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/user/ratelimit/GetApiLimitCmd.java +++ b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/api/command/user/ratelimit/GetApiLimitCmd.java @@ -18,7 +18,6 @@ import javax.inject.Inject; - import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -27,8 +26,8 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.ratelimit.ApiRateLimitService; +import com.cloud.server.ManagementServer; -import com.cloud.configuration.Config; import com.cloud.user.Account; @APICommand(name = "getApiLimit", responseObject = ApiLimitResponse.class, description = "Get API limit count for the caller", @@ -58,7 +57,7 @@ public long getEntityOwnerId() { @Override public void execute() { - boolean apiLimitEnabled = Boolean.parseBoolean(_configDao.getValue(Config.ApiLimitEnabled.key())); + boolean apiLimitEnabled = ManagementServer.ApiLimitEnabled.value(); if (!apiLimitEnabled) { throw new ServerApiException(ApiErrorCode.UNSUPPORTED_ACTION_ERROR, "This api is only available when api.throttling.enabled = true."); } diff --git a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/ratelimit/ApiRateLimitServiceImpl.java b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/ratelimit/ApiRateLimitServiceImpl.java index cc342249bd68..5a24e4673bb0 100644 --- a/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/ratelimit/ApiRateLimitServiceImpl.java +++ b/plugins/api/rate-limit/src/main/java/org/apache/cloudstack/ratelimit/ApiRateLimitServiceImpl.java @@ -42,9 +42,9 @@ import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import com.cloud.configuration.Config; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.RequestLimitException; +import com.cloud.server.ManagementServer; import com.cloud.user.Account; import com.cloud.user.AccountService; import com.cloud.user.User; @@ -82,25 +82,12 @@ public boolean configure(String name, Map params) throws Configu if (_store == null) { // get global configured duration and max values - String isEnabled = _configDao.getValue(Config.ApiLimitEnabled.key()); - if (isEnabled != null) { - enabled = Boolean.parseBoolean(isEnabled); - } - String duration = _configDao.getValue(Config.ApiLimitInterval.key()); - if (duration != null) { - timeToLive = Integer.parseInt(duration); - } - String maxReqs = _configDao.getValue(Config.ApiLimitMax.key()); - if (maxReqs != null) { - maxAllowed = Integer.parseInt(maxReqs); - } + enabled = ManagementServer.ApiLimitEnabled.value(); + timeToLive = ManagementServer.ApiLimitInterval.value(); + maxAllowed = ManagementServer.ApiLimitMax.value(); // create limit store EhcacheLimitStore cacheStore = new EhcacheLimitStore(); - int maxElements = 10000; - String cachesize = _configDao.getValue(Config.ApiLimitCacheSize.key()); - if (cachesize != null) { - maxElements = Integer.parseInt(cachesize); - } + int maxElements = ApiLimitCacheSize.value(); CacheManager cm = CacheManager.create(); Cache cache = new Cache("api-limit-cache", maxElements, false, false, timeToLive, timeToLive); cm.addCache(cache); diff --git a/plugins/api/rate-limit/src/test/java/org/apache/cloudstack/ratelimit/ApiRateLimitTest.java b/plugins/api/rate-limit/src/test/java/org/apache/cloudstack/ratelimit/ApiRateLimitTest.java index 5687de29d40f..4f7ecfea0c6e 100644 --- a/plugins/api/rate-limit/src/test/java/org/apache/cloudstack/ratelimit/ApiRateLimitTest.java +++ b/plugins/api/rate-limit/src/test/java/org/apache/cloudstack/ratelimit/ApiRateLimitTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.when; import java.util.Collections; +import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -34,10 +35,12 @@ import org.junit.Test; import org.apache.cloudstack.api.response.ApiLimitResponse; +import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.config.impl.ConfigDepotImpl; -import com.cloud.configuration.Config; import com.cloud.exception.RequestLimitException; +import com.cloud.server.ManagementServer; import com.cloud.user.Account; import com.cloud.user.AccountService; import com.cloud.user.AccountVO; @@ -55,10 +58,10 @@ public class ApiRateLimitTest { @BeforeClass public static void setUp() throws ConfigurationException { - when(s_configDao.getValue(Config.ApiLimitInterval.key())).thenReturn(null); - when(s_configDao.getValue(Config.ApiLimitMax.key())).thenReturn(null); - when(s_configDao.getValue(Config.ApiLimitCacheSize.key())).thenReturn(null); - when(s_configDao.getValue(Config.ApiLimitEnabled.key())).thenReturn("true"); // enable api rate limiting + when(s_configDao.getValue(ManagementServer.ApiLimitInterval.key())).thenReturn(null); + when(s_configDao.getValue(ManagementServer.ApiLimitMax.key())).thenReturn(null); + when(s_configDao.getValue(ApiRateLimitService.ApiLimitCacheSize.key())).thenReturn(null); + when(s_configDao.getValue(ManagementServer.ApiLimitEnabled.key())).thenReturn("true"); // enable api rate limiting s_limitService._configDao = s_configDao; s_limitService.configure("ApiRateLimitTest", Collections. emptyMap()); @@ -240,6 +243,58 @@ public void verifySearchCounter() throws Exception { } + // configure() assigns enabled/timeToLive/maxAllowed from the persisted config + // values before it (re-)creates the shared "api-limit-cache" ehcache; since that + // cache name is already owned by s_limitService for the lifetime of this test + // class, a second configure() call on a fresh instance may throw when it tries to + // register a cache of the same name again. That's fine here — the fields we're + // asserting on are already set by the time that happens, so we only care that + // configure() didn't fail for some other reason first. + private void configureTolerantOfDuplicateCache(ApiRateLimitServiceImpl service, Map params) throws ConfigurationException { + try { + service.configure("ApiRateLimitTest-wiring", params); + } catch (RuntimeException e) { + if (!(e instanceof net.sf.ehcache.CacheException)) { + throw e; + } + } + } + + @Test + public void configureAppliesPersistedGlobalSettings() throws Exception { + ApiRateLimitServiceImpl service = new ApiRateLimitServiceImpl(); + ConfigDepotImpl configDepot = mock(ConfigDepotImpl.class); + when(configDepot.getConfigStringValue(ManagementServer.ApiLimitEnabled.key(), ConfigKey.Scope.Global, null)).thenReturn("true"); + when(configDepot.getConfigStringValue(ManagementServer.ApiLimitInterval.key(), ConfigKey.Scope.Global, null)).thenReturn("5"); + when(configDepot.getConfigStringValue(ManagementServer.ApiLimitMax.key(), ConfigKey.Scope.Global, null)).thenReturn("100"); + when(configDepot.getConfigStringValue(ApiRateLimitService.ApiLimitCacheSize.key(), ConfigKey.Scope.Global, null)).thenReturn("20000"); + ConfigKey.init(configDepot); + try { + configureTolerantOfDuplicateCache(service, Collections. emptyMap()); + } finally { + ConfigKey.init(null); + } + + assertTrue(service.isEnabled()); + assertEquals(5, service.getTimeToLive()); + assertEquals(100, service.getMaxAllowed()); + } + + @Test + public void configureFallsBackToConfigKeyDefaultsWhenNothingPersisted() throws Exception { + ApiRateLimitServiceImpl service = new ApiRateLimitServiceImpl(); + ConfigKey.init(mock(ConfigDepotImpl.class)); + try { + configureTolerantOfDuplicateCache(service, Collections. emptyMap()); + } finally { + ConfigKey.init(null); + } + + assertEquals(Boolean.parseBoolean(ManagementServer.ApiLimitEnabled.defaultValue()), service.isEnabled()); + assertEquals(Integer.parseInt(ManagementServer.ApiLimitInterval.defaultValue()), service.getTimeToLive()); + assertEquals(Integer.parseInt(ManagementServer.ApiLimitMax.defaultValue()), service.getMaxAllowed()); + } + @Test public void disableApiLimit() throws Exception { try { diff --git a/plugins/deployment-planners/user-dispersing/src/main/java/com/cloud/deploy/UserDispersingPlanner.java b/plugins/deployment-planners/user-dispersing/src/main/java/com/cloud/deploy/UserDispersingPlanner.java index c5d81e9a51b8..6a911a5bd04e 100644 --- a/plugins/deployment-planners/user-dispersing/src/main/java/com/cloud/deploy/UserDispersingPlanner.java +++ b/plugins/deployment-planners/user-dispersing/src/main/java/com/cloud/deploy/UserDispersingPlanner.java @@ -25,9 +25,6 @@ import javax.naming.ConfigurationException; - -import com.cloud.configuration.Config; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.vm.VirtualMachineProfile; @@ -188,8 +185,7 @@ private List orderByApplyingWeights(Pair, Map> ca public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); - String weight = configDao.getValue(Config.VmUserDispersionWeight.key()); - _userDispersionWeight = NumbersUtil.parseFloat(weight, 1.0f); + _userDispersionWeight = VmUserDispersionWeight.value(); return true; } diff --git a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/element/ElasticLoadBalancerElement.java b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/element/ElasticLoadBalancerElement.java index 06ff497dfd25..3cbc254722ca 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/element/ElasticLoadBalancerElement.java +++ b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/element/ElasticLoadBalancerElement.java @@ -29,7 +29,6 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.configuration.Config; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -48,6 +47,7 @@ import com.cloud.network.rules.LoadBalancerContainer; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.server.ManagementServer; import com.cloud.utils.component.AdapterBase; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; @@ -166,10 +166,10 @@ public boolean applyLBRules(Network network, List rules) thro public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); - String enabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + String enabled = ManagementServer.ElasticLoadBalancerEnabled.value(); _enabled = (enabled == null) ? false : Boolean.parseBoolean(enabled); if (_enabled) { - String traffType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); + String traffType = ManagementServer.ElasticLoadBalancerNetwork.value(); if ("guest".equalsIgnoreCase(traffType)) { _frontEndTrafficType = TrafficType.Guest; } else if ("public".equalsIgnoreCase(traffType)) { diff --git a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 4666374aa636..a0432b28b944 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -84,6 +84,7 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage; @@ -309,11 +310,11 @@ public boolean configure(String name, Map params) throws Configu throw new ConfigurationException(msg); } - String enabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + String enabled = ManagementServer.ElasticLoadBalancerEnabled.value(); _enabled = (enabled == null) ? false : Boolean.parseBoolean(enabled); logger.info("Elastic Load balancer enabled: " + _enabled); if (_enabled) { - String traffType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); + String traffType = ManagementServer.ElasticLoadBalancerNetwork.value(); if ("guest".equalsIgnoreCase(traffType)) { _frontendTrafficType = TrafficType.Guest; } else if ("public".equalsIgnoreCase(traffType)) { @@ -321,7 +322,7 @@ public boolean configure(String name, Map params) throws Configu } else throw new ConfigurationException("ELB: Traffic type for front end of load balancer has to be guest or public; found : " + traffType); logger.info("ELB: Elastic Load Balancer: will balance on " + traffType); - int gcIntervalMinutes = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmGcInterval.key()), 5); + int gcIntervalMinutes = NumbersUtil.parseInt(configs.get(ElasticLoadBalancerVmGcInterval.key()), 5); if (gcIntervalMinutes < 5) gcIntervalMinutes = 5; logger.info("ELB: Elastic Load Balancer: scheduling GC to run every " + gcIntervalMinutes + " minutes"); @@ -485,7 +486,7 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl if (defaultDns2 != null) { buf.append(" dns2=").append(defaultDns2); } - String msPublicKey = _configDao.getValue("ssh.publickey"); + String msPublicKey = ManagementServer.SshPublicKey.value(); buf.append(" authorized_key=").append(VirtualMachineGuru.getEncodedMsPublicKey(msPublicKey)); if (SystemVmEnableUserData.valueIn(dc.getId())) { diff --git a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/element/NetscalerElement.java index cf2538329959..a2aed6cd1577 100644 --- a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/element/NetscalerElement.java +++ b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/element/NetscalerElement.java @@ -67,7 +67,6 @@ import com.cloud.api.response.NetScalerServicePackageResponse; import com.cloud.api.response.NetscalerControlCenterResponse; import com.cloud.api.response.NetscalerLoadBalancerResponse; -import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; @@ -141,7 +140,6 @@ import com.cloud.resource.ResourceState; import com.cloud.resource.ServerResource; import com.cloud.user.Account; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; @@ -297,7 +295,7 @@ public HostVO allocateNCCResourceForNetwork(Network guestConfig) throws Configur hostDetails.put("username", nccVO.getUsername()); hostDetails.put("password", DBEncryptionUtil.decrypt(nccVO.getPassword())); hostDetails.put("deviceName", "netscaler control center"); - hostDetails.put("cmdTimeOut", Long.toString(NumbersUtil.parseInt(_configDao.getValue(Config.NCCCmdTimeOut.key()), 600000))); + hostDetails.put("cmdTimeOut", Long.toString(NCCCmdTimeOut.value())); ServerResource resource = new NetScalerControlCenterResource(); resource.configure(hostName, hostDetails); final Host host = _resourceMgr.addHost(guestConfig.getDataCenterId(), resource, Host.Type.NetScalerControlCenter, hostDetails); @@ -947,8 +945,7 @@ public NetscalerLoadBalancerResponse createNetscalerLoadBalancerResponse(Externa response.setPrivateInterface(lbDetails.get("privateInterface")); response.setDeviceName(lbDeviceVO.getDeviceName()); if (lbDeviceVO.getCapacity() == 0) { - long defaultLbCapacity = NumbersUtil - .parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); + long defaultLbCapacity = DefaultExternalLoadBalancerCapacity.value(); response.setDeviceCapacity(defaultLbCapacity); } else { response.setDeviceCapacity(lbDeviceVO.getCapacity()); @@ -1161,8 +1158,7 @@ public boolean applyStaticNats(Network config, List rules) return false; } - boolean multiNetScalerDeployment = Boolean - .valueOf(_configDao.getValue(Config.EIPWithMultipleNetScalersEnabled.key())); + boolean multiNetScalerDeployment = EIPWithMultipleNetScalersEnabled.value(); try { if (!multiNetScalerDeployment) { diff --git a/plugins/network-elements/palo-alto/src/main/java/com/cloud/network/element/PaloAltoExternalFirewallElement.java b/plugins/network-elements/palo-alto/src/main/java/com/cloud/network/element/PaloAltoExternalFirewallElement.java index c81ac5f5f0c3..8137012f0a11 100644 --- a/plugins/network-elements/palo-alto/src/main/java/com/cloud/network/element/PaloAltoExternalFirewallElement.java +++ b/plugins/network-elements/palo-alto/src/main/java/com/cloud/network/element/PaloAltoExternalFirewallElement.java @@ -24,7 +24,6 @@ import javax.inject.Inject; - import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice; @@ -35,7 +34,6 @@ import com.cloud.api.commands.ListPaloAltoFirewallNetworksCmd; import com.cloud.api.commands.ListPaloAltoFirewallsCmd; import com.cloud.api.response.PaloAltoFirewallResponse; -import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; @@ -74,7 +72,6 @@ import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicProfile; @@ -406,7 +403,7 @@ public PaloAltoFirewallResponse createPaloAltoFirewallResponse(ExternalFirewallD } response.setDeviceName(fwDeviceVO.getDeviceName()); if (fwDeviceVO.getCapacity() == 0) { - long defaultFwCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalFirewallCapacity.key()), 50); + long defaultFwCapacity = DefaultExternalFirewallCapacity.value(); response.setDeviceCapacity(defaultFwCapacity); } else { response.setDeviceCapacity(fwDeviceVO.getCapacity()); diff --git a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 4bc34d8a5c60..49d6c418f3f3 100644 --- a/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -23,7 +23,6 @@ import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; -import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.deploy.DeploymentClusterPlanner; import com.cloud.deploy.DeploymentPlan; @@ -288,7 +287,7 @@ private Pair, Map> getOrderedHostsByCapacity(Long zoneI double cpuToMemoryWeight = ConfigurationManager.HostCapacityTypeCpuMemoryWeight.value(); // Get capacity by which we should reorder short capacityType = FirstFitPlanner.getHostCapacityTypeToOrderCluster( - _configDao.getValue(Config.HostCapacityTypeToOrderClusters.key()), cpuToMemoryWeight); + DeploymentClusterPlanner.HostCapacityTypeToOrderClusters.value(), cpuToMemoryWeight); logger.debug("CapacityType: {} is used for Host ordering", FirstFitPlanner.getCapacityTypeName(capacityType)); if (capacityType >= 0) { // for CPU or RAM return _capacityDao.orderHostsByFreeCapacity(zoneId, clusterId, capacityType); diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 8682aa7196ea..4a5bc4494b84 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -647,8 +647,8 @@ protected void weightBasedParametersForValidation() { weightBasedParametersForValidation.add(CapacityManager.StorageAllocatedCapacityDisableThresholdForVolumeSize.key()); weightBasedParametersForValidation.add(DeploymentClusterPlanner.ClusterCPUCapacityDisableThreshold.key()); weightBasedParametersForValidation.add(DeploymentClusterPlanner.ClusterMemoryCapacityDisableThreshold.key()); - weightBasedParametersForValidation.add(Config.AgentLoadThreshold.key()); - weightBasedParametersForValidation.add(Config.VmUserDispersionWeight.key()); + weightBasedParametersForValidation.add("agent.load.threshold"); + weightBasedParametersForValidation.add(DeploymentClusterPlanner.VmUserDispersionWeight.key()); weightBasedParametersForValidation.add(CapacityManager.SecondaryStorageCapacityThreshold.key()); weightBasedParametersForValidation.add(ClusterDrsService.ClusterDrsImbalanceThreshold.key()); weightBasedParametersForValidation.add(ClusterDrsService.ClusterDrsImbalanceSkipThreshold.key()); diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java index d1ce668e68ec..05cef975a67b 100644 --- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -76,7 +76,6 @@ import com.cloud.agent.manager.allocator.HostAllocator; import com.cloud.capacity.CapacityManager; import com.cloud.capacity.dao.CapacityDao; -import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.cpu.CPU; import com.cloud.dc.ClusterDetailsDao; @@ -131,7 +130,6 @@ import com.cloud.user.dao.AccountDao; import com.cloud.utils.DateUtil; import com.cloud.utils.LogUtils; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; @@ -380,7 +378,7 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym } else if (vm.getHypervisorType() == HypervisorType.External) { plannerName = "ExternalServerPlanner"; } else { - plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key()); + plannerName = VmDeploymentPlanner.value(); } } planner = getDeploymentPlannerByName(plannerName); @@ -1327,13 +1325,11 @@ public void onPublishMessage(String senderAddress, String subject, Object obj) { } }); - _vmCapacityReleaseInterval = NumbersUtil.parseInt(_configDao.getValue(Config.CapacitySkipcountingHours.key()), 3600); + _vmCapacityReleaseInterval = UserVmManager.CapacitySkipcountingHours.value(); - String hostReservationReleasePeriod = _configDao.getValue(Config.HostReservationReleasePeriod.key()); - if (hostReservationReleasePeriod != null) { - _hostReservationReleasePeriod = Long.parseLong(hostReservationReleasePeriod); - if (_hostReservationReleasePeriod <= 0) - _hostReservationReleasePeriod = Long.parseLong(Config.HostReservationReleasePeriod.getDefaultValue()); + _hostReservationReleasePeriod = HostReservationReleasePeriod.value(); + if (_hostReservationReleasePeriod <= 0) { + _hostReservationReleasePeriod = Long.parseLong(HostReservationReleasePeriod.defaultValue()); } _timer = new Timer("HostReservationReleaseChecker"); diff --git a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java index ae58b99b5467..c811d2a7da40 100644 --- a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java @@ -42,7 +42,6 @@ import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityManager; import com.cloud.capacity.dao.CapacityDao; -import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenter; @@ -183,7 +182,7 @@ public List orderClusters(VirtualMachineProfile vmProfile, DeploymentPlan } else { logger.debug("Searching all possible resources under this Zone: {}", dcDao.findById(plan.getDataCenterId())); - boolean applyAllocationAtPods = Boolean.parseBoolean(configDao.getValue(Config.ApplyAllocationAlgorithmToPods.key())); + boolean applyAllocationAtPods = ApplyAllocationAlgorithmToPods.value(); if (applyAllocationAtPods) { //start scan at all pods under this zone. clusterList = scanPodsForDestination(vmProfile, plan, avoid); @@ -522,7 +521,7 @@ protected Pair, Map> listPodsByCapacity(long zoneId, in private Pair, Map> getOrderedPodsByCapacity(long zoneId) { double cpuToMemoryWeight = ConfigurationManager.HostCapacityTypeCpuMemoryWeight.value(); short capacityType = getHostCapacityTypeToOrderCluster( - configDao.getValue(Config.HostCapacityTypeToOrderClusters.key()), cpuToMemoryWeight); + HostCapacityTypeToOrderClusters.value(), cpuToMemoryWeight); logger.debug("CapacityType: {} is used for Pod ordering", getCapacityTypeName(capacityType)); if (capacityType >= 0) { // for capacityType other than COMBINED @@ -557,7 +556,7 @@ public Map getPodByCombinedCapacities(List capacities, private Pair, Map> getOrderedClustersByCapacity(long id, long vmId, boolean isZone) { double cpuToMemoryWeight = ConfigurationManager.HostCapacityTypeCpuMemoryWeight.value(); short capacityType = getHostCapacityTypeToOrderCluster( - configDao.getValue(Config.HostCapacityTypeToOrderClusters.key()), cpuToMemoryWeight); + HostCapacityTypeToOrderClusters.value(), cpuToMemoryWeight); logger.debug("CapacityType: {} is used for Cluster ordering", getCapacityTypeName(capacityType)); if (capacityType >= 0) { // for capacityType other than COMBINED @@ -668,9 +667,9 @@ public boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeL public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); allocationAlgorithm = VmAllocationAlgorithm.value(); - globalDeploymentPlanner = configDao.getValue(Config.VmDeploymentPlanner.key()); + globalDeploymentPlanner = DeploymentPlanningManager.VmDeploymentPlanner.value(); String configValue; - if ((configValue = configDao.getValue(Config.ImplicitHostTags.key())) != null) { + if ((configValue = ImplicitHostTags.value()) != null) { implicitHostTags = configValue.trim().split("\\s*,\\s*"); } return true; diff --git a/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManager.java b/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManager.java index b8a62df173b6..ad41c14bb94b 100644 --- a/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManager.java +++ b/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManager.java @@ -45,7 +45,6 @@ public interface ExternalFirewallDeviceManager extends Manager { * @param username username * @param password password * @param deviceName device name - * @param server resource that will handle the commands specific to this device * @return Host object for the device added */ public ExternalFirewallDeviceVO addExternalFirewall(long physicalNetworkId, String url, String username, String password, String deviceName, ServerResource resource); @@ -68,7 +67,6 @@ public interface ExternalFirewallDeviceManager extends Manager { /** * finds a suitable firewall device which can be used by this network * @param network guest network - * @param dedicatedLb true if a dedicated load balancer is needed for this guest network * @return ExternalLoadBalancerDeviceVO corresponding to the suitable device * @throws InsufficientCapacityException */ diff --git a/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManagerImpl.java index aa619942656e..7bad42fe6d01 100644 --- a/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/ExternalFirewallDeviceManagerImpl.java @@ -48,7 +48,6 @@ import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.PortForwardingRuleTO; import com.cloud.agent.api.to.StaticNatRuleTO; -import com.cloud.configuration.Config; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.Vlan; @@ -181,7 +180,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); - _defaultFwCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalFirewallCapacity.key()), 50); + _defaultFwCapacity = DefaultExternalFirewallCapacity.value(); return true; } diff --git a/server/src/main/java/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/main/java/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 280e77dc25c0..a67608b3e54b 100644 --- a/server/src/main/java/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -27,7 +27,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -49,7 +48,6 @@ import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.configuration.Config; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterIpAddressVO; import com.cloud.dc.DataCenterVO; @@ -1143,7 +1141,7 @@ public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network g @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); - _defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); + _defaultLbCapacity = DefaultExternalLoadBalancerCapacity.value(); _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } diff --git a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java index dc6fc12a6110..34705693f2b5 100644 --- a/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java @@ -46,7 +46,6 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.network.RoutedIpv4Manager; -import com.cloud.configuration.Config; import com.cloud.domain.dao.DomainDao; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; @@ -87,6 +86,7 @@ import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.vpc.VpcManager; import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.server.ManagementServer; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; @@ -175,7 +175,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService, @Override public boolean configure(String name, Map params) throws ConfigurationException { _name = name; - String elbEnabledString = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + String elbEnabledString = ManagementServer.ElasticLoadBalancerEnabled.value(); _elbEnabled = Boolean.parseBoolean(elbEnabledString); if (_ipAddrMgr.RulesContinueOnError.value() != null) { rulesContinueOnErrFlag = _ipAddrMgr.RulesContinueOnError.value(); diff --git a/server/src/main/java/com/cloud/network/lb/LBHealthCheckManagerImpl.java b/server/src/main/java/com/cloud/network/lb/LBHealthCheckManagerImpl.java index 3568c53f4960..da03fd5e18d4 100644 --- a/server/src/main/java/com/cloud/network/lb/LBHealthCheckManagerImpl.java +++ b/server/src/main/java/com/cloud/network/lb/LBHealthCheckManagerImpl.java @@ -33,7 +33,6 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.managed.context.ManagedContextRunnable; -import com.cloud.configuration.Config; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.utils.NumbersUtil; @@ -62,7 +61,7 @@ public boolean configure(String name, Map params) throws Configu logger.info(format("Configuring LBHealthCheck Manager %1$s", name)); } this.name = name; - _interval = NumbersUtil.parseLong(_configs.get(Config.LBHealthCheck.key()), 600); + _interval = NumbersUtil.parseLong(_configs.get(LBHealthCheck.key()), 600); _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("LBHealthCheck")); return true; } diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 12d21e2e3bbf..01d0ae4e6eeb 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -894,6 +894,18 @@ public class ManagementServerImpl extends MutualExclusiveIdsManagerBase implemen static final ConfigKey humanReadableSizes = new ConfigKey<>("Advanced", Boolean.class, "display.human.readable.sizes", "true", "Enables outputting human readable byte sizes to logs and usage records.", false, ConfigKey.Scope.Global); public static final ConfigKey exposeCloudStackVersionInApiListCapabilities = new ConfigKey<>("Advanced", Boolean.class, "expose.cloudstack.version.api.list.capabilities", "true", "Indicates whether ACS version should show in the listCapabilities API.", true, ConfigKey.Scope.Global); + // Registered/owned by the kubernetes-service and sharedfs-storagevm plugins; declared here too so this module + // can read them without a reverse dependency on those plugin modules. + static final ConfigKey KubernetesServiceEnabled = new ConfigKey<>("Advanced", Boolean.class, "cloud.kubernetes.service.enabled", "true", + "Indicates whether Kubernetes Service plugin is enabled or not. Management server restart needed on change", false); + static final ConfigKey KubernetesClusterExperimentalFeaturesEnabled = new ConfigKey<>("Advanced", Boolean.class, + "cloud.kubernetes.cluster.experimental.features.enabled", "false", + "Indicates whether experimental feature for Kubernetes cluster such as Docker private registry are enabled or not", true); + static final ConfigKey SharedFSVmMinCpuCount = new ConfigKey<>("Advanced", Integer.class, "sharedfsvm.min.cpu.count", "2", + "minimum cpu count allowed for the compute offering to be used to create the sharedfs vm.", true); + static final ConfigKey SharedFSVmMinRamSize = new ConfigKey<>("Advanced", Integer.class, "sharedfsvm.min.ram.size", "1024", + "minimum ram size allowed for the compute offering to be used to create the sharedfs vm.", true); + private static final VirtualMachine.Type []systemVmTypes = { VirtualMachine.Type.SecondaryStorageVm, VirtualMachine.Type.ConsoleProxy}; private static final List LIVE_MIGRATION_SUPPORTING_HYPERVISORS = List.of(HypervisorType.Hyperv, HypervisorType.KVM, HypervisorType.LXC, HypervisorType.Ovm, HypervisorType.Ovm3, HypervisorType.Simulator, HypervisorType.VMware, HypervisorType.XenServer); @@ -4869,10 +4881,10 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final List networks = networkDao.listSecurityGroupEnabledNetworks(); if (networks != null && !networks.isEmpty()) { securityGroupsEnabled = true; - final String elbEnabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + final String elbEnabled = ElasticLoadBalancerEnabled.value(); elasticLoadBalancerEnabled = elbEnabled == null ? false : Boolean.parseBoolean(elbEnabled); if (elasticLoadBalancerEnabled) { - final String networkType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); + final String networkType = ElasticLoadBalancerNetwork.value(); if (networkType != null) { supportELB = networkType; } @@ -4887,9 +4899,9 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final boolean userPublicTemplateEnabled = TemplateManager.AllowPublicUserTemplates.valueIn(caller.getId()); // add some parameters UI needs to handle API throttling - final boolean apiLimitEnabled = Boolean.parseBoolean(_configDao.getValue(Config.ApiLimitEnabled.key())); - final Integer apiLimitInterval = Integer.valueOf(_configDao.getValue(Config.ApiLimitInterval.key())); - final Integer apiLimitMax = Integer.valueOf(_configDao.getValue(Config.ApiLimitMax.key())); + final boolean apiLimitEnabled = ApiLimitEnabled.value(); + final Integer apiLimitInterval = ApiLimitInterval.value(); + final Integer apiLimitMax = ApiLimitMax.value(); final boolean allowUserViewDestroyedVM = (QueryService.AllowUserViewDestroyedVM.valueIn(caller.getId()) | isCallerAdmin); final boolean allowUserExpungeRecoverVM = (UserVmManager.AllowUserExpungeRecoverVm.valueIn(caller.getId()) | isCallerAdmin); @@ -4898,8 +4910,8 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { final boolean allowUserViewAllDomainAccounts = (QueryService.AllowUserViewAllDomainAccounts.valueIn(domainId)); - final boolean kubernetesServiceEnabled = Boolean.parseBoolean(_configDao.getValue("cloud.kubernetes.service.enabled")); - final boolean kubernetesClusterExperimentalFeaturesEnabled = Boolean.parseBoolean(_configDao.getValue("cloud.kubernetes.cluster.experimental.features.enabled")); + final boolean kubernetesServiceEnabled = KubernetesServiceEnabled.value(); + final boolean kubernetesClusterExperimentalFeaturesEnabled = KubernetesClusterExperimentalFeaturesEnabled.value(); // check if region-wide secondary storage is used boolean regionSecondaryEnabled = false; @@ -4908,8 +4920,8 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { regionSecondaryEnabled = true; } - final Integer fsVmMinCpu = Integer.parseInt(_configDao.getValue("sharedfsvm.min.cpu.count")); - final Integer fsVmMinRam = Integer.parseInt(_configDao.getValue("sharedfsvm.min.ram.size")); + final Integer fsVmMinCpu = SharedFSVmMinCpuCount.value(); + final Integer fsVmMinRam = SharedFSVmMinRamSize.value(); if (exposeCloudStackVersionInApiListCapabilities.value()) { capabilities.put("cloudStackVersion", getVersion()); } diff --git a/server/src/test/java/com/cloud/vm/FirstFitPlannerTest.java b/server/src/test/java/com/cloud/vm/FirstFitPlannerTest.java index 5b877cc66169..8783808bc371 100644 --- a/server/src/test/java/com/cloud/vm/FirstFitPlannerTest.java +++ b/server/src/test/java/com/cloud/vm/FirstFitPlannerTest.java @@ -65,7 +65,6 @@ import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityManager; import com.cloud.capacity.dao.CapacityDao; -import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.ClusterDao; @@ -159,7 +158,7 @@ public void setUp() { when(configDepot.global()).thenReturn(configDao); when(configDao.getValue(Mockito.anyString())).thenReturn(null); - when(configDao.getValue(Config.ImplicitHostTags.key())).thenReturn("GPU"); + when(configDao.getValue(DeploymentClusterPlanner.ImplicitHostTags.key())).thenReturn("GPU"); ComponentContext.initComponentsLifeCycle(); acct.setType(Account.Type.ADMIN);