diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index e05f21ba4f6..f061e7598af 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -75,6 +75,8 @@ import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host.Type; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.info.ConsoleProxyConnectionInfo; import com.cloud.info.ConsoleProxyInfo; import com.cloud.info.ConsoleProxyLoadInfo; @@ -526,8 +528,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.warn("The number of launched console proxy on zone " + dataCenterId + " has reached to limit"); return null; } - - Map context = createProxyInstance(dataCenterId); + HypervisorType currentHyp = currentHypervisorType(dataCenterId); + + Map context = createProxyInstance(dataCenterId, currentHyp); long proxyVmId = (Long) context.get("proxyVmId"); if (proxyVmId == 0) { @@ -556,7 +559,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx return null; } - protected Map createProxyInstance(long dataCenterId) throws ConcurrentOperationException { + protected Map createProxyInstance(long dataCenterId, HypervisorType desiredHyp) throws ConcurrentOperationException { long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); String name = VirtualMachineName.getConsoleProxyName(id, _instance); @@ -580,7 +583,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx networks.add(new Pair(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false, false).get(0), null)); } - VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId); + VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId, desiredHyp); if (template == null) { s_logger.debug("Can't find a template to start"); throw new CloudRuntimeException("Insufficient capacity exception"); @@ -866,6 +869,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx int launchLimit = NumbersUtil.parseInt(value, 10); return l.size() < launchLimit; } + + private HypervisorType currentHypervisorType(long dcId) { + List l = _consoleProxyDao.getProxyListInStates(dcId, VirtualMachine.State.Starting, + VirtualMachine.State.Running, VirtualMachine.State.Stopping, VirtualMachine.State.Stopped, + VirtualMachine.State.Migrating, VirtualMachine.State.Shutdowned, VirtualMachine.State.Unknown); + + return l.size() > 0? l.get(0).getHypervisorType():HypervisorType.Any; + } private Runnable getCapacityScanTask() { return new Runnable() { diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index d3c44b350d8..5aea418bb17 100644 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Set; import com.cloud.domain.DomainVO; +import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.VMTemplateVO; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; @@ -67,6 +68,8 @@ public interface VMTemplateDao extends GenericDao { public List listByHypervisorType(HypervisorType hyperType); public List publicIsoSearch(); VMTemplateVO findSystemVMTemplate(long zoneId); + VMTemplateVO findSystemVMTemplate(long zoneId, HypervisorType hType); + VMTemplateVO findRoutingTemplate(HypervisorType type); } diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 53a577314f6..2237ec1224c 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -475,6 +475,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return tmplt; } } + if (tmplts.size() > 0 && hType == HypervisorType.Any) { + return tmplts.get(0); + } return null; }