From 8aa765ac39be2afd839d17710d8ce4e8d0650e7c Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 11 Mar 2021 13:15:40 +0530 Subject: [PATCH] server: delete template on storage over capacity threshold (#4691) * server: delete template on storage over capacity threshold While deleting template for a specific zone, check should be done only for writable secondary storages and not for storages with available capacity threshold. Signed-off-by: Abhishek Kumar * fix for ISOs and refactor Signed-off-by: Abhishek Kumar * remove writable store check Signed-off-by: Abhishek Kumar * fix exception message Signed-off-by: Abhishek Kumar --- .../template/HypervisorTemplateAdapter.java | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java index 055d48febed..6cfe6148112 100644 --- a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java @@ -25,12 +25,6 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; -import com.cloud.configuration.Config; -import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao; -import com.cloud.storage.dao.VMTemplateDetailsDao; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.db.TransactionStatus; import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer; import org.apache.cloudstack.agent.directdownload.CheckUrlCommand; import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd; @@ -61,14 +55,17 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.utils.security.DigestHelper; +import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.alert.AlertManager; +import com.cloud.configuration.Config; import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao; import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; @@ -86,6 +83,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateDetailsDao; import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.download.DownloadMonitor; import com.cloud.template.VirtualMachineTemplate.State; @@ -94,6 +92,9 @@ import com.cloud.utils.Pair; import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; public class HypervisorTemplateAdapter extends TemplateAdapterBase { @@ -157,6 +158,12 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { return ans.getTemplateSize(); } + private void checkZoneImageStores(final List zoneIdList) { + if (zoneIdList != null && CollectionUtils.isEmpty(storeMgr.getImageStoresByScope(new ZoneScope(zoneIdList.get(0))))) { + throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); + } + } + @Override public TemplateProfile prepare(RegisterIsoCmd cmd) throws ResourceAllocationException { TemplateProfile profile = super.prepare(cmd); @@ -613,29 +620,17 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) { TemplateProfile profile = super.prepareDelete(cmd); VMTemplateVO template = profile.getTemplate(); - List zoneIdList = profile.getZoneIdList(); - if (template.getTemplateType() == TemplateType.SYSTEM) { throw new InvalidParameterValueException("The DomR template cannot be deleted."); } - - if (zoneIdList != null && (storeMgr.getImageStoreWithFreeCapacity(zoneIdList.get(0)) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); - } - + checkZoneImageStores(profile.getZoneIdList()); return profile; } @Override public TemplateProfile prepareDelete(DeleteIsoCmd cmd) { TemplateProfile profile = super.prepareDelete(cmd); - List zoneIdList = profile.getZoneIdList(); - - if (zoneIdList != null && - (storeMgr.getImageStoreWithFreeCapacity(zoneIdList.get(0)) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); - } - + checkZoneImageStores(profile.getZoneIdList()); return profile; } }