diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDao.java b/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDao.java index 1745f5380e21..6cfd2608f5de 100644 --- a/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDao.java +++ b/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDao.java @@ -34,7 +34,7 @@ public interface ClusterDao extends GenericDao { List getAvailableHypervisorInZone(Long zoneId); - List> listDistinctHypervisorsArchAcrossClusters(Long zoneId); + List> listDistinctHypervisorsAndArchExcludingExternalType(Long zoneId); List listByDcHyType(long dcId, String hyType); diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDaoImpl.java index ea82a10f9c95..c63af0a237ba 100644 --- a/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/dc/dao/ClusterDaoImpl.java @@ -168,16 +168,26 @@ public List getAvailableHypervisorInZone(Long zoneId) { .collect(Collectors.toList()); } + /** + * Returns distinct (HypervisorType, CPUArch) pairs from clusters in the given zone, + * excluding clusters with {@link HypervisorType#External}. + * + * @param zoneId the zone ID to filter by, or {@code null} to include all zones + * @return list of unique hypervisor type and CPU architecture pairs + */ @Override - public List> listDistinctHypervisorsArchAcrossClusters(Long zoneId) { + public List> listDistinctHypervisorsAndArchExcludingExternalType(Long zoneId) { SearchBuilder sb = createSearchBuilder(); sb.select(null, Func.DISTINCT_PAIR, sb.entity().getHypervisorType(), sb.entity().getArch()); sb.and("zoneId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.NEQ); sb.done(); SearchCriteria sc = sb.create(); if (zoneId != null) { sc.setParameters("zoneId", zoneId); } + sc.setParameters("hypervisorType", HypervisorType.External); + final List clusters = search(sc, null); return clusters.stream() .map(c -> new Pair<>(c.getHypervisorType(), c.getArch())) diff --git a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java index 26b033c8d790..9b1420f22c37 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -917,7 +917,7 @@ protected void registerTemplatesForZone(long zoneId, String filePath) { String nfsVersion = getNfsVersion(storeUrlAndId.second()); mountStore(storeUrlAndId.first(), filePath, nfsVersion); List> hypervisorArchList = - clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); + clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId); for (Pair hypervisorArch : hypervisorArchList) { Hypervisor.HypervisorType hypervisorType = hypervisorArch.first(); MetadataTemplateDetails templateDetails = getMetadataTemplateDetails(hypervisorType, @@ -1065,7 +1065,7 @@ public void updateSystemVmTemplates(final Connection conn) { public void doInTransactionWithoutResult(final TransactionStatus status) { List> hypervisorsInUse; try { - hypervisorsInUse = clusterDao.listDistinctHypervisorsArchAcrossClusters(null); + hypervisorsInUse = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(null); } catch (final Exception e) { throw new CloudRuntimeException("Exception while getting hypervisor types from clusters", e); } diff --git a/engine/schema/src/test/java/com/cloud/dc/dao/ClusterDaoImplTest.java b/engine/schema/src/test/java/com/cloud/dc/dao/ClusterDaoImplTest.java index f8673fa9c9fd..c1a558a72b33 100644 --- a/engine/schema/src/test/java/com/cloud/dc/dao/ClusterDaoImplTest.java +++ b/engine/schema/src/test/java/com/cloud/dc/dao/ClusterDaoImplTest.java @@ -92,7 +92,7 @@ public void listDistinctHypervisorsArchAcrossClusters_WithZone() { when(cluster2.getArch()).thenReturn(CPU.CPUArch.arm64); List dummyHosts = Arrays.asList(cluster1, cluster2); doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull()); - List> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); + List> result = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId); assertNotNull(result); assertEquals(2, result.size()); assertEquals(Hypervisor.HypervisorType.XenServer, result.get(0).first()); @@ -109,7 +109,7 @@ public void listDistinctHypervisorsArchAcrossClusters_WithoutZone() { when(cluster.getArch()).thenReturn(CPU.CPUArch.amd64); List dummyHosts = Collections.singletonList(cluster); doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull()); - List> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); + List> result = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId); assertNotNull(result); assertEquals(1, result.size()); assertEquals(Hypervisor.HypervisorType.VMware, result.get(0).first()); diff --git a/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java b/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java index 6573a5565f30..dceb8e07b07d 100644 --- a/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java +++ b/engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java @@ -404,7 +404,7 @@ public void testRegisterTemplatesForZone() { Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.KVM; CPU.CPUArch arch = CPU.CPUArch.getDefault(); hypervisorArchList.add(new Pair<>(hypervisorType, arch)); - doReturn(hypervisorArchList).when(clusterDao).listDistinctHypervisorsArchAcrossClusters(zoneId); + doReturn(hypervisorArchList).when(clusterDao).listDistinctHypervisorsAndArchExcludingExternalType(zoneId); SystemVmTemplateRegistration.MetadataTemplateDetails details = Mockito.mock(SystemVmTemplateRegistration.MetadataTemplateDetails.class); String name = "existing"; diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index f6bef8b2e8cf..cd13252d651e 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -4029,7 +4029,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { DataStoreRole.Image, store.getId()); if (CollectionUtils.isEmpty(stores)) { List> hypervisorTypes = - _clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); + _clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId); TransactionLegacy txn = TransactionLegacy.open("AutomaticTemplateRegister"); SystemVmTemplateRegistration systemVmTemplateRegistration = new SystemVmTemplateRegistration(); String filePath = null;