Skip to content

Commit d717d8a

Browse files
authored
upgrade/systemvm: add template zone entries (#5642)
* upgrade/systemvm: add template_zone_ref entries Fixes #5641 When registering a system VM template during an upgrade, entries in cloud.template_zone_ref must be created for the new template. For a cross-zones template, entry for each zone must be added. Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * fix for template-zone entry create Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com> * change Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent a1942b4 commit d717d8a

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

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

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// under the License.
1717
package com.cloud.upgrade;
1818

19+
import com.cloud.dc.DataCenterVO;
1920
import com.cloud.dc.dao.ClusterDao;
2021
import com.cloud.dc.dao.ClusterDaoImpl;
2122
import com.cloud.dc.dao.DataCenterDao;
@@ -26,14 +27,18 @@
2627
import com.cloud.storage.Storage.ImageFormat;
2728
import com.cloud.storage.VMTemplateStorageResourceAssoc;
2829
import com.cloud.storage.VMTemplateVO;
30+
import com.cloud.storage.VMTemplateZoneVO;
2931
import com.cloud.storage.dao.VMTemplateDao;
3032
import com.cloud.storage.dao.VMTemplateDaoImpl;
33+
import com.cloud.storage.dao.VMTemplateZoneDao;
34+
import com.cloud.storage.dao.VMTemplateZoneDaoImpl;
3135
import com.cloud.template.VirtualMachineTemplate;
3236
import com.cloud.upgrade.dao.BasicTemplateDataStoreDaoImpl;
3337
import com.cloud.user.Account;
3438
import com.cloud.utils.DateUtil;
3539
import com.cloud.utils.Pair;
3640
import com.cloud.utils.UriUtils;
41+
import com.cloud.utils.db.GenericDaoBase;
3742
import com.cloud.utils.db.GlobalLock;
3843
import com.cloud.utils.db.Transaction;
3944
import com.cloud.utils.db.TransactionCallbackNoReturn;
@@ -104,6 +109,8 @@ public class SystemVmTemplateRegistration {
104109
@Inject
105110
VMTemplateDao vmTemplateDao;
106111
@Inject
112+
VMTemplateZoneDao vmTemplateZoneDao;
113+
@Inject
107114
TemplateDataStoreDao templateDataStoreDao;
108115
@Inject
109116
VMInstanceDao vmInstanceDao;
@@ -117,6 +124,7 @@ public class SystemVmTemplateRegistration {
117124
public SystemVmTemplateRegistration() {
118125
dataCenterDao = new DataCenterDaoImpl();
119126
vmTemplateDao = new VMTemplateDaoImpl();
127+
vmTemplateZoneDao = new VMTemplateZoneDaoImpl();
120128
templateDataStoreDao = new BasicTemplateDataStoreDaoImpl();
121129
vmInstanceDao = new VMInstanceDaoImpl();
122130
imageStoreDao = new ImageStoreDaoImpl();
@@ -435,7 +443,7 @@ private List<String> fetchAllHypervisors(Long zoneId) {
435443
return hypervisorList;
436444
}
437445

438-
private Long createTemplateObjectInDB(SystemVMTemplateDetails details) {
446+
private VMTemplateVO createTemplateObjectInDB(SystemVMTemplateDetails details) {
439447
Long templateId = vmTemplateDao.getNextInSequence(Long.class, "id");
440448
VMTemplateVO template = new VMTemplateVO();
441449
template.setUuid(details.getUuid());
@@ -458,10 +466,31 @@ private Long createTemplateObjectInDB(SystemVMTemplateDetails details) {
458466
template.setState(VirtualMachineTemplate.State.Inactive);
459467
template.setDeployAsIs(Hypervisor.HypervisorType.VMware.equals(details.getHypervisorType()));
460468
template = vmTemplateDao.persist(template);
461-
if (template == null) {
462-
return null;
469+
return template;
470+
}
471+
472+
private VMTemplateZoneVO createOrUpdateTemplateZoneEntry(long zoneId, long templateId) {
473+
VMTemplateZoneVO templateZoneVO = vmTemplateZoneDao.findByZoneTemplate(zoneId, templateId);
474+
if (templateZoneVO == null) {
475+
templateZoneVO = new VMTemplateZoneVO(zoneId, templateId, new java.util.Date());
476+
templateZoneVO = vmTemplateZoneDao.persist(templateZoneVO);
477+
} else {
478+
templateZoneVO.setLastUpdated(new java.util.Date());
479+
if (vmTemplateZoneDao.update(templateZoneVO.getId(), templateZoneVO)) {
480+
templateZoneVO = null;
481+
}
482+
}
483+
return templateZoneVO;
484+
}
485+
486+
private void createCrossZonesTemplateZoneRefEntries(VMTemplateVO template) {
487+
List<DataCenterVO> dcs = dataCenterDao.listAll();
488+
for (DataCenterVO dc : dcs) {
489+
VMTemplateZoneVO templateZoneVO = createOrUpdateTemplateZoneEntry(dc.getId(), template.getId());
490+
if (templateZoneVO == null) {
491+
throw new CloudRuntimeException(String.format("Failed to create template_zone_ref record for the systemVM template for hypervisor: %s and zone: %s", template.getHypervisorType().name(), dc));
492+
}
463493
}
464-
return template.getId();
465494
}
466495

467496
private void createTemplateStoreRefEntry(SystemVMTemplateDetails details) {
@@ -585,10 +614,12 @@ private Long performTemplateRegistrationOperations(Pair<Hypervisor.HypervisorTyp
585614
SystemVMTemplateDetails details = new SystemVMTemplateDetails(templateName, hypervisorAndTemplateName.second(), created,
586615
url, checksum, format, (int) guestOsId, hypervisor, storeId);
587616
if (templateId == null) {
588-
templateId = createTemplateObjectInDB(details);
589-
}
590-
if (templateId == null) {
591-
throw new CloudRuntimeException(String.format("Failed to register template for hypervisor: %s", hypervisor.name()));
617+
VMTemplateVO template = createTemplateObjectInDB(details);
618+
if (template == null) {
619+
throw new CloudRuntimeException(String.format("Failed to register template for hypervisor: %s", hypervisor.name()));
620+
}
621+
templateId = template.getId();
622+
createCrossZonesTemplateZoneRefEntries(template);
592623
}
593624
details.setId(templateId);
594625
String destTempFolderName = String.valueOf(templateId);

0 commit comments

Comments
 (0)