diff --git a/engine/components-api/src/com/cloud/resource/ResourceManager.java b/engine/components-api/src/com/cloud/resource/ResourceManager.java index 5a9bddb1863..0608cb47401 100755 --- a/engine/components-api/src/com/cloud/resource/ResourceManager.java +++ b/engine/components-api/src/com/cloud/resource/ResourceManager.java @@ -141,6 +141,13 @@ public interface ResourceManager extends ResourceService { */ List listAllUpAndEnabledNonHAHosts(Type type, Long clusterId, Long podId, long dcId); + /** + * Check if host is GPU enabled + * @param hostId the host to be checked + * @return true if host contains GPU card else false + */ + boolean isHostGpuEnabled(long hostId); + /** * Check if host has GPU devices available * @param hostId the host to be checked diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 37368846da9..a451fad4eb1 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -243,7 +243,7 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator { // We will try to reorder the host lists such that we give priority to hosts that have // the minimums to support a VM's requirements - hosts = prioritizeHosts(template, hosts); + hosts = prioritizeHosts(template, offering, hosts); if (s_logger.isDebugEnabled()) { s_logger.debug("Found " + hosts.size() + " hosts for allocation after prioritization: " + hosts); @@ -353,7 +353,7 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator { return true; } - protected List prioritizeHosts(VMTemplateVO template, List hosts) { + protected List prioritizeHosts(VMTemplateVO template, ServiceOffering offering, List hosts) { if (template == null) { return hosts; } @@ -416,6 +416,22 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator { prioritizedHosts.addAll(0, highPriorityHosts); prioritizedHosts.addAll(lowPriorityHosts); + // if service offering is not GPU enabled then move all the GPU enabled hosts to the end of priority list. + if (_serviceOfferingDetailsDao.findDetail(offering.getId(), GPU.Keys.vgpuType.toString()) == null) { + + List gpuEnabledHosts = new ArrayList(); + // Check for GPU enabled hosts. + for (Host host : prioritizedHosts) { + if (_resourceMgr.isHostGpuEnabled(host.getId())) { + gpuEnabledHosts.add(host); + } + } + // Move GPU enabled hosts to the end of list + if(!gpuEnabledHosts.isEmpty()) { + prioritizedHosts.removeAll(gpuEnabledHosts); + prioritizedHosts.addAll(gpuEnabledHosts); + } + } return prioritizedHosts; } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 3eb51a5524e..0fefd620b29 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -2500,6 +2500,13 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, return sc.list(); } + @Override + public boolean isHostGpuEnabled(long hostId) { + SearchCriteria sc = _gpuAvailability.create(); + sc.setParameters("hostId", hostId); + return _hostGpuGroupsDao.customSearch(sc, null).size() > 0 ? true : false; + } + @Override public List listAvailableGPUDevice(long hostId, String vgpuType) { if (vgpuType == null) { diff --git a/server/test/com/cloud/resource/MockResourceManagerImpl.java b/server/test/com/cloud/resource/MockResourceManagerImpl.java index e6bf9a26b2c..8c5f5da4c09 100644 --- a/server/test/com/cloud/resource/MockResourceManagerImpl.java +++ b/server/test/com/cloud/resource/MockResourceManagerImpl.java @@ -585,4 +585,10 @@ public class MockResourceManagerImpl extends ManagerBase implements ResourceMana // TODO Auto-generated method stub return null; } + + @Override + public boolean isHostGpuEnabled(long hostId) { + // TODO Auto-generated method stub + return false; + } }