From ccbcb08fbf406b2f2684b618cfdae9c4010e13cf Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 24 Feb 2021 16:30:32 +0530 Subject: [PATCH] server: Increase leniency to list templates on secondary stores that have been marked deleted by updating the db (#4713) This PR aims at restoring the previous level of leniency in listing templates on stores that have been marked as deleted / removed by updating the DB. While Cloudstack doesn't allow deleting stores that have resources on them, it may so happen that users may mimic a deletion of a store by merely updating the DB. Under such a case, listing of templates is hampered due to an NPE that is caused. (as seen in #4606) Co-authored-by: Pearl Dsilva --- .../com/cloud/api/query/dao/TemplateJoinDaoImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java index c4a02a73ad2..a9a971cb341 100644 --- a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@ -30,6 +30,7 @@ import com.cloud.deployasis.DeployAsIsConstants; import com.cloud.deployasis.TemplateDeployAsIsDetailVO; import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.utils.security.DigestHelper; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -161,10 +162,13 @@ public class TemplateJoinDaoImpl extends GenericDaoBaseWithTagInformation downloadDetailInImageStores = null; for (TemplateDataStoreVO templateInStore : templatesInStore) { downloadDetailInImageStores = new HashMap<>(); - downloadDetailInImageStores.put("datastore", dataStoreDao.findById(templateInStore.getDataStoreId()).getName()); - downloadDetailInImageStores.put("downloadPercent", Integer.toString(templateInStore.getDownloadPercent())); - downloadDetailInImageStores.put("downloadState", (templateInStore.getDownloadState() != null ? templateInStore.getDownloadState().toString() : "")); - downloadProgressDetails.add(downloadDetailInImageStores); + ImageStoreVO datastore = dataStoreDao.findById(templateInStore.getDataStoreId()); + if (datastore != null) { + downloadDetailInImageStores.put("datastore", datastore.getName()); + downloadDetailInImageStores.put("downloadPercent", Integer.toString(templateInStore.getDownloadPercent())); + downloadDetailInImageStores.put("downloadState", (templateInStore.getDownloadState() != null ? templateInStore.getDownloadState().toString() : "")); + downloadProgressDetails.add(downloadDetailInImageStores); + } } TemplateResponse templateResponse = new TemplateResponse();