From 418d1285e5c25df608bdd71cbee79acdc8ecd1fa Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Fri, 29 Oct 2021 19:41:43 +0530 Subject: [PATCH 1/3] 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 --- .../upgrade/SystemVmTemplateRegistration.java | 25 +++++++++++++------ 1 file changed, 17 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 0616537a60b4..b93e17e8e556 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; @@ -435,7 +436,7 @@ private List fetchAllHypervisors(Long zoneId) { 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 +459,16 @@ private Long createTemplateObjectInDB(SystemVMTemplateDetails details) { 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 void createCrossZonesTemplateZoneRefEntries(VMTemplateVO template, SystemVMTemplateDetails details) { + List dcs = dataCenterDao.listAll(); + for (DataCenterVO dc : dcs) { + if (vmTemplateDao.addTemplateToZone(template, dc.getId()) < 1) { + throw new CloudRuntimeException(String.format("Failed to create template_zone_ref record for the systemVM template for hypervisor: %s and zone: %s", details.getHypervisorType().name(), dc)); + } } - return template.getId(); } private void createTemplateStoreRefEntry(SystemVMTemplateDetails details) { @@ -585,10 +592,12 @@ private Long performTemplateRegistrationOperations(Pair Date: Mon, 1 Nov 2021 13:25:57 +0530 Subject: [PATCH 2/3] fix for template-zone entry create Signed-off-by: Abhishek Kumar --- .../upgrade/SystemVmTemplateRegistration.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 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 b93e17e8e556..a40e99f50829 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -27,14 +27,18 @@ 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; @@ -105,6 +109,8 @@ public class SystemVmTemplateRegistration { @Inject VMTemplateDao vmTemplateDao; @Inject + VMTemplateZoneDao vmTemplateZoneDao; + @Inject TemplateDataStoreDao templateDataStoreDao; @Inject VMInstanceDao vmInstanceDao; @@ -118,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(); @@ -462,11 +469,27 @@ private VMTemplateVO createTemplateObjectInDB(SystemVMTemplateDetails details) { return template; } - private void createCrossZonesTemplateZoneRefEntries(VMTemplateVO template, SystemVMTemplateDetails details) { + 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.setRemoved(GenericDaoBase.DATE_TO_NULL); + 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) { - if (vmTemplateDao.addTemplateToZone(template, dc.getId()) < 1) { - throw new CloudRuntimeException(String.format("Failed to create template_zone_ref record for the systemVM template for hypervisor: %s and zone: %s", details.getHypervisorType().name(), dc)); + 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)); } } } @@ -597,7 +620,7 @@ private Long performTemplateRegistrationOperations(Pair Date: Mon, 1 Nov 2021 17:42:18 +0530 Subject: [PATCH 3/3] change Signed-off-by: Abhishek Kumar --- .../java/com/cloud/upgrade/SystemVmTemplateRegistration.java | 1 - 1 file changed, 1 deletion(-) 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 a40e99f50829..057ddc5b09c6 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java @@ -475,7 +475,6 @@ private VMTemplateZoneVO createOrUpdateTemplateZoneEntry(long zoneId, long templ templateZoneVO = new VMTemplateZoneVO(zoneId, templateId, new java.util.Date()); templateZoneVO = vmTemplateZoneDao.persist(templateZoneVO); } else { - templateZoneVO.setRemoved(GenericDaoBase.DATE_TO_NULL); templateZoneVO.setLastUpdated(new java.util.Date()); if (vmTemplateZoneDao.update(templateZoneVO.getId(), templateZoneVO)) { templateZoneVO = null;