From 0b381d4270e46fffd4b6114670dadfc9cf551d43 Mon Sep 17 00:00:00 2001 From: Harikrishna Date: Fri, 15 Aug 2025 16:28:56 +0530 Subject: [PATCH] Exclude External hypervisor type during upgrade for System VM template checks (#11435) * Exclude External hypervisor type during upgrade for System VM template checks --- .../src/main/java/com/cloud/dc/dao/ClusterDao.java | 2 +- .../main/java/com/cloud/dc/dao/ClusterDaoImpl.java | 12 +++++++++++- .../cloud/upgrade/SystemVmTemplateRegistration.java | 4 ++-- .../java/com/cloud/dc/dao/ClusterDaoImplTest.java | 4 ++-- .../upgrade/SystemVmTemplateRegistrationTest.java | 2 +- .../java/com/cloud/storage/StorageManagerImpl.java | 2 +- 6 files changed, 18 insertions(+), 8 deletions(-) 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 1745f5380e2..6cfd2608f5d 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 ea82a10f9c9..c63af0a237b 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 class ClusterDaoImpl extends GenericDaoBase implements C .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 26b033c8d79..9b1420f22c3 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 @@ public class SystemVmTemplateRegistration { 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 class SystemVmTemplateRegistration { 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 f8673fa9c9f..c1a558a72b3 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 class ClusterDaoImplTest { 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 class ClusterDaoImplTest { 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 6573a5565f3..dceb8e07b07 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 class SystemVmTemplateRegistrationTest { 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 f6bef8b2e8c..cd13252d651 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 class StorageManagerImpl extends ManagerBase implements StorageManager, C 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;