Skip to content

Commit d426047

Browse files
committed
engine-schema: fix systemvm template upgrade for missing or unused
hypervisor type Fixes #12077 Signed-off-by: Abhishek Kumar <[email protected]>
1 parent d26122b commit d426047

File tree

6 files changed

+30
-77
lines changed

6 files changed

+30
-77
lines changed

engine/schema/src/main/java/com/cloud/dc/dao/ClusterDao.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.cloud.cpu.CPU;
2323
import com.cloud.dc.ClusterVO;
2424
import com.cloud.hypervisor.Hypervisor.HypervisorType;
25-
import com.cloud.utils.Pair;
2625
import com.cloud.utils.db.GenericDao;
2726

2827
public interface ClusterDao extends GenericDao<ClusterVO, Long> {
@@ -34,8 +33,6 @@ public interface ClusterDao extends GenericDao<ClusterVO, Long> {
3433

3534
List<HypervisorType> getAvailableHypervisorInZone(Long zoneId);
3635

37-
List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsArchAcrossClusters(Long zoneId);
38-
3936
List<ClusterVO> listByDcHyType(long dcId, String hyType);
4037

4138
Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds);

engine/schema/src/main/java/com/cloud/dc/dao/ClusterDaoImpl.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import com.cloud.hypervisor.Hypervisor.HypervisorType;
3838
import com.cloud.org.Grouping;
3939
import com.cloud.org.Managed;
40-
import com.cloud.utils.Pair;
4140
import com.cloud.utils.db.GenericDaoBase;
4241
import com.cloud.utils.db.GenericSearchBuilder;
4342
import com.cloud.utils.db.JoinBuilder;
@@ -168,22 +167,6 @@ public List<HypervisorType> getAvailableHypervisorInZone(Long zoneId) {
168167
.collect(Collectors.toList());
169168
}
170169

171-
@Override
172-
public List<Pair<HypervisorType, CPU.CPUArch>> listDistinctHypervisorsArchAcrossClusters(Long zoneId) {
173-
SearchBuilder<ClusterVO> sb = createSearchBuilder();
174-
sb.select(null, Func.DISTINCT_PAIR, sb.entity().getHypervisorType(), sb.entity().getArch());
175-
sb.and("zoneId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
176-
sb.done();
177-
SearchCriteria<ClusterVO> sc = sb.create();
178-
if (zoneId != null) {
179-
sc.setParameters("zoneId", zoneId);
180-
}
181-
final List<ClusterVO> clusters = search(sc, null);
182-
return clusters.stream()
183-
.map(c -> new Pair<>(c.getHypervisorType(), c.getArch()))
184-
.collect(Collectors.toList());
185-
}
186-
187170
@Override
188171
public Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds) {
189172
TransactionLegacy txn = TransactionLegacy.currentTxn();

engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@
5858

5959
import com.cloud.cpu.CPU;
6060
import com.cloud.dc.DataCenterVO;
61-
import com.cloud.dc.dao.ClusterDao;
62-
import com.cloud.dc.dao.ClusterDaoImpl;
6361
import com.cloud.dc.dao.DataCenterDao;
6462
import com.cloud.dc.dao.DataCenterDaoImpl;
63+
import com.cloud.host.dao.HostDao;
6564
import com.cloud.hypervisor.Hypervisor;
6665
import com.cloud.storage.DataStoreRole;
6766
import com.cloud.storage.GuestOSVO;
@@ -108,9 +107,16 @@ public class SystemVmTemplateRegistration {
108107
private static Integer LINUX_12_ID = 363;
109108
private static final Integer SCRIPT_TIMEOUT = 1800000;
110109
private static final Integer LOCK_WAIT_TIMEOUT = 1200;
111-
protected static final List<CPU.CPUArch> DOWNLOADABLE_TEMPLATE_ARCH_TYPES = Arrays.asList(
112-
CPU.CPUArch.arm64
113-
);
110+
protected static final List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> BUNDLED_TEMPLATE_HYPERVISOR_ARCH_TYPES =
111+
Arrays.asList(
112+
new Pair<>(Hypervisor.HypervisorType.KVM, CPU.CPUArch.amd64),
113+
new Pair<>(Hypervisor.HypervisorType.VMware, CPU.CPUArch.amd64),
114+
new Pair<>(Hypervisor.HypervisorType.XenServer, CPU.CPUArch.amd64)
115+
);
116+
protected static final List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> DOWNLOADABLE_TEMPLATE_HYPERVISOR_ARCH_TYPES =
117+
Arrays.asList(
118+
new Pair<>(Hypervisor.HypervisorType.KVM, CPU.CPUArch.arm64)
119+
);
114120

115121
public static String CS_MAJOR_VERSION = null;
116122
public static String CS_TINY_VERSION = null;
@@ -130,7 +136,7 @@ public class SystemVmTemplateRegistration {
130136
@Inject
131137
ImageStoreDetailsDao imageStoreDetailsDao;
132138
@Inject
133-
ClusterDao clusterDao;
139+
HostDao hostDao;
134140
@Inject
135141
ConfigurationDao configurationDao;
136142
@Inject
@@ -148,7 +154,6 @@ public SystemVmTemplateRegistration() {
148154
vmInstanceDao = new VMInstanceDaoImpl();
149155
imageStoreDao = new ImageStoreDaoImpl();
150156
imageStoreDetailsDao = new ImageStoreDetailsDaoImpl();
151-
clusterDao = new ClusterDaoImpl();
152157
configurationDao = new ConfigurationDaoImpl();
153158
guestOSDao = new GuestOSDaoImpl();
154159
tempDownloadDir = new File(System.getProperty("java.io.tmpdir"));
@@ -857,7 +862,9 @@ protected File getTemplateFile(MetadataTemplateDetails templateDetails) {
857862
return templateFile;
858863
}
859864
LOGGER.debug("{} is not present", templateFile.getAbsolutePath());
860-
if (DOWNLOADABLE_TEMPLATE_ARCH_TYPES.contains(templateDetails.getArch()) &&
865+
Pair<Hypervisor.HypervisorType, CPU.CPUArch> templateHypervisorAndArch =
866+
new Pair<>(templateDetails.getHypervisorType(), templateDetails.getArch());
867+
if (DOWNLOADABLE_TEMPLATE_HYPERVISOR_ARCH_TYPES.contains(templateHypervisorAndArch) &&
861868
StringUtils.isNotBlank(templateDetails.getUrl())) {
862869
LOGGER.debug("Downloading the template file {} for {}",
863870
templateDetails.getUrl(), templateDetails.getHypervisorArchLog());
@@ -900,6 +907,11 @@ protected void validateTemplates(List<Pair<Hypervisor.HypervisorType, CPU.CPUArc
900907
matchedTemplate.getHypervisorArchLog());
901908
continue;
902909
}
910+
if (!tempFile.exists() && !BUNDLED_TEMPLATE_HYPERVISOR_ARCH_TYPES.contains(hypervisorArch)) {
911+
LOGGER.warn("Template for {} not found locally, moving ahead",
912+
matchedTemplate.getHypervisorArchLog());
913+
continue;
914+
}
903915
if (isTemplateFileChecksumDifferent(matchedTemplate, tempFile)) {
904916
templatesFound = false;
905917
break;
@@ -917,7 +929,7 @@ protected void registerTemplatesForZone(long zoneId, String filePath) {
917929
String nfsVersion = getNfsVersion(storeUrlAndId.second());
918930
mountStore(storeUrlAndId.first(), filePath, nfsVersion);
919931
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorArchList =
920-
clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId);
932+
hostDao.listDistinctHypervisorArchTypes(zoneId);
921933
for (Pair<Hypervisor.HypervisorType, CPU.CPUArch> hypervisorArch : hypervisorArchList) {
922934
Hypervisor.HypervisorType hypervisorType = hypervisorArch.first();
923935
MetadataTemplateDetails templateDetails = getMetadataTemplateDetails(hypervisorType,
@@ -1065,7 +1077,7 @@ public void updateSystemVmTemplates(final Connection conn) {
10651077
public void doInTransactionWithoutResult(final TransactionStatus status) {
10661078
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> hypervisorsInUse;
10671079
try {
1068-
hypervisorsInUse = clusterDao.listDistinctHypervisorsArchAcrossClusters(null);
1080+
hypervisorsInUse = hostDao.listDistinctHypervisorArchTypes(null);
10691081
} catch (final Exception e) {
10701082
throw new CloudRuntimeException("Exception while getting hypervisor types from clusters", e);
10711083
}

engine/schema/src/test/java/com/cloud/dc/dao/ClusterDaoImplTest.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.cloud.dc.dao;
1818

1919
import static org.junit.Assert.assertEquals;
20-
import static org.junit.Assert.assertNotNull;
2120
import static org.junit.Assert.assertTrue;
2221
import static org.mockito.Mockito.any;
2322
import static org.mockito.Mockito.doReturn;
@@ -37,13 +36,9 @@
3736
import org.mockito.Spy;
3837
import org.mockito.junit.MockitoJUnitRunner;
3938

40-
import com.cloud.cpu.CPU;
4139
import com.cloud.dc.ClusterVO;
42-
import com.cloud.hypervisor.Hypervisor;
43-
import com.cloud.utils.Pair;
4440
import com.cloud.utils.db.GenericSearchBuilder;
4541
import com.cloud.utils.db.SearchBuilder;
46-
import com.cloud.utils.db.SearchCriteria;
4742

4843
@RunWith(MockitoJUnitRunner.class)
4944
public class ClusterDaoImplTest {
@@ -80,39 +75,4 @@ public void testListAllIdsEmptyResult() {
8075
verify(clusterDao).customSearch(genericSearchBuilder.create(), null);
8176
assertTrue(result.isEmpty());
8277
}
83-
84-
@Test
85-
public void listDistinctHypervisorsArchAcrossClusters_WithZone() {
86-
Long zoneId = 123L;
87-
ClusterVO cluster1 = mock(ClusterVO.class);
88-
when(cluster1.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.XenServer);
89-
when(cluster1.getArch()).thenReturn(CPU.CPUArch.amd64);
90-
ClusterVO cluster2 = mock(ClusterVO.class);
91-
when(cluster2.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM);
92-
when(cluster2.getArch()).thenReturn(CPU.CPUArch.arm64);
93-
List<ClusterVO> dummyHosts = Arrays.asList(cluster1, cluster2);
94-
doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull());
95-
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId);
96-
assertNotNull(result);
97-
assertEquals(2, result.size());
98-
assertEquals(Hypervisor.HypervisorType.XenServer, result.get(0).first());
99-
assertEquals(CPU.CPUArch.amd64, result.get(0).second());
100-
assertEquals(Hypervisor.HypervisorType.KVM, result.get(1).first());
101-
assertEquals(CPU.CPUArch.arm64, result.get(1).second());
102-
}
103-
104-
@Test
105-
public void listDistinctHypervisorsArchAcrossClusters_WithoutZone() {
106-
Long zoneId = null;
107-
ClusterVO cluster = mock(ClusterVO.class);
108-
when(cluster.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.VMware);
109-
when(cluster.getArch()).thenReturn(CPU.CPUArch.amd64);
110-
List<ClusterVO> dummyHosts = Collections.singletonList(cluster);
111-
doReturn(dummyHosts).when(clusterDao).search(any(SearchCriteria.class), isNull());
112-
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId);
113-
assertNotNull(result);
114-
assertEquals(1, result.size());
115-
assertEquals(Hypervisor.HypervisorType.VMware, result.get(0).first());
116-
assertEquals(CPU.CPUArch.amd64, result.get(0).second());
117-
}
11878
}

engine/schema/src/test/java/com/cloud/upgrade/SystemVmTemplateRegistrationTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
import org.mockito.junit.MockitoJUnitRunner;
5454

5555
import com.cloud.cpu.CPU;
56-
import com.cloud.dc.dao.ClusterDao;
56+
import com.cloud.host.dao.HostDao;
5757
import com.cloud.hypervisor.Hypervisor;
5858
import com.cloud.storage.VMTemplateVO;
5959
import com.cloud.storage.dao.VMTemplateDao;
@@ -67,7 +67,7 @@
6767
public class SystemVmTemplateRegistrationTest {
6868

6969
@Mock
70-
ClusterDao clusterDao;
70+
HostDao hostDao;
7171

7272
@Mock
7373
VMTemplateDao vmTemplateDao;
@@ -363,14 +363,15 @@ public void testValidateTemplates_fileFailure() {
363363
systemVmTemplateRegistration.validateTemplates(list);
364364
}
365365

366+
@Test
366367
public void testValidateTemplates_downloadableFileNotFound() {
367-
CPU.CPUArch arch = SystemVmTemplateRegistration.DOWNLOADABLE_TEMPLATE_ARCH_TYPES.get(0);
368+
Pair<Hypervisor.HypervisorType, CPU.CPUArch> hypervisorTypeCPUArchPair = SystemVmTemplateRegistration.DOWNLOADABLE_TEMPLATE_HYPERVISOR_ARCH_TYPES.get(0);
368369
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> list = new ArrayList<>();
369-
list.add(new Pair<>(Hypervisor.HypervisorType.KVM, arch));
370+
list.add(hypervisorTypeCPUArchPair);
370371
SystemVmTemplateRegistration.MetadataTemplateDetails details =
371372
Mockito.mock(SystemVmTemplateRegistration.MetadataTemplateDetails.class);
372373
SystemVmTemplateRegistration.NewTemplateMap.put(SystemVmTemplateRegistration.getHypervisorArchKey(
373-
Hypervisor.HypervisorType.KVM, arch), details);
374+
hypervisorTypeCPUArchPair.first(), hypervisorTypeCPUArchPair.second()), details);
374375
doReturn(null).when(systemVmTemplateRegistration).getTemplateFile(details);
375376
systemVmTemplateRegistration.validateTemplates(list);
376377
}
@@ -404,7 +405,7 @@ public void testRegisterTemplatesForZone() {
404405
Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.KVM;
405406
CPU.CPUArch arch = CPU.CPUArch.getDefault();
406407
hypervisorArchList.add(new Pair<>(hypervisorType, arch));
407-
doReturn(hypervisorArchList).when(clusterDao).listDistinctHypervisorsArchAcrossClusters(zoneId);
408+
doReturn(hypervisorArchList).when(hostDao).listDistinctHypervisorArchTypes(zoneId);
408409
SystemVmTemplateRegistration.MetadataTemplateDetails details =
409410
Mockito.mock(SystemVmTemplateRegistration.MetadataTemplateDetails.class);
410411
String name = "existing";

server/src/main/java/com/cloud/storage/StorageManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3646,7 +3646,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
36463646
DataStoreRole.Image, store.getId());
36473647
if (CollectionUtils.isEmpty(stores)) {
36483648
List<Pair<HypervisorType, CPU.CPUArch>> hypervisorTypes =
3649-
_clusterDao.listDistinctHypervisorsArchAcrossClusters(zoneId);
3649+
_hostDao.listDistinctHypervisorArchTypes(zoneId);
36503650
TransactionLegacy txn = TransactionLegacy.open("AutomaticTemplateRegister");
36513651
SystemVmTemplateRegistration systemVmTemplateRegistration = new SystemVmTemplateRegistration();
36523652
String filePath = null;

0 commit comments

Comments
 (0)