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) {

Reply via email to