Exclude External hypervisor type during upgrade for System VM template checks (#11435)

* Exclude External hypervisor type during upgrade for System VM template checks
This commit is contained in:
Harikrishna 2025-08-15 16:28:56 +05:30 committed by GitHub
parent 2c493d1933
commit 0b381d4270
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 18 additions and 8 deletions

View File

@ -34,7 +34,7 @@ public interface ClusterDao extends GenericDao<ClusterVO, Long> {
List<HypervisorType> getAvailableHypervisorInZone(Long zoneId); List<HypervisorType> getAvailableHypervisorInZone(Long zoneId);
List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsArchAcrossClusters(Long zoneId); List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsAndArchExcludingExternalType(Long zoneId);
List<ClusterVO> listByDcHyType(long dcId, String hyType); List<ClusterVO> listByDcHyType(long dcId, String hyType);

View File

@ -168,16 +168,26 @@ public class ClusterDaoImpl extends GenericDaoBase<ClusterVO, Long> implements C
.collect(Collectors.toList()); .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 @Override
public List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsArchAcrossClusters(Long zoneId) { public List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsAndArchExcludingExternalType(Long zoneId) {
SearchBuilder<ClusterVO> sb = createSearchBuilder(); SearchBuilder<ClusterVO> sb = createSearchBuilder();
sb.select(null, Func.DISTINCT_PAIR, sb.entity().getHypervisorType(), sb.entity().getArch()); sb.select(null, Func.DISTINCT_PAIR, sb.entity().getHypervisorType(), sb.entity().getArch());
sb.and("zoneId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ); sb.and("zoneId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.NEQ);
sb.done(); sb.done();
SearchCriteria<ClusterVO> sc = sb.create(); SearchCriteria<ClusterVO> sc = sb.create();
if (zoneId != null) { if (zoneId != null) {
sc.setParameters("zoneId", zoneId); sc.setParameters("zoneId", zoneId);
} }
sc.setParameters("hypervisorType", HypervisorType.External);
final List<ClusterVO> clusters = search(sc, null); final List<ClusterVO> clusters = search(sc, null);
return clusters.stream() return clusters.stream()
.map(c -> new Pair<>(c.getHypervisorType(), c.getArch())) .map(c -> new Pair<>(c.getHypervisorType(), c.getArch()))

View File

@ -917,7 +917,7 @@ public class SystemVmTemplateRegistration {
String nfsVersion = getNfsVersion(storeUrlAndId.second()); String nfsVersion = getNfsVersion(storeUrlAndId.second());
mountStore(storeUrlAndId.first(), filePath, nfsVersion); mountStore(storeUrlAndId.first(), filePath, nfsVersion);
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorArchList = List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorArchList =
clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId);
for (Pair<Hypervisor.HypervisorType, CPU.CPUArch> hypervisorArch : hypervisorArchList) { for (Pair<Hypervisor.HypervisorType, CPU.CPUArch> hypervisorArch : hypervisorArchList) {
Hypervisor.HypervisorType hypervisorType = hypervisorArch.first(); Hypervisor.HypervisorType hypervisorType = hypervisorArch.first();
MetadataTemplateDetails templateDetails = getMetadataTemplateDetails(hypervisorType, MetadataTemplateDetails templateDetails = getMetadataTemplateDetails(hypervisorType,
@ -1065,7 +1065,7 @@ public class SystemVmTemplateRegistration {
public void doInTransactionWithoutResult(final TransactionStatus status) { public void doInTransactionWithoutResult(final TransactionStatus status) {
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorsInUse; List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorsInUse;
try { try {
hypervisorsInUse = clusterDao.listDistinctHypervisorsArchAcrossClusters(null); hypervisorsInUse = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(null);
} catch (final Exception e) { } catch (final Exception e) {
throw new CloudRuntimeException("Exception while getting hypervisor types from clusters", e); throw new CloudRuntimeException("Exception while getting hypervisor types from clusters", e);
} }

View File

@ -92,7 +92,7 @@ public class ClusterDaoImplTest {
when(cluster2.getArch()).thenReturn(CPU.CPUArch.arm64); when(cluster2.getArch()).thenReturn(CPU.CPUArch.arm64);
List<ClusterVO> dummyHosts = Arrays.asList(cluster1, cluster2); List<ClusterVO> dummyHosts = Arrays.asList(cluster1, cluster2);
doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull()); doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull());
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId);
assertNotNull(result); assertNotNull(result);
assertEquals(2, result.size()); assertEquals(2, result.size());
assertEquals(Hypervisor.HypervisorType.XenServer, result.get(0).first()); assertEquals(Hypervisor.HypervisorType.XenServer, result.get(0).first());
@ -109,7 +109,7 @@ public class ClusterDaoImplTest {
when(cluster.getArch()).thenReturn(CPU.CPUArch.amd64); when(cluster.getArch()).thenReturn(CPU.CPUArch.amd64);
List<ClusterVO> dummyHosts = Collections.singletonList(cluster); List<ClusterVO> dummyHosts = Collections.singletonList(cluster);
doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull()); doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull());
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId);
assertNotNull(result); assertNotNull(result);
assertEquals(1, result.size()); assertEquals(1, result.size());
assertEquals(Hypervisor.HypervisorType.VMware, result.get(0).first()); assertEquals(Hypervisor.HypervisorType.VMware, result.get(0).first());

View File

@ -404,7 +404,7 @@ public class SystemVmTemplateRegistrationTest {
Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.KVM; Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.KVM;
CPU.CPUArch arch = CPU.CPUArch.getDefault(); CPU.CPUArch arch = CPU.CPUArch.getDefault();
hypervisorArchList.add(new Pair<>(hypervisorType, arch)); hypervisorArchList.add(new Pair<>(hypervisorType, arch));
doReturn(hypervisorArchList).when(clusterDao).listDistinctHypervisorsArchAcrossClusters(zoneId); doReturn(hypervisorArchList).when(clusterDao).listDistinctHypervisorsAndArchExcludingExternalType(zoneId);
SystemVmTemplateRegistration.MetadataTemplateDetails details = SystemVmTemplateRegistration.MetadataTemplateDetails details =
Mockito.mock(SystemVmTemplateRegistration.MetadataTemplateDetails.class); Mockito.mock(SystemVmTemplateRegistration.MetadataTemplateDetails.class);
String name = "existing"; String name = "existing";

View File

@ -4029,7 +4029,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
DataStoreRole.Image, store.getId()); DataStoreRole.Image, store.getId());
if (CollectionUtils.isEmpty(stores)) { if (CollectionUtils.isEmpty(stores)) {
List<Pair<HypervisorType, CPU.CPUArch>> hypervisorTypes = List<Pair<HypervisorType, CPU.CPUArch>> hypervisorTypes =
_clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId); _clusterDao.listDistinctHypervisorsAndArchExcludingExternalType(zoneId);
TransactionLegacy txn = TransactionLegacy.open("AutomaticTemplateRegister"); TransactionLegacy txn = TransactionLegacy.open("AutomaticTemplateRegister");
SystemVmTemplateRegistration systemVmTemplateRegistration = new SystemVmTemplateRegistration(); SystemVmTemplateRegistration systemVmTemplateRegistration = new SystemVmTemplateRegistration();
String filePath = null; String filePath = null;