CLOUDSTACK-3144: [Automation] Deletion of templates failing. Fails to find image store housing template.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/87c401aa Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/87c401aa Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/87c401aa Branch: refs/heads/master Commit: 87c401aaafbe786bd699091779a5f2741ab03889 Parents: 2c31f38 Author: Min Chen <[email protected]> Authored: Fri Jun 28 17:35:19 2013 -0700 Committer: Min Chen <[email protected]> Committed: Fri Jun 28 17:57:42 2013 -0700 ---------------------------------------------------------------------- .../cloud/storage/dao/VMTemplateDaoImpl.java | 17 +- .../template/HypervisorTemplateAdapter.java | 318 ++++++++++--------- 2 files changed, 169 insertions(+), 166 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/87c401aa/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index ad33e7a..9e75990 100755 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -28,8 +28,6 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent; -import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -56,9 +54,7 @@ import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; -import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.UpdateBuilder; import com.cloud.utils.exception.CloudRuntimeException; @Component @@ -102,7 +98,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem private SearchBuilder<VMTemplateVO> PublicIsoSearch; private SearchBuilder<VMTemplateVO> UserIsoSearch; private GenericSearchBuilder<VMTemplateVO, Long> CountTemplatesByAccount; - // private SearchBuilder<VMTemplateVO> updateStateSearch; + // private SearchBuilder<VMTemplateVO> updateStateSearch; @Inject ResourceTagDao _tagsDao; @@ -344,6 +340,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem AccountIdSearch = createSearchBuilder(); AccountIdSearch.and("accountId", AccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ); AccountIdSearch.and("publicTemplate", AccountIdSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); + AccountIdSearch.and("removed", AccountIdSearch.entity().getRemoved(), SearchCriteria.Op.NULL); // only list not removed templates for this account AccountIdSearch.done(); SearchBuilder<VMTemplateZoneVO> tmpltZoneSearch = _templateZoneDao.createSearchBuilder(); @@ -369,11 +366,11 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem CountTemplatesByAccount.and("removed", CountTemplatesByAccount.entity().getRemoved(), SearchCriteria.Op.NULL); CountTemplatesByAccount.done(); -// updateStateSearch = this.createSearchBuilder(); -// updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); -// updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); -// updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); -// updateStateSearch.done(); + // updateStateSearch = this.createSearchBuilder(); + // updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); + // updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); + // updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); + // updateStateSearch.done(); return result; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/87c401aa/server/src/com/cloud/template/HypervisorTemplateAdapter.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 569d947..da8c1c4 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -41,8 +41,8 @@ import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcConext; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; -import org.apache.log4j.Logger; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -54,14 +54,13 @@ import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; -import com.cloud.host.HostVO; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.TemplateProfile; -import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.download.DownloadMonitor; import com.cloud.user.Account; @@ -71,9 +70,9 @@ import com.cloud.utils.exception.CloudRuntimeException; @Local(value=TemplateAdapter.class) public class HypervisorTemplateAdapter extends TemplateAdapterBase { - private final static Logger s_logger = Logger.getLogger(HypervisorTemplateAdapter.class); - @Inject DownloadMonitor _downloadMonitor; - @Inject AgentManager _agentMgr; + private final static Logger s_logger = Logger.getLogger(HypervisorTemplateAdapter.class); + @Inject DownloadMonitor _downloadMonitor; + @Inject AgentManager _agentMgr; @Inject DataStoreManager storeMgr; @Inject TemplateService imageService; @@ -90,92 +89,92 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } - @Override - public TemplateProfile prepare(RegisterIsoCmd cmd) throws ResourceAllocationException { - TemplateProfile profile = super.prepare(cmd); - String url = profile.getUrl(); + @Override + public TemplateProfile prepare(RegisterIsoCmd cmd) throws ResourceAllocationException { + TemplateProfile profile = super.prepare(cmd); + String url = profile.getUrl(); + + if((!url.toLowerCase().endsWith("iso"))&&(!url.toLowerCase().endsWith("iso.zip"))&&(!url.toLowerCase().endsWith("iso.bz2")) + &&(!url.toLowerCase().endsWith("iso.gz"))){ + throw new InvalidParameterValueException("Please specify a valid iso"); + } + + UriUtils.validateUrl(url); + profile.setUrl(url); + // Check that the resource limit for secondary storage won't be exceeded + _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(cmd.getEntityOwnerId()), + ResourceType.secondary_storage, UriUtils.getRemoteSize(url)); + return profile; + } + + @Override + public TemplateProfile prepare(RegisterTemplateCmd cmd) throws ResourceAllocationException { + TemplateProfile profile = super.prepare(cmd); + String url = profile.getUrl(); + + if((!url.toLowerCase().endsWith("vhd"))&&(!url.toLowerCase().endsWith("vhd.zip")) + &&(!url.toLowerCase().endsWith("vhd.bz2"))&&(!url.toLowerCase().endsWith("vhd.gz")) + &&(!url.toLowerCase().endsWith("qcow2"))&&(!url.toLowerCase().endsWith("qcow2.zip")) + &&(!url.toLowerCase().endsWith("qcow2.bz2"))&&(!url.toLowerCase().endsWith("qcow2.gz")) + &&(!url.toLowerCase().endsWith("ova"))&&(!url.toLowerCase().endsWith("ova.zip")) + &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz")) + &&(!url.toLowerCase().endsWith("tar"))&&(!url.toLowerCase().endsWith("tar.zip")) + &&(!url.toLowerCase().endsWith("tar.bz2"))&&(!url.toLowerCase().endsWith("tar.gz")) + &&(!url.toLowerCase().endsWith("img"))&&(!url.toLowerCase().endsWith("raw"))){ + throw new InvalidParameterValueException("Please specify a valid "+ cmd.getFormat().toLowerCase()); + } + + if ((cmd.getFormat().equalsIgnoreCase("vhd") && (!url.toLowerCase().endsWith("vhd") && !url.toLowerCase().endsWith("vhd.zip") && !url.toLowerCase().endsWith("vhd.bz2") && !url.toLowerCase().endsWith("vhd.gz") )) + || (cmd.getFormat().equalsIgnoreCase("qcow2") && (!url.toLowerCase().endsWith("qcow2") && !url.toLowerCase().endsWith("qcow2.zip") && !url.toLowerCase().endsWith("qcow2.bz2") && !url.toLowerCase().endsWith("qcow2.gz") )) + || (cmd.getFormat().equalsIgnoreCase("ova") && (!url.toLowerCase().endsWith("ova") && !url.toLowerCase().endsWith("ova.zip") && !url.toLowerCase().endsWith("ova.bz2") && !url.toLowerCase().endsWith("ova.gz"))) + || (cmd.getFormat().equalsIgnoreCase("tar") && (!url.toLowerCase().endsWith("tar") && !url.toLowerCase().endsWith("tar.zip") && !url.toLowerCase().endsWith("tar.bz2") && !url.toLowerCase().endsWith("tar.gz"))) + || (cmd.getFormat().equalsIgnoreCase("raw") && (!url.toLowerCase().endsWith("img") && !url.toLowerCase().endsWith("raw")))) { + throw new InvalidParameterValueException("Please specify a valid URL. URL:" + url + " is an invalid for the format " + cmd.getFormat().toLowerCase()); + } + + UriUtils.validateUrl(url); + profile.setUrl(url); + // Check that the resource limit for secondary storage won't be exceeded + _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(cmd.getEntityOwnerId()), + ResourceType.secondary_storage, UriUtils.getRemoteSize(url)); + return profile; + } + + @Override + public VMTemplateVO create(TemplateProfile profile) { + // persist entry in vm_template, vm_template_details and template_zone_ref tables, not that entry at template_store_ref is not created here, and created in createTemplateAsync. + VMTemplateVO template = persistTemplate(profile); - if((!url.toLowerCase().endsWith("iso"))&&(!url.toLowerCase().endsWith("iso.zip"))&&(!url.toLowerCase().endsWith("iso.bz2")) - &&(!url.toLowerCase().endsWith("iso.gz"))){ - throw new InvalidParameterValueException("Please specify a valid iso"); + if (template == null) { + throw new CloudRuntimeException("Unable to persist the template " + profile.getTemplate()); } - UriUtils.validateUrl(url); - profile.setUrl(url); - // Check that the resource limit for secondary storage won't be exceeded - _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(cmd.getEntityOwnerId()), - ResourceType.secondary_storage, UriUtils.getRemoteSize(url)); - return profile; - } - - @Override - public TemplateProfile prepare(RegisterTemplateCmd cmd) throws ResourceAllocationException { - TemplateProfile profile = super.prepare(cmd); - String url = profile.getUrl(); - - if((!url.toLowerCase().endsWith("vhd"))&&(!url.toLowerCase().endsWith("vhd.zip")) - &&(!url.toLowerCase().endsWith("vhd.bz2"))&&(!url.toLowerCase().endsWith("vhd.gz")) - &&(!url.toLowerCase().endsWith("qcow2"))&&(!url.toLowerCase().endsWith("qcow2.zip")) - &&(!url.toLowerCase().endsWith("qcow2.bz2"))&&(!url.toLowerCase().endsWith("qcow2.gz")) - &&(!url.toLowerCase().endsWith("ova"))&&(!url.toLowerCase().endsWith("ova.zip")) - &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz")) - &&(!url.toLowerCase().endsWith("tar"))&&(!url.toLowerCase().endsWith("tar.zip")) - &&(!url.toLowerCase().endsWith("tar.bz2"))&&(!url.toLowerCase().endsWith("tar.gz")) - &&(!url.toLowerCase().endsWith("img"))&&(!url.toLowerCase().endsWith("raw"))){ - throw new InvalidParameterValueException("Please specify a valid "+ cmd.getFormat().toLowerCase()); - } - - if ((cmd.getFormat().equalsIgnoreCase("vhd") && (!url.toLowerCase().endsWith("vhd") && !url.toLowerCase().endsWith("vhd.zip") && !url.toLowerCase().endsWith("vhd.bz2") && !url.toLowerCase().endsWith("vhd.gz") )) - || (cmd.getFormat().equalsIgnoreCase("qcow2") && (!url.toLowerCase().endsWith("qcow2") && !url.toLowerCase().endsWith("qcow2.zip") && !url.toLowerCase().endsWith("qcow2.bz2") && !url.toLowerCase().endsWith("qcow2.gz") )) - || (cmd.getFormat().equalsIgnoreCase("ova") && (!url.toLowerCase().endsWith("ova") && !url.toLowerCase().endsWith("ova.zip") && !url.toLowerCase().endsWith("ova.bz2") && !url.toLowerCase().endsWith("ova.gz"))) - || (cmd.getFormat().equalsIgnoreCase("tar") && (!url.toLowerCase().endsWith("tar") && !url.toLowerCase().endsWith("tar.zip") && !url.toLowerCase().endsWith("tar.bz2") && !url.toLowerCase().endsWith("tar.gz"))) - || (cmd.getFormat().equalsIgnoreCase("raw") && (!url.toLowerCase().endsWith("img") && !url.toLowerCase().endsWith("raw")))) { - throw new InvalidParameterValueException("Please specify a valid URL. URL:" + url + " is an invalid for the format " + cmd.getFormat().toLowerCase()); - } - - UriUtils.validateUrl(url); - profile.setUrl(url); - // Check that the resource limit for secondary storage won't be exceeded - _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(cmd.getEntityOwnerId()), - ResourceType.secondary_storage, UriUtils.getRemoteSize(url)); - return profile; - } - - @Override - public VMTemplateVO create(TemplateProfile profile) { - // persist entry in vm_template, vm_template_details and template_zone_ref tables, not that entry at template_store_ref is not created here, and created in createTemplateAsync. - VMTemplateVO template = persistTemplate(profile); - - if (template == null) { - throw new CloudRuntimeException("Unable to persist the template " + profile.getTemplate()); - } - - // find all eligible image stores for this zone scope - List<DataStore> imageStores = this.storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId())); - if ( imageStores == null || imageStores.size() == 0 ){ - throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); - } + // find all eligible image stores for this zone scope + List<DataStore> imageStores = this.storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId())); + if ( imageStores == null || imageStores.size() == 0 ){ + throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); + } for (DataStore imageStore : imageStores) { - TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); - CreateTemplateContext<TemplateApiResult> context = new CreateTemplateContext<TemplateApiResult>(null, tmpl); - AsyncCallbackDispatcher<HypervisorTemplateAdapter, TemplateApiResult> caller = AsyncCallbackDispatcher.create(this); - caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null)); - caller.setContext(context); - this.imageService - .createTemplateAsync(tmpl, imageStore, caller); + TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); + CreateTemplateContext<TemplateApiResult> context = new CreateTemplateContext<TemplateApiResult>(null, tmpl); + AsyncCallbackDispatcher<HypervisorTemplateAdapter, TemplateApiResult> caller = AsyncCallbackDispatcher.create(this); + caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null)); + caller.setContext(context); + this.imageService + .createTemplateAsync(tmpl, imageStore, caller); } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); return template; } - private class CreateTemplateContext<T> extends AsyncRpcConext<T> { - final TemplateInfo template; - public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateInfo template) { - super(callback); - this.template = template; - } - } + private class CreateTemplateContext<T> extends AsyncRpcConext<T> { + final TemplateInfo template; + public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateInfo template) { + super(callback); + this.template = template; + } + } protected Void createTemplateAsyncCallBack(AsyncCallbackDispatcher<HypervisorTemplateAdapter, TemplateApiResult> callback, CreateTemplateContext<TemplateApiResult> context) { @@ -193,73 +192,80 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } } - return null; - } + return null; + } - @Override @DB - public boolean delete(TemplateProfile profile) { - boolean success = true; + @Override @DB + public boolean delete(TemplateProfile profile) { + boolean success = true; - VMTemplateVO template = profile.getTemplate(); + VMTemplateVO template = profile.getTemplate(); // find all eligible image stores for this template List<DataStore> imageStores = this.templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId()); - if ( imageStores == null || imageStores.size() == 0 ){ - throw new CloudRuntimeException("Unable to find image store to delete template "+ profile.getTemplate()); - } - - // Make sure the template is downloaded to all found image stores - for (DataStore store : imageStores) { - long storeId = store.getId(); - List<TemplateDataStoreVO> templateStores = _tmpltStoreDao.listByTemplateStore(template.getId(), storeId); - for (TemplateDataStoreVO templateStore : templateStores) { - if (templateStore.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) { - String errorMsg = "Please specify a template that is not currently being downloaded."; - s_logger.debug("Template: " + template.getName() + " is currently being downloaded to secondary storage host: " + store.getName() + "; cant' delete it."); - throw new CloudRuntimeException(errorMsg); + if (imageStores == null || imageStores.size() == 0) { + // already destroyed on image stores + s_logger.info("Unable to find image store still having template: " + template.getName() + + ", so just mark the template removed"); + } else { + // Make sure the template is downloaded to all found image stores + for (DataStore store : imageStores) { + long storeId = store.getId(); + List<TemplateDataStoreVO> templateStores = _tmpltStoreDao + .listByTemplateStore(template.getId(), storeId); + for (TemplateDataStoreVO templateStore : templateStores) { + if (templateStore.getDownloadState() == Status.DOWNLOAD_IN_PROGRESS) { + String errorMsg = "Please specify a template that is not currently being downloaded."; + s_logger.debug("Template: " + template.getName() + + " is currently being downloaded to secondary storage host: " + store.getName() + + "; cant' delete it."); + throw new CloudRuntimeException(errorMsg); + } } } - } - String eventType = ""; - if (template.getFormat().equals(ImageFormat.ISO)) { - eventType = EventTypes.EVENT_ISO_DELETE; - } else { - eventType = EventTypes.EVENT_TEMPLATE_DELETE; - } - - for (DataStore imageStore : imageStores) { - // publish zone-wide usage event - Long sZoneId = ((ImageStoreEntity)imageStore).getDataCenterId(); - if (sZoneId != null) { - UsageEventUtils.publishUsageEvent(eventType, template.getAccountId(), sZoneId, template.getId(), null, null, null); + String eventType = ""; + if (template.getFormat().equals(ImageFormat.ISO)) { + eventType = EventTypes.EVENT_ISO_DELETE; + } else { + eventType = EventTypes.EVENT_TEMPLATE_DELETE; } - s_logger.info("Delete template from image store: " + imageStore.getName()); - AsyncCallFuture<TemplateApiResult> future = this.imageService - .deleteTemplateAsync(this.imageFactory.getTemplate(template.getId(), imageStore)); - try { - TemplateApiResult result = future.get(); - success = result.isSuccess(); - if ( !success ) - break; - - // remove from template_zone_ref - List<VMTemplateZoneVO> templateZones = templateZoneDao.listByZoneTemplate(sZoneId, template.getId()); - if (templateZones != null) { - for (VMTemplateZoneVO templateZone : templateZones) { - templateZoneDao.remove(templateZone.getId()); + for (DataStore imageStore : imageStores) { + // publish zone-wide usage event + Long sZoneId = ((ImageStoreEntity) imageStore).getDataCenterId(); + if (sZoneId != null) { + UsageEventUtils.publishUsageEvent(eventType, template.getAccountId(), sZoneId, template.getId(), + null, null, null); + } + + s_logger.info("Delete template from image store: " + imageStore.getName()); + AsyncCallFuture<TemplateApiResult> future = this.imageService.deleteTemplateAsync(this.imageFactory + .getTemplate(template.getId(), imageStore)); + try { + TemplateApiResult result = future.get(); + success = result.isSuccess(); + if (!success) { + break; + } + + // remove from template_zone_ref + List<VMTemplateZoneVO> templateZones = templateZoneDao + .listByZoneTemplate(sZoneId, template.getId()); + if (templateZones != null) { + for (VMTemplateZoneVO templateZone : templateZones) { + templateZoneDao.remove(templateZone.getId()); + } } + } catch (InterruptedException e) { + s_logger.debug("delete template Failed", e); + throw new CloudRuntimeException("delete template Failed", e); + } catch (ExecutionException e) { + s_logger.debug("delete template Failed", e); + throw new CloudRuntimeException("delete template Failed", e); } - } catch (InterruptedException e) { - s_logger.debug("delete template Failed", e); - throw new CloudRuntimeException("delete template Failed", e); - } catch (ExecutionException e) { - s_logger.debug("delete template Failed", e); - throw new CloudRuntimeException("delete template Failed", e); } } - if (success) { s_logger.info("Delete template from template table"); // remove template from vm_templates table @@ -275,36 +281,36 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { return success; - } + } - @Override + @Override public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) { - TemplateProfile profile = super.prepareDelete(cmd); - VMTemplateVO template = profile.getTemplate(); - Long zoneId = profile.getZoneId(); + TemplateProfile profile = super.prepareDelete(cmd); + VMTemplateVO template = profile.getTemplate(); + Long zoneId = profile.getZoneId(); - if (template.getTemplateType() == TemplateType.SYSTEM) { - throw new InvalidParameterValueException("The DomR template cannot be deleted."); - } + if (template.getTemplateType() == TemplateType.SYSTEM) { + throw new InvalidParameterValueException("The DomR template cannot be deleted."); + } - if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); - } + if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); + } - return profile; - } + return profile; + } - @Override + @Override public TemplateProfile prepareDelete(DeleteIsoCmd cmd) { - TemplateProfile profile = super.prepareDelete(cmd); - Long zoneId = profile.getZoneId(); + TemplateProfile profile = super.prepareDelete(cmd); + Long zoneId = profile.getZoneId(); - if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); - } + if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); + } - return profile; - } + return profile; + } @Override public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd extractcmd) {
