You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ko...@apache.org on 2015/05/19 18:21:34 UTC
[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 <ko...@apache.org>
Authored: Wed May 13 17:35:29 2015 +0530
Committer: Koushik Das <ko...@apache.org>
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<Boolean> UseSystemVMLocalStorage = new ConfigKey<Boolean>(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, Long> {
ServiceOfferingVO findByName(String name);
+ List<ServiceOfferingVO> 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<ServiceOfferingVO> 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<ServiceOfferingVO, Lo
vo.setSpeed(500);
update(vo.getId(), vo);
}
+ if (!vo.getUniqueName().endsWith("-Local")) {
+ if (vo.getUseLocalStorage()) {
+ vo.setUniqueName(vo.getUniqueName() + "-Local");
+ vo.setName(vo.getName() + " - Local Storage");
+ update(vo.getId(), vo);
+ }
+ }
return vo;
}
try {
@@ -238,4 +247,33 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase<ServiceOfferingVO, Lo
return dummyoffering;
}
+
+ @Override
+ public List<ServiceOfferingVO> 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<ServiceOfferingVO> list = new ArrayList<ServiceOfferingVO>();
+ 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<ServiceOfferingVO> 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<ServiceOfferingVO> 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<Network, List<? extends NicProfile>> 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<ServiceOfferingVO> list = new ArrayList<ServiceOfferingVO>();
+ 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<ServiceOfferingVO> list = new ArrayList<ServiceOfferingVO>();
+ 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<String> weightBasedParametersForValidation;
private Set<String> overprovisioningFactorsForValidation;
+ public static final ConfigKey<Boolean> SystemVMUseLocalStorage = new ConfigKey<Boolean>(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<String, Object> 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<NicProfile>());
}
+ 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<Pair<Long, Integer>> l = _consoleProxyDao.getDatacenterStoragePoolHostInfo(dataCenterId, _useLvm);
+ boolean useLocalStorage = false;
+ Boolean useLocal = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId);
+ if (useLocal != null) {
+ useLocalStorage = useLocal.booleanValue();
+ }
+ List<Pair<Long, Integer>> 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<ServiceOfferingVO> 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<State, VirtualMachine.Event, VirtualMachine>, Configurable {
+StateListener<State, VirtualMachine.Event, VirtualMachine> {
private static final Logger s_logger = Logger.getLogger(DeploymentPlanningManagerImpl.class);
@Inject
@@ -762,16 +761,6 @@ StateListener<State, VirtualMachine.Event, VirtualMachine>, 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<State, VirtualMachine.Event, VirtualMachine>, 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<State, VirtualMachine.Event, VirtualMachine> {
_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<ServiceOfferingVO> 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<Pair<Long, Integer>> l = _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !_useLocalStorage);
+ boolean useLocalStorage = false;
+ Boolean useLocal = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dataCenterId);
+ if (useLocal != null) {
+ useLocalStorage = useLocal.booleanValue();
+ }
+ List<Pair<Long, Integer>> 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<ServiceOfferingVO> 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);