diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 49d3d5bf9d3..733061d2b40 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -74,6 +74,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; @@ -528,8 +530,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) { @@ -558,7 +561,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); @@ -582,7 +585,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"); @@ -868,6 +871,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 boolean checkCapacity(ConsoleProxyLoadInfo proxyCountInfo, ConsoleProxyLoadInfo vmCountInfo) { 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 36d80df01e3..2164b13f4f7 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; }