Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6DB3418FF7 for ; Tue, 19 May 2015 16:21:05 +0000 (UTC) Received: (qmail 57432 invoked by uid 500); 19 May 2015 16:20:48 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 57381 invoked by uid 500); 19 May 2015 16:20:48 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 56880 invoked by uid 99); 19 May 2015 16:20:48 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 May 2015 16:20:48 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7B7CAE30F3; Tue, 19 May 2015 16:20:48 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: koushik@apache.org To: commits@cloudstack.apache.org Date: Tue, 19 May 2015 16:21:34 -0000 Message-Id: In-Reply-To: <2e3041e27e184d788a455323974dbd40@git.apache.org> References: <2e3041e27e184d788a455323974dbd40@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [48/50] [abbrv] git commit: updated refs/heads/CLOUDSTACK-8301 to 8ff9000 CLOUDSTACK-8301: Enable configuring local storage use for system VMs at zone level Made system.vm.use.local.storage a zone level configuration. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3f7e31ed Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3f7e31ed Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3f7e31ed Branch: refs/heads/CLOUDSTACK-8301 Commit: 3f7e31ed05edf7f235b13d168ff1a5db16b5e2f9 Parents: dacdf97 Author: Koushik Das Authored: Wed May 13 17:35:29 2015 +0530 Committer: Koushik Das Committed: Tue May 19 21:32:14 2015 +0530 ---------------------------------------------------------------------- api/src/com/cloud/dc/DataCenter.java | 4 -- .../cloud/service/dao/ServiceOfferingDao.java | 6 +++ .../service/dao/ServiceOfferingDaoImpl.java | 38 ++++++++++++++++ .../lb/ElasticLoadBalancerManagerImpl.java | 19 ++++---- .../network/lb/LoadBalanceRuleHandler.java | 26 ++++++++--- .../lb/InternalLoadBalancerVMManagerImpl.java | 36 +++++++++++---- .../InternalLBVMManagerTest.java | 8 +++- .../InternalLBVMServiceTest.java | 10 +++- server/src/com/cloud/configuration/Config.java | 1 - .../configuration/ConfigurationManagerImpl.java | 48 ++++++-------------- .../consoleproxy/ConsoleProxyManagerImpl.java | 48 ++++++++++++-------- .../deploy/DeploymentPlanningManagerImpl.java | 36 ++++----------- .../VirtualNetworkApplianceManagerImpl.java | 15 +++--- .../com/cloud/storage/StorageManagerImpl.java | 13 +++++- .../deployment/RouterDeploymentDefinition.java | 24 ++++++++-- .../RouterDeploymentDefinitionBuilder.java | 4 ++ .../VpcRouterDeploymentDefinition.java | 6 +-- .../element/VirtualRouterElementTest.java | 6 ++- .../RouterDeploymentDefinitionTest.java | 13 ++++-- .../RouterDeploymentDefinitionTestBase.java | 7 +++ .../VpcRouterDeploymentDefinitionTest.java | 14 +++--- .../SecondaryStorageManagerImpl.java | 48 +++++++++++++------- 22 files changed, 273 insertions(+), 157 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/api/src/com/cloud/dc/DataCenter.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 6cd054e..5b3d3c0 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -20,7 +20,6 @@ import com.cloud.org.Grouping; import org.apache.cloudstack.acl.InfrastructureEntity; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -import org.apache.cloudstack.framework.config.ConfigKey; import java.util.Map; @@ -28,9 +27,6 @@ import java.util.Map; * */ public interface DataCenter extends InfrastructureEntity, Grouping, Identity, InternalIdentity { - public static final String SystemVMUseLocalStorageCK = "system.vm.use.local.storage"; - public static final ConfigKey UseSystemVMLocalStorage = new ConfigKey(Boolean.class, SystemVMUseLocalStorageCK, "Advanced", "false", - "Indicates whether to use local storage pools or shared storage pools for system VMs.", true, ConfigKey.Scope.Zone, null); public enum NetworkType { Basic, Advanced, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/engine/schema/src/com/cloud/service/dao/ServiceOfferingDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDao.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDao.java index ab81853..98dc317 100644 --- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDao.java +++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDao.java @@ -20,7 +20,9 @@ import java.util.List; import java.util.Map; import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.Storage.ProvisioningType; import com.cloud.utils.db.GenericDao; +import com.cloud.vm.VirtualMachine; /* * Data Access Object for service_offering table @@ -28,6 +30,10 @@ import com.cloud.utils.db.GenericDao; public interface ServiceOfferingDao extends GenericDao { ServiceOfferingVO findByName(String name); + List createSystemServiceOfferings(String name, String uniqueName, int cpuCount, int ramSize, int cpuSpeed, + Integer rateMbps, Integer multicastRateMbps, boolean offerHA, String displayText, ProvisioningType provisioningType, + boolean recreatable, String tags, boolean systemUse, VirtualMachine.Type vmType, boolean defaultUse); + ServiceOfferingVO persistSystemServiceOffering(ServiceOfferingVO vo); List findPublicServiceOfferings(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java index a3ff45c..a3ffbc1 100644 --- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java +++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java @@ -31,11 +31,13 @@ import org.springframework.stereotype.Component; import com.cloud.event.UsageEventVO; import com.cloud.service.ServiceOfferingDetailsVO; import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.Storage.ProvisioningType; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.UserVmDetailsDao; @Component @@ -110,6 +112,13 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase createSystemServiceOfferings(String name, String uniqueName, int cpuCount, int ramSize, int cpuSpeed, + Integer rateMbps, Integer multicastRateMbps, boolean offerHA, String displayText, ProvisioningType provisioningType, + boolean recreatable, String tags, boolean systemUse, VirtualMachine.Type vmType, boolean defaultUse) { + List list = new ArrayList(); + ServiceOfferingVO offering = new ServiceOfferingVO(name, cpuCount, ramSize, cpuSpeed, rateMbps, multicastRateMbps, offerHA, displayText, + provisioningType, false, recreatable, tags, systemUse, vmType, defaultUse); + offering.setUniqueName(uniqueName); + offering = persistSystemServiceOffering(offering); + if (offering != null) { + list.add(offering); + } + + boolean useLocal = true; + if (offering.getUseLocalStorage()) { // if 1st one is already local then 2nd needs to be shared + useLocal = false; + } + + offering = new ServiceOfferingVO(name + (useLocal ? " - Local Storage" : ""), cpuCount, ramSize, cpuSpeed, rateMbps, multicastRateMbps, offerHA, displayText, + provisioningType, useLocal, recreatable, tags, systemUse, vmType, defaultUse); + offering.setUniqueName(uniqueName + (useLocal ? "-Local" : "")); + offering = persistSystemServiceOffering(offering); + if (offering != null) { + list.add(offering); + } + + return list; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index d853299..9aba5ae 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -148,7 +148,6 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast TrafficType _frontendTrafficType = TrafficType.Guest; Account _systemAcct; - ServiceOfferingVO _elasticLbVmOffering; ScheduledExecutorService _gcThreadPool; String _mgmtCidr; @@ -290,16 +289,18 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast } _mgmtCidr = _configDao.getValue(Config.ManagementNetwork.key()); - boolean useLocalStorage = Boolean.parseBoolean(configs.get(DataCenter.SystemVMUseLocalStorageCK)); - _elasticLbVmRamSize = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmMemory.key()), DEFAULT_ELB_VM_RAMSIZE); _elasticLbvmCpuMHz = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmCpuMhz.key()), DEFAULT_ELB_VM_CPU_MHZ); _elasticLbvmNumCpu = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmNumVcpu.key()), 1); - _elasticLbVmOffering = new ServiceOfferingVO("System Offering For Elastic LB VM", _elasticLbvmNumCpu, - _elasticLbVmRamSize, _elasticLbvmCpuMHz, 0, 0, true, null, Storage.ProvisioningType.THIN, useLocalStorage, - true, null, true, VirtualMachine.Type.ElasticLoadBalancerVm, true); - _elasticLbVmOffering.setUniqueName(ServiceOffering.elbVmDefaultOffUniqueName); - _elasticLbVmOffering = _serviceOfferingDao.persistSystemServiceOffering(_elasticLbVmOffering); + List offerings = _serviceOfferingDao.createSystemServiceOfferings("System Offering For Elastic LB VM", + ServiceOffering.elbVmDefaultOffUniqueName, _elasticLbvmNumCpu, _elasticLbVmRamSize, _elasticLbvmCpuMHz, 0, 0, true, null, + Storage.ProvisioningType.THIN, true, null, true, VirtualMachine.Type.ElasticLoadBalancerVm, true); + // this can sometimes happen, if DB is manually or programmatically manipulated + if (offerings == null || offerings.size() < 2) { + String msg = "Data integrity problem : System Offering For Elastic LB VM has been removed?"; + s_logger.error(msg); + throw new ConfigurationException(msg); + } String enabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); _enabled = (enabled == null) ? false : Boolean.parseBoolean(enabled); @@ -322,7 +323,7 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast _itMgr.registerGuru(VirtualMachine.Type.ElasticLoadBalancerVm, this); } - loadBalanceRuleHandler = new LoadBalanceRuleHandler(_elasticLbVmOffering, _instance, _systemAcct); + loadBalanceRuleHandler = new LoadBalanceRuleHandler(_instance, _systemAcct); return true; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/LoadBalanceRuleHandler.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/LoadBalanceRuleHandler.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/LoadBalanceRuleHandler.java index 497913f..f2c4685 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/LoadBalanceRuleHandler.java +++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/LoadBalanceRuleHandler.java @@ -32,6 +32,7 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.log4j.Logger; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.dc.DataCenter; import com.cloud.dc.Pod; import com.cloud.dc.PodVlanMapVO; @@ -70,8 +71,10 @@ import com.cloud.network.router.VirtualRouter.RedundantState; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.LoadBalancer; import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; @@ -141,16 +144,16 @@ public class LoadBalanceRuleHandler { @Inject private VirtualRouterProviderDao _vrProviderDao; @Inject + private ServiceOfferingDao _serviceOfferingDao; + @Inject private UserDao _userDao; static final private String ELB_VM_NAME_PREFIX = "l"; - private final ServiceOfferingVO _elasticLbVmOffering; private final String _instance; private final Account _systemAcct; - public LoadBalanceRuleHandler(final ServiceOfferingVO elasticLbVmOffering, final String instance, final Account systemAcct) { - _elasticLbVmOffering = elasticLbVmOffering; + public LoadBalanceRuleHandler(String instance, Account systemAcct) { _instance = instance; _systemAcct = systemAcct; } @@ -279,12 +282,23 @@ public class LoadBalanceRuleHandler { userId = _userDao.listByAccount(owner.getAccountId()).get(0).getId(); } - elbVm = new DomainRouterVO(id, _elasticLbVmOffering.getId(), vrProvider.getId(), VirtualMachineName.getSystemVmName(id, _instance, ELB_VM_NAME_PREFIX), + String offeringName = ServiceOffering.elbVmDefaultOffUniqueName; + Boolean useLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dest.getDataCenter().getId()); + if (useLocalStorage != null && useLocalStorage.booleanValue()) { + offeringName += "-Local"; + } + ServiceOfferingVO elasticLbVmOffering = _serviceOfferingDao.findByName(offeringName); + if (elasticLbVmOffering == null) { + String message = "System service offering " + offeringName + " not found"; + s_logger.error(message); + throw new CloudRuntimeException(message); + } + elbVm = new DomainRouterVO(id, elasticLbVmOffering.getId(), vrProvider.getId(), VirtualMachineName.getSystemVmName(id, _instance, ELB_VM_NAME_PREFIX), template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(), userId, false, RedundantState.UNKNOWN, - _elasticLbVmOffering.getOfferHA(), false, null); + elasticLbVmOffering.getOfferHA(), false, null); elbVm.setRole(Role.LB); elbVm = _routerDao.persist(elbVm); - _itMgr.allocate(elbVm.getInstanceName(), template, _elasticLbVmOffering, networks, plan, null); + _itMgr.allocate(elbVm.getInstanceName(), template, elasticLbVmOffering, networks, plan, null); elbVm = _routerDao.findById(elbVm.getId()); //TODO: create usage stats } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java index affbd5c..818ad88 100644 --- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java +++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java @@ -46,6 +46,7 @@ import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.manager.Commands; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; @@ -380,15 +381,15 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In //if offering wasn't set, try to get the default one if (_internalLbVmOfferingId == 0L) { - final boolean useLocalStorage = Boolean.parseBoolean(configs.get(DataCenter.SystemVMUseLocalStorageCK)); - ServiceOfferingVO newOff = - new ServiceOfferingVO("System Offering For Internal LB VM", 1, InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_RAMSIZE, - InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_CPU_MHZ, null, null, true, null, - Storage.ProvisioningType.THIN, useLocalStorage, true, null, true, - VirtualMachine.Type.InternalLoadBalancerVm, true); - newOff.setUniqueName(ServiceOffering.internalLbVmDefaultOffUniqueName); - newOff = _serviceOfferingDao.persistSystemServiceOffering(newOff); - _internalLbVmOfferingId = newOff.getId(); + List offerings = _serviceOfferingDao.createSystemServiceOfferings("System Offering For Internal LB VM", + ServiceOffering.internalLbVmDefaultOffUniqueName, 1, InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_RAMSIZE, + InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_CPU_MHZ, null, null, true, null, + Storage.ProvisioningType.THIN, true, null, true, VirtualMachine.Type.InternalLoadBalancerVm, true); + if (offerings == null || offerings.size() < 2) { + String msg = "Data integrity problem : System Offering For Internal LB VM has been removed?"; + s_logger.error(msg); + throw new ConfigurationException(msg); + } } _itMgr.registerGuru(VirtualMachine.Type.InternalLoadBalancerVm, this); @@ -620,9 +621,24 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In } final LinkedHashMap> networks = createInternalLbVmNetworks(guestNetwork, plan, requestedGuestIp); + long internalLbVmOfferingId = _internalLbVmOfferingId; + if (internalLbVmOfferingId == 0L) { + String offeringName = ServiceOffering.internalLbVmDefaultOffUniqueName; + Boolean useLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dest.getDataCenter().getId()); + if (useLocalStorage != null && useLocalStorage.booleanValue()) { + offeringName += "-Local"; + } + ServiceOfferingVO serviceOffering = _serviceOfferingDao.findByName(offeringName); + if (serviceOffering == null) { + String message = "System service offering " + offeringName + " not found"; + s_logger.error(message); + throw new CloudRuntimeException(message); + } + internalLbVmOfferingId = serviceOffering.getId(); + } //Pass startVm=false as we are holding the network lock that needs to be released at the end of vm allocation final DomainRouterVO internalLbVm = - deployInternalLbVm(owner, dest, plan, params, internalLbProviderId, _internalLbVmOfferingId, guestNetwork.getVpcId(), networks, false); + deployInternalLbVm(owner, dest, plan, params, internalLbProviderId, internalLbVmOfferingId, guestNetwork.getVpcId(), networks, false); if (internalLbVm != null) { _internalLbVmDao.addRouterToGuestNetwork(internalLbVm, guestNetwork); internalLbVms.add(internalLbVm); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java index 0b47b1f..bc48d46 100644 --- a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java +++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java @@ -59,6 +59,7 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage; +import com.cloud.storage.Storage.ProvisioningType; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.utils.component.ComponentContext; @@ -120,7 +121,12 @@ public class InternalLBVMManagerTest extends TestCase { ServiceOfferingVO off = new ServiceOfferingVO("alena", 1, 1, 1, 1, 1, false, "alena", Storage.ProvisioningType.THIN, false, false, null, false, VirtualMachine.Type.InternalLoadBalancerVm, false); off = setId(off, 1); - Mockito.when(_svcOffDao.persistSystemServiceOffering(Matchers.any(ServiceOfferingVO.class))).thenReturn(off); + List list = new ArrayList(); + list.add(off); + list.add(off); + Mockito.when(_svcOffDao.createSystemServiceOfferings(Matchers.anyString(), Matchers.anyString(), Matchers.anyInt(), Matchers.anyInt(), Matchers.anyInt(), + Matchers.anyInt(), Matchers.anyInt(), Matchers.anyBoolean(), Matchers.anyString(), Matchers.any(ProvisioningType.class), Matchers.anyBoolean(), + Matchers.anyString(), Matchers.anyBoolean(), Matchers.any(VirtualMachine.Type.class), Matchers.anyBoolean())).thenReturn(list); ComponentContext.initComponentsLifeCycle(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java index e376e51..84c5f1b 100644 --- a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java +++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java @@ -17,6 +17,8 @@ package org.apache.cloudstack.internallbvmmgr; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; import javax.inject.Inject; @@ -44,6 +46,7 @@ import com.cloud.network.router.VirtualRouter.Role; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage; +import com.cloud.storage.Storage.ProvisioningType; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.user.UserVO; @@ -90,7 +93,12 @@ public class InternalLBVMServiceTest extends TestCase { ServiceOfferingVO off = new ServiceOfferingVO("alena", 1, 1, 1, 1, 1, false, "alena", Storage.ProvisioningType.THIN, false, false, null, false, VirtualMachine.Type.InternalLoadBalancerVm, false); off = setId(off, 1); - Mockito.when(_svcOffDao.persistSystemServiceOffering(Matchers.any(ServiceOfferingVO.class))).thenReturn(off); + List list = new ArrayList(); + list.add(off); + list.add(off); + Mockito.when(_svcOffDao.createSystemServiceOfferings(Matchers.anyString(), Matchers.anyString(), Matchers.anyInt(), Matchers.anyInt(), Matchers.anyInt(), + Matchers.anyInt(), Matchers.anyInt(), Matchers.anyBoolean(), Matchers.anyString(), Matchers.any(ProvisioningType.class), Matchers.anyBoolean(), + Matchers.anyString(), Matchers.anyBoolean(), Matchers.any(VirtualMachine.Type.class), Matchers.anyBoolean())).thenReturn(list); ComponentContext.initComponentsLifeCycle(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/configuration/Config.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 8dcddc8..2352313 100644 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -685,7 +685,6 @@ public enum Config { "/var/cloudstack/mnt", "The mount point on the Management Server for Secondary Storage.", null), -// UpgradeURL("Advanced", ManagementServer.class, String.class, "upgrade.url", "http://example.com:8080/client/agent/update.zip", "The upgrade URL is the URL of the management server that agents will connect to in order to automatically upgrade.", null), SystemVMAutoReserveCapacity( "Advanced", ManagementServer.class, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/configuration/ConfigurationManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index a739695..d08cac6 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -38,7 +38,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupService; @@ -72,6 +71,7 @@ import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.ConfigDepot; 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.framework.config.impl.ConfigurationVO; import org.apache.cloudstack.region.PortableIp; @@ -215,7 +215,7 @@ import com.cloud.vm.dao.NicIpAliasVO; import com.cloud.vm.dao.NicSecondaryIpDao; @Local(value = {ConfigurationManager.class, ConfigurationService.class}) -public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService { +public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, Configurable { public static final Logger s_logger = Logger.getLogger(ConfigurationManagerImpl.class); @Inject @@ -335,6 +335,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati private Set weightBasedParametersForValidation; private Set overprovisioningFactorsForValidation; + public static final ConfigKey SystemVMUseLocalStorage = new ConfigKey(Boolean.class, "system.vm.use.local.storage", "Advanced", "false", + "Indicates whether to use local storage pools or shared storage pools for system VMs.", false, ConfigKey.Scope.Zone, null); + @Override public boolean configure(final String name, final Map params) throws ConfigurationException { String maxVolumeSizeInGbString = _configDao.getValue(Config.MaxVolumeSize.key()); @@ -575,35 +578,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } catch (Throwable e) { throw new CloudRuntimeException("Failed to update storage.network.device2 in host_details due to exception ", e); } - } else if (DataCenter.SystemVMUseLocalStorageCK.equalsIgnoreCase(name)) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Config 'system.vm.use.local.storage' changed to value:" + value + ", need to update System VM offerings"); - } - boolean useLocalStorage = Boolean.parseBoolean(_configDao.getValue(DataCenter.SystemVMUseLocalStorageCK)); - ServiceOfferingVO serviceOffering = _serviceOfferingDao.findByName(ServiceOffering.consoleProxyDefaultOffUniqueName); - if (serviceOffering != null) { - serviceOffering.setUseLocalStorage(useLocalStorage); - if (!_serviceOfferingDao.update(serviceOffering.getId(), serviceOffering)) { - throw new CloudRuntimeException("Failed to update ConsoleProxy offering's use_local_storage option to value:" + useLocalStorage); - } - } - - serviceOffering = _serviceOfferingDao.findByName(ServiceOffering.routerDefaultOffUniqueName); - if (serviceOffering != null) { - serviceOffering.setUseLocalStorage(useLocalStorage); - if (!_serviceOfferingDao.update(serviceOffering.getId(), serviceOffering)) { - throw new CloudRuntimeException("Failed to update SoftwareRouter offering's use_local_storage option to value:" + useLocalStorage); - } - } - - serviceOffering = _serviceOfferingDao.findByName(ServiceOffering.ssvmDefaultOffUniqueName); - if (serviceOffering != null) { - serviceOffering.setUseLocalStorage(useLocalStorage); - if (!_serviceOfferingDao.update(serviceOffering.getId(), serviceOffering)) { - throw new CloudRuntimeException("Failed to update SecondaryStorage offering's use_local_storage option to value:" + useLocalStorage); - } - } - }else if (Config.SecStorageSecureCopyCert.key().equalsIgnoreCase(name)) { + } else if (Config.SecStorageSecureCopyCert.key().equalsIgnoreCase(name)) { //FIXME - Ideally there should be a listener model to listen to global config changes and be able to take action gracefully. //Expire the download urls String sqlTemplate = "update template_store_ref set download_url_created=?"; @@ -622,8 +597,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } catch (Throwable e) { throw new CloudRuntimeException("Failed to clean up download URLs in template_store_ref or volume_store_ref due to exception ", e); } - - } txn.commit(); @@ -5200,4 +5173,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati _secChecker = secChecker; } + @Override + public String getConfigComponentName() { + return ConfigurationManagerImpl.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] {SystemVMUseLocalStorage}; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index bfcef5f..f8d7474 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -60,6 +60,7 @@ import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer; import com.cloud.agent.manager.Commands; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.configuration.ZoneConfig; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; @@ -225,7 +226,6 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy private int _capacityPerProxy = ConsoleProxyManager.DEFAULT_PROXY_CAPACITY; private int _standbyCapacity = ConsoleProxyManager.DEFAULT_STANDBY_CAPACITY; - private boolean _useLvm; private boolean _useStorageVm; private boolean _disableRpFilter = false; private String _instance; @@ -716,13 +716,27 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy networks.put(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false).get(0), new ArrayList()); } + ServiceOfferingVO serviceOffering = _serviceOffering; + if (serviceOffering == null) { + String offeringName = ServiceOffering.consoleProxyDefaultOffUniqueName; + Boolean useLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId); + if (useLocalStorage != null && useLocalStorage.booleanValue()) { + offeringName += "-Local"; + } + serviceOffering = _offeringDao.findByName(offeringName); + if (serviceOffering == null) { + String message = "System service offering " + offeringName + " not found"; + s_logger.error(message); + throw new CloudRuntimeException(message); + } + } ConsoleProxyVO proxy = - new ConsoleProxyVO(id, _serviceOffering.getId(), name, template.getId(), template.getHypervisorType(), template.getGuestOSId(), dataCenterId, - systemAcct.getDomainId(), systemAcct.getId(), _accountMgr.getSystemUser().getId(), 0, _serviceOffering.getOfferHA()); + new ConsoleProxyVO(id, serviceOffering.getId(), name, template.getId(), template.getHypervisorType(), template.getGuestOSId(), dataCenterId, + systemAcct.getDomainId(), systemAcct.getId(), _accountMgr.getSystemUser().getId(), 0, serviceOffering.getOfferHA()); proxy.setDynamicallyScalable(template.isDynamicallyScalable()); proxy = _consoleProxyDao.persist(proxy); try { - _itMgr.allocate(name, template, _serviceOffering, networks, plan, null); + _itMgr.allocate(name, template, serviceOffering, networks, plan, null); } catch (InsufficientCapacityException e) { s_logger.warn("InsufficientCapacity", e); throw new CloudRuntimeException("Insufficient capacity exception", e); @@ -951,7 +965,12 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy TemplateDataStoreVO templateHostRef = _vmTemplateStoreDao.findByTemplateZoneDownloadStatus(template.getId(), dataCenterId, Status.DOWNLOADED); if (templateHostRef != null) { - List> l = _consoleProxyDao.getDatacenterStoragePoolHostInfo(dataCenterId, _useLvm); + boolean useLocalStorage = false; + Boolean useLocal = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId); + if (useLocal != null) { + useLocalStorage = useLocal.booleanValue(); + } + List> l = _consoleProxyDao.getDatacenterStoragePoolHostInfo(dataCenterId, useLocalStorage); if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) { return true; } else { @@ -1208,11 +1227,6 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy _disableRpFilter = true; } - value = configs.get(DataCenter.SystemVMUseLocalStorageCK); - if (value != null && value.equalsIgnoreCase("true")) { - _useLvm = true; - } - value = configs.get("secondary.storage.vm"); if (value != null && value.equalsIgnoreCase("true")) { _useStorageVm = true; @@ -1238,8 +1252,6 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy _itMgr.registerGuru(VirtualMachine.Type.ConsoleProxy, this); - boolean useLocalStorage = Boolean.parseBoolean(configs.get(DataCenter.SystemVMUseLocalStorageCK)); - //check if there is a default service offering configured String cpvmSrvcOffIdStr = configs.get(Config.ConsoleProxyServiceOffering.key()); if (cpvmSrvcOffIdStr != null) { @@ -1259,15 +1271,11 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy if (_serviceOffering == null || !_serviceOffering.getSystemUse()) { int ramSize = NumbersUtil.parseInt(_configDao.getValue("console.ram.size"), DEFAULT_PROXY_VM_RAMSIZE); int cpuFreq = NumbersUtil.parseInt(_configDao.getValue("console.cpu.mhz"), DEFAULT_PROXY_VM_CPUMHZ); - _serviceOffering = - new ServiceOfferingVO("System Offering For Console Proxy", 1, ramSize, cpuFreq, 0, 0, false, null, - Storage.ProvisioningType.THIN, useLocalStorage, true, null, true, - VirtualMachine.Type.ConsoleProxy, true); - _serviceOffering.setUniqueName(ServiceOffering.consoleProxyDefaultOffUniqueName); - _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); - + List offerings = _offeringDao.createSystemServiceOfferings("System Offering For Console Proxy", + ServiceOffering.consoleProxyDefaultOffUniqueName, 1, ramSize, cpuFreq, 0, 0, false, null, + Storage.ProvisioningType.THIN, true, null, true, VirtualMachine.Type.ConsoleProxy, true); // this can sometimes happen, if DB is manually or programmatically manipulated - if (_serviceOffering == null) { + if (offerings == null || offerings.size() < 2) { String msg = "Data integrity problem : System Offering For Console Proxy has been removed?"; s_logger.error(msg); throw new ConfigurationException(msg); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index 3a7173b..57abb92 100644 --- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -32,8 +32,8 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.utils.fsm.StateMachine2; -import org.apache.log4j.Logger; +import org.apache.log4j.Logger; import org.apache.cloudstack.affinity.AffinityGroupProcessor; import org.apache.cloudstack.affinity.AffinityGroupService; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; @@ -46,8 +46,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.MessageSubscriber; import org.apache.cloudstack.managed.context.ManagedContextTimerTask; @@ -67,6 +65,7 @@ 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.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; import com.cloud.dc.ClusterVO; @@ -134,7 +133,7 @@ import com.cloud.vm.dao.VMInstanceDao; @Local(value = {DeploymentPlanningManager.class}) public class DeploymentPlanningManagerImpl extends ManagerBase implements DeploymentPlanningManager, Manager, Listener, -StateListener, Configurable { +StateListener { private static final Logger s_logger = Logger.getLogger(DeploymentPlanningManagerImpl.class); @Inject @@ -762,16 +761,6 @@ StateListener, Configurable { return false; } - @Override - public String getConfigComponentName() { - return DeploymentPlanningManagerImpl.class.getSimpleName(); - } - - @Override - public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {DataCenter.UseSystemVMLocalStorage}; - } - class HostReservationReleaseChecker extends ManagedContextTimerTask { @Override protected void runInContext() { @@ -1301,20 +1290,11 @@ StateListener, Configurable { boolean useLocalStorage = false; if (vmProfile.getType() != VirtualMachine.Type.User) { DataCenterVO zone = _dcDao.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; - boolean ssvmUseLocalStorage = DataCenter.UseSystemVMLocalStorage.value(); - if (zone != null) { - ssvmUseLocalStorage = DataCenter.UseSystemVMLocalStorage.valueIn(plan.getDataCenterId()); - } - s_logger.debug("Checking if we need local storage for systemvms is needed for zone id=" + plan.getDataCenterId() + " with system.vm.use.local.storage=" + ssvmUseLocalStorage); - // 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 && zoneUsesLocalStorage) { - useLocalStorage = true; - s_logger.debug("SystemVMs will use local storage for zone id=" + plan.getDataCenterId()); + assert (zone != null) : "Invalid zone in deployment plan"; + Boolean useLocalStorageForSystemVM = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(zone.getId()); + if (useLocalStorageForSystemVM != null) { + useLocalStorage = useLocalStorageForSystemVM.booleanValue(); + s_logger.debug("System VMs will use " + (useLocalStorage ? "local" : "shared") + " storage for zone id=" + plan.getDataCenterId()); } } else { useLocalStorage = diskOffering.getUseLocalStorage(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index c7e0c29..2a518e4 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -631,12 +631,15 @@ Configurable, StateListener { _agentMgr.registerForHostEvents(new SshKeysDistriMonitor(_agentMgr, _hostDao, _configDao), true, false, false); - final boolean useLocalStorage = Boolean.parseBoolean(configs.get(DataCenter.SystemVMUseLocalStorageCK)); - ServiceOfferingVO offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null, null, true, null, ProvisioningType.THIN, - useLocalStorage, true, null, true, VirtualMachine.Type.DomainRouter, true); - offering.setUniqueName(ServiceOffering.routerDefaultOffUniqueName); - offering = _serviceOfferingDao.persistSystemServiceOffering(offering); - _routerDeploymentManagerBuilder.setOfferingId(offering.getId()); + List offerings = _serviceOfferingDao.createSystemServiceOfferings("System Offering For Software Router", + ServiceOffering.routerDefaultOffUniqueName, 1, _routerRamSize, _routerCpuMHz, null, + null, true, null, ProvisioningType.THIN, true, null, true, VirtualMachine.Type.DomainRouter, true); + // this can sometimes happen, if DB is manually or programmatically manipulated + if (offerings == null || offerings.size() < 2) { + final String msg = "Data integrity problem : System Offering For Software router VM has been removed?"; + s_logger.error(msg); + throw new ConfigurationException(msg); + } NetworkHelperImpl.setSystemAccount(_accountMgr.getSystemAccount()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/com/cloud/storage/StorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index e725ce3..2c70b17 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -42,6 +42,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.hypervisor.Hypervisor; + import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; @@ -111,6 +112,7 @@ import com.cloud.cluster.ClusterManagerListener; import com.cloud.cluster.ManagementServerHost; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; @@ -546,9 +548,16 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @DB @Override public DataStore createLocalStorage(Host host, StoragePoolInfo pInfo) throws ConnectionException { - DataCenterVO dc = _dcDao.findById(host.getDataCenterId()); - if (dc == null || !dc.isLocalStorageEnabled()) { + if (dc == null) { + return null; + } + boolean useLocalStorageForSystemVM = false; + Boolean isLocal = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dc.getId()); + if (isLocal != null) { + useLocalStorageForSystemVM = isLocal.booleanValue(); + } + if (!(dc.isLocalStorageEnabled() || useLocalStorageForSystemVM)) { return null; } DataStore store; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java ---------------------------------------------------------------------- diff --git a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java index 5ef2070..569200c 100644 --- a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java +++ b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java @@ -23,6 +23,7 @@ import java.util.Map; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.log4j.Logger; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.HostPodVO; import com.cloud.dc.Pod; @@ -52,7 +53,10 @@ import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.router.NetworkHelper; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.vpc.Vpc; +import com.cloud.offering.ServiceOffering; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.utils.db.DB; @@ -80,6 +84,7 @@ public class RouterDeploymentDefinition { protected NetworkModel networkModel; protected VirtualRouterProviderDao vrProviderDao; protected NetworkOfferingDao networkOfferingDao; + protected ServiceOfferingDao serviceOfferingDao; protected IpAddressManager ipAddrMgr; protected VMInstanceDao vmDao; protected HostPodDao podDao; @@ -354,10 +359,23 @@ public class RouterDeploymentDefinition { } } + protected void findDefaultServiceOfferingId() { + String offeringName = ServiceOffering.routerDefaultOffUniqueName; + Boolean useLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dest.getDataCenter().getId()); + if (useLocalStorage != null && useLocalStorage.booleanValue()) { + offeringName += "-Local"; + } + ServiceOfferingVO serviceOffering = serviceOfferingDao.findByName(offeringName); + if (serviceOffering == null) { + throw new CloudRuntimeException("System service offering " + offeringName + " not found"); + } + serviceOfferingId = serviceOffering.getId(); + } + protected void findServiceOfferingId() { - final Long networkOfferingId = networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId(); - if (networkOfferingId != null) { - serviceOfferingId = networkOfferingId; + serviceOfferingId = networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId(); + if (serviceOfferingId == null) { + findDefaultServiceOfferingId(); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java ---------------------------------------------------------------------- diff --git a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java index 33ed9d0..3ba4fad 100644 --- a/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java +++ b/server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java @@ -45,6 +45,7 @@ import com.cloud.network.vpc.VpcManager; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.vm.DomainRouterVO; @@ -68,6 +69,8 @@ public class RouterDeploymentDefinitionBuilder { @Inject private NetworkOfferingDao networkOfferingDao; @Inject + private ServiceOfferingDao serviceOfferingDao; + @Inject private IpAddressManager ipAddrMgr; @Inject private VMInstanceDao vmDao; @@ -120,6 +123,7 @@ public class RouterDeploymentDefinitionBuilder { routerDeploymentDefinition.networkModel = networkModel; routerDeploymentDefinition.vrProviderDao = vrProviderDao; routerDeploymentDefinition.networkOfferingDao = networkOfferingDao; + routerDeploymentDefinition.serviceOfferingDao = serviceOfferingDao; routerDeploymentDefinition.ipAddrMgr = ipAddrMgr; routerDeploymentDefinition.vmDao = vmDao; routerDeploymentDefinition.podDao = podDao; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java ---------------------------------------------------------------------- diff --git a/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java b/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java index 5124195..26f2379 100644 --- a/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java +++ b/server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java @@ -156,9 +156,9 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition { @Override protected void findServiceOfferingId() { - final Long vpcOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId(); - if (vpcOfferingId != null) { - serviceOfferingId = vpcOfferingId; + serviceOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId(); + if (serviceOfferingId == null) { + findDefaultServiceOfferingId(); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/test/com/cloud/network/element/VirtualRouterElementTest.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/network/element/VirtualRouterElementTest.java b/server/test/com/cloud/network/element/VirtualRouterElementTest.java index f139852..6592778 100644 --- a/server/test/com/cloud/network/element/VirtualRouterElementTest.java +++ b/server/test/com/cloud/network/element/VirtualRouterElementTest.java @@ -33,6 +33,7 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @@ -169,7 +170,7 @@ public class VirtualRouterElementTest { private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder; @InjectMocks - private VpcVirtualNetworkApplianceManagerImpl _routerMgr ; + private VpcVirtualNetworkApplianceManagerImpl _routerMgr; @InjectMocks private VirtualRouterElement virtualRouterElement; @@ -210,7 +211,7 @@ public class VirtualRouterElementTest { public void testPrepare() { virtualRouterElement._routerMgr = _routerMgr; virtualRouterElement.routerDeploymentDefinitionBuilder = routerDeploymentDefinitionBuilder; - mockDAOs(testNetwork,testOffering); + mockDAOs(testNetwork, testOffering); mockMgrs(); boolean done = false; @@ -276,6 +277,7 @@ public class VirtualRouterElementTest { VirtualMachine.Type.DomainRouter, /* defaultUse */ false); when(_serviceOfferingDao.findById(0L)).thenReturn(svcoff); + when(_serviceOfferingDao.findByName(Matchers.anyString())).thenReturn(svcoff); final DomainRouterVO router = new DomainRouterVO(/* id */ 1L, /* serviceOfferingId */ 1L, /* elementId */ 0L, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java ---------------------------------------------------------------------- diff --git a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java index abd80d7..b266f88 100644 --- a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java +++ b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTest.java @@ -38,6 +38,7 @@ import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @@ -635,7 +636,7 @@ public class RouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTe } @Test - public void testFindOfferingIdReceivingNewOne() { + public void testFindOfferingIdFromNetwork() { // Prepare deployment.serviceOfferingId = 1L; when(mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID); @@ -646,24 +647,26 @@ public class RouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTe deployment.findServiceOfferingId(); // Assert - assertEquals("Given that no Offering was found, the previous Offering Id should be kept", + assertEquals("Service offering id not matching the one associated with network offering", OFFERING_ID, deployment.serviceOfferingId.longValue()); } @Test - public void testFindOfferingIdReceivingKeepingPrevious() { + public void testFindOfferingIdDefault() { // Prepare deployment.serviceOfferingId = 1L; when(mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID); when(mockNetworkOfferingDao.findById(OFFERING_ID)).thenReturn(mockNwOfferingVO); when(mockNwOfferingVO.getServiceOfferingId()).thenReturn(null); + when(mockServiceOfferingDao.findByName(Matchers.anyString())).thenReturn(mockSvcOfferingVO); + when(mockSvcOfferingVO.getId()).thenReturn(DEFAULT_OFFERING_ID); // Execute deployment.findServiceOfferingId(); // Assert - assertEquals("Found Offering Id didn't replace previous one", - 1L, deployment.serviceOfferingId.longValue()); + assertEquals("Since there is no service offering associated with network offering, offering id should have matched default one", + DEFAULT_OFFERING_ID, deployment.serviceOfferingId.longValue()); } @Test http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTestBase.java ---------------------------------------------------------------------- diff --git a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTestBase.java b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTestBase.java index 0978ac9..4225083 100644 --- a/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTestBase.java +++ b/server/test/org/cloud/network/router/deployment/RouterDeploymentDefinitionTestBase.java @@ -43,6 +43,8 @@ import com.cloud.network.router.NetworkHelper; import com.cloud.network.router.VpcNetworkHelperImpl; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.vm.VirtualMachineProfile.Param; @@ -57,6 +59,7 @@ public class RouterDeploymentDefinitionTestBase { protected static final String ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED = "Only the provided as default destination was expected"; protected static final long OFFERING_ID = 16L; + protected static final long DEFAULT_OFFERING_ID = 17L; protected static final Long DATA_CENTER_ID = 100l; protected static final Long NW_ID_1 = 101l; protected static final Long NW_ID_2= 102l; @@ -92,6 +95,8 @@ public class RouterDeploymentDefinitionTestBase { @Mock protected NetworkOfferingDao mockNetworkOfferingDao; @Mock + protected ServiceOfferingDao mockServiceOfferingDao; + @Mock protected AccountManager mockAccountMgr; // Instance specific parameters to use during build @@ -112,6 +117,8 @@ public class RouterDeploymentDefinitionTestBase { @Mock NetworkOfferingVO mockNwOfferingVO; @Mock + ServiceOfferingVO mockSvcOfferingVO; + @Mock protected Account mockOwner; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java ---------------------------------------------------------------------- diff --git a/server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java b/server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java index 4ef3593..5a34ebf 100644 --- a/server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java +++ b/server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java @@ -31,6 +31,7 @@ import java.util.List; import org.junit.Before; import org.junit.Test; +import org.mockito.Matchers; import org.mockito.Mock; import com.cloud.deploy.DeployDestination; @@ -178,23 +179,24 @@ public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitio } @Test - public void testFindOfferingIdLeavingPrevious() { + public void testFindOfferingIdDefault() { // Prepare - final Long initialOfferingId = deployment.serviceOfferingId; final VpcOfferingVO vpcOffering = mock(VpcOfferingVO.class); when(mockVpcOffDao.findById(VPC_OFFERING_ID)).thenReturn(vpcOffering); when(vpcOffering.getServiceOfferingId()).thenReturn(null); + when(mockServiceOfferingDao.findByName(Matchers.anyString())).thenReturn(mockSvcOfferingVO); + when(mockSvcOfferingVO.getId()).thenReturn(DEFAULT_OFFERING_ID); // Execute deployment.findServiceOfferingId(); // Assert - assertEquals("Offering Id shouldn't have been updated", - initialOfferingId, deployment.serviceOfferingId); + assertEquals("Since there is no service offering associated with VPC offering, offering id should have matched default one", + DEFAULT_OFFERING_ID, deployment.serviceOfferingId.longValue()); } @Test - public void testFindOfferingIdSettingNewOne() { + public void testFindOfferingIdFromVPC() { // Prepare final VpcOfferingVO vpcOffering = mock(VpcOfferingVO.class); when(mockVpcOffDao.findById(VPC_OFFERING_ID)).thenReturn(vpcOffering); @@ -204,7 +206,7 @@ public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitio deployment.findServiceOfferingId(); // Assert - assertEquals("Offering Id should have been updated", + assertEquals("Service offering id not matching the one associated with VPC offering", VPC_OFFERING_ID, deployment.serviceOfferingId.longValue()); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3f7e31ed/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java ---------------------------------------------------------------------- diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index 4dc6dbb..445852d 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -32,7 +32,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.config.ApiServiceConfiguration; - import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; @@ -64,6 +63,7 @@ import com.cloud.agent.manager.Commands; import com.cloud.capacity.dao.CapacityDao; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManagerImpl; import com.cloud.configuration.ZoneConfig; import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.dc.DataCenter; @@ -242,7 +242,6 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar private int _secStorageVmMtuSize; private String _instance; - private boolean _useLocalStorage; private boolean _useSSlCopy; private String _httpProxy; private String _allowedInternalSites; @@ -577,13 +576,27 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar throw new CloudRuntimeException("Not able to find the System templates or not downloaded in zone " + dataCenterId); } + ServiceOfferingVO serviceOffering = _serviceOffering; + if (serviceOffering == null) { + String offeringName = ServiceOffering.ssvmDefaultOffUniqueName; + Boolean useLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId); + if (useLocalStorage != null && useLocalStorage.booleanValue()) { + offeringName += "-Local"; + } + serviceOffering = _offeringDao.findByName(offeringName); + if (serviceOffering == null) { + String message = "System service offering " + offeringName + " not found"; + s_logger.error(message); + throw new CloudRuntimeException(message); + } + } SecondaryStorageVmVO secStorageVm = - new SecondaryStorageVmVO(id, _serviceOffering.getId(), name, template.getId(), template.getHypervisorType(), template.getGuestOSId(), dataCenterId, - systemAcct.getDomainId(), systemAcct.getId(), _accountMgr.getSystemUser().getId(), role, _serviceOffering.getOfferHA()); + new SecondaryStorageVmVO(id, serviceOffering.getId(), name, template.getId(), template.getHypervisorType(), template.getGuestOSId(), dataCenterId, + systemAcct.getDomainId(), systemAcct.getId(), _accountMgr.getSystemUser().getId(), role, serviceOffering.getOfferHA()); secStorageVm.setDynamicallyScalable(template.isDynamicallyScalable()); secStorageVm = _secStorageVmDao.persist(secStorageVm); try { - _itMgr.allocate(name, template, _serviceOffering, networks, plan, null); + _itMgr.allocate(name, template, serviceOffering, networks, plan, null); secStorageVm = _secStorageVmDao.findById(secStorageVm.getId()); } catch (InsufficientCapacityException e) { s_logger.warn("InsufficientCapacity", e); @@ -763,14 +776,19 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar return false; } - List> l = _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !_useLocalStorage); + boolean useLocalStorage = false; + Boolean useLocal = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId); + if (useLocal != null) { + useLocalStorage = useLocal.booleanValue(); + } + List> l = _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !useLocalStorage); if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) { return true; } else { if (s_logger.isDebugEnabled()) { s_logger.debug("Primary storage is not ready, wait until it is ready to launch secondary storage vm. dcId: " + dataCenterId + - " system.vm.use.local.storage: " + _useLocalStorage + - "If you want to use local storage to start ssvm, need to set system.vm.use.local.storage to true"); + ", " + ConfigurationManagerImpl.SystemVMUseLocalStorage.key() + ": " + useLocalStorage + ". " + + "If you want to use local storage to start SSVM, need to set " + ConfigurationManagerImpl.SystemVMUseLocalStorage.key() + " to true"); } } @@ -872,18 +890,14 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar } } - if(_serviceOffering == null || !_serviceOffering.getSystemUse()){ + if (_serviceOffering == null || !_serviceOffering.getSystemUse()) { int ramSize = NumbersUtil.parseInt(_configDao.getValue("ssvm.ram.size"), DEFAULT_SS_VM_RAMSIZE); int cpuFreq = NumbersUtil.parseInt(_configDao.getValue("ssvm.cpu.mhz"), DEFAULT_SS_VM_CPUMHZ); - _useLocalStorage = Boolean.parseBoolean(configs.get(DataCenter.SystemVMUseLocalStorageCK)); - _serviceOffering = - new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, ramSize, cpuFreq, null, null, false, null, - Storage.ProvisioningType.THIN, _useLocalStorage, true, null, true, VirtualMachine.Type.SecondaryStorageVm, true); - _serviceOffering.setUniqueName(ServiceOffering.ssvmDefaultOffUniqueName); - _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); - + List offerings = _offeringDao.createSystemServiceOfferings("System Offering For Secondary Storage VM", + ServiceOffering.ssvmDefaultOffUniqueName, 1, ramSize, cpuFreq, null, null, false, null, + Storage.ProvisioningType.THIN, true, null, true, VirtualMachine.Type.SecondaryStorageVm, true); // this can sometimes happen, if DB is manually or programmatically manipulated - if (_serviceOffering == null) { + if (offerings == null || offerings.size() < 2) { String msg = "Data integrity problem : System Offering For Secondary Storage VM has been removed?"; s_logger.error(msg); throw new ConfigurationException(msg);