mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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>
This commit is contained in:
parent
a1942b4e8e
commit
d717d8a4cd
@ -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<DataCenterVO> 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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user