From d717d8a4cdff8463d18d04dbd9c1be009a2f811a Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 2 Nov 2021 17:19:04 +0530 Subject: [PATCH] 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 * fix for template-zone entry create Signed-off-by: Abhishek Kumar * change Signed-off-by: Abhishek Kumar --- .../upgrade/SystemVmTemplateRegistration.java | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) 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 0616537a60b..057ddc5b09c 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.upgrade; +import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDaoImpl; import com.cloud.dc.dao.DataCenterDao; @@ -26,14 +27,18 @@ import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDaoImpl; +import com.cloud.storage.dao.VMTemplateZoneDao; +import com.cloud.storage.dao.VMTemplateZoneDaoImpl; import com.cloud.template.VirtualMachineTemplate; import com.cloud.upgrade.dao.BasicTemplateDataStoreDaoImpl; import com.cloud.user.Account; import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; import com.cloud.utils.UriUtils; +import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; @@ -104,6 +109,8 @@ public class SystemVmTemplateRegistration { @Inject VMTemplateDao vmTemplateDao; @Inject + VMTemplateZoneDao vmTemplateZoneDao; + @Inject TemplateDataStoreDao templateDataStoreDao; @Inject VMInstanceDao vmInstanceDao; @@ -117,6 +124,7 @@ public class SystemVmTemplateRegistration { public SystemVmTemplateRegistration() { dataCenterDao = new DataCenterDaoImpl(); vmTemplateDao = new VMTemplateDaoImpl(); + vmTemplateZoneDao = new VMTemplateZoneDaoImpl(); templateDataStoreDao = new BasicTemplateDataStoreDaoImpl(); vmInstanceDao = new VMInstanceDaoImpl(); imageStoreDao = new ImageStoreDaoImpl(); @@ -435,7 +443,7 @@ public class SystemVmTemplateRegistration { return hypervisorList; } - private Long createTemplateObjectInDB(SystemVMTemplateDetails details) { + private VMTemplateVO createTemplateObjectInDB(SystemVMTemplateDetails details) { Long templateId = vmTemplateDao.getNextInSequence(Long.class, "id"); VMTemplateVO template = new VMTemplateVO(); template.setUuid(details.getUuid()); @@ -458,10 +466,31 @@ public class SystemVmTemplateRegistration { template.setState(VirtualMachineTemplate.State.Inactive); template.setDeployAsIs(Hypervisor.HypervisorType.VMware.equals(details.getHypervisorType())); template = vmTemplateDao.persist(template); - if (template == null) { - return null; + return template; + } + + private VMTemplateZoneVO createOrUpdateTemplateZoneEntry(long zoneId, long templateId) { + VMTemplateZoneVO templateZoneVO = vmTemplateZoneDao.findByZoneTemplate(zoneId, templateId); + if (templateZoneVO == null) { + templateZoneVO = new VMTemplateZoneVO(zoneId, templateId, new java.util.Date()); + templateZoneVO = vmTemplateZoneDao.persist(templateZoneVO); + } else { + templateZoneVO.setLastUpdated(new java.util.Date()); + if (vmTemplateZoneDao.update(templateZoneVO.getId(), templateZoneVO)) { + templateZoneVO = null; + } + } + return templateZoneVO; + } + + private void createCrossZonesTemplateZoneRefEntries(VMTemplateVO template) { + List dcs = dataCenterDao.listAll(); + for (DataCenterVO dc : dcs) { + VMTemplateZoneVO templateZoneVO = createOrUpdateTemplateZoneEntry(dc.getId(), template.getId()); + if (templateZoneVO == null) { + 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)); + } } - return template.getId(); } private void createTemplateStoreRefEntry(SystemVMTemplateDetails details) { @@ -585,10 +614,12 @@ public class SystemVmTemplateRegistration { SystemVMTemplateDetails details = new SystemVMTemplateDetails(templateName, hypervisorAndTemplateName.second(), created, url, checksum, format, (int) guestOsId, hypervisor, storeId); if (templateId == null) { - templateId = createTemplateObjectInDB(details); - } - if (templateId == null) { - throw new CloudRuntimeException(String.format("Failed to register template for hypervisor: %s", hypervisor.name())); + VMTemplateVO template = createTemplateObjectInDB(details); + if (template == null) { + throw new CloudRuntimeException(String.format("Failed to register template for hypervisor: %s", hypervisor.name())); + } + templateId = template.getId(); + createCrossZonesTemplateZoneRefEntries(template); } details.setId(templateId); String destTempFolderName = String.valueOf(templateId);