You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/07/26 02:02:41 UTC

[1/2] git commit: updated refs/heads/4.2 to 11e001d

Updated Branches:
  refs/heads/4.2 0362b1b13 -> 11e001d75


CLOUDSTACK-3709: Add the missing file.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/11e001d7
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/11e001d7
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/11e001d7

Branch: refs/heads/4.2
Commit: 11e001d756cb8298efc2448f68e397d0f546431d
Parents: e23e6b0
Author: Min Chen <mi...@citrix.com>
Authored: Thu Jul 25 17:01:57 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Jul 25 17:02:30 2013 -0700

----------------------------------------------------------------------
 .../admin/storage/DeleteCacheStoreCmd.java      | 79 ++++++++++++++++++++
 1 file changed, 79 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/11e001d7/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java
new file mode 100644
index 0000000..01d3385
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java
@@ -0,0 +1,79 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.api.command.admin.storage;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.user.Account;
+
+@APICommand(name = "deleteCacheStore", description = "Deletes a cache store .", responseObject = SuccessResponse.class, since = "4.2.0")
+public class DeleteCacheStoreCmd extends BaseCmd {
+    public static final Logger s_logger = Logger.getLogger(DeleteCacheStoreCmd.class.getName());
+
+    private static final String s_name = "deletecachestoreresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class,
+ required = true, description = "the cache store ID")
+    private Long id;
+
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute() {
+        boolean result = _storageService.deleteCacheStore(this);
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete image store");
+        }
+    }
+}


[2/2] git commit: updated refs/heads/4.2 to 11e001d

Posted by mc...@apache.org.
CLOUDSTACK-3709:[Object_Store_Refactor][UI] Can't delete NFS Cache
storage through UI.  Fixed at API side.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e23e6b02
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e23e6b02
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e23e6b02

Branch: refs/heads/4.2
Commit: e23e6b02db66ac9927b5f2b0132d20a42686a980
Parents: 0362b1b
Author: Min Chen <mi...@citrix.com>
Authored: Thu Jul 25 17:00:46 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Jul 25 17:02:30 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/storage/StorageService.java   |   5 +-
 client/tomcatconf/commands.properties.in        |   1 +
 .../datastore/db/SnapshotDataStoreDao.java      |   6 +-
 .../datastore/db/TemplateDataStoreDao.java      |   4 +-
 .../datastore/db/VolumeDataStoreDao.java        |   4 +-
 .../image/db/SnapshotDataStoreDaoImpl.java      |  44 ++++++--
 .../image/db/TemplateDataStoreDaoImpl.java      |  35 ++++--
 .../image/db/VolumeDataStoreDaoImpl.java        |  33 ++++--
 .../com/cloud/server/ManagementServerImpl.java  | 106 ++++++++++---------
 .../com/cloud/storage/StorageManagerImpl.java   |  59 +++++++++--
 10 files changed, 207 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/api/src/com/cloud/storage/StorageService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java
index 869b296..7c5b0a7 100644
--- a/api/src/com/cloud/storage/StorageService.java
+++ b/api/src/com/cloud/storage/StorageService.java
@@ -22,6 +22,7 @@ import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
@@ -48,7 +49,7 @@ public interface StorageService{
      */
     StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException,
     UnknownHostException, ResourceUnavailableException;
-    
+
     ImageStore createCacheStore(CreateCacheStoreCmd cmd);
 
     /**
@@ -92,6 +93,8 @@ public interface StorageService{
 
     boolean deleteImageStore(DeleteImageStoreCmd cmd);
 
+    boolean deleteCacheStore(DeleteCacheStoreCmd cmd);
+
     ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index e801213..5451ed8 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -252,6 +252,7 @@ listImageStores=1
 deleteImageStore=1
 createCacheStore=1
 listCacheStores=1
+deleteCacheStore=1
 
 #### host commands
 addHost=3

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index d129fe7..f903715 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -26,11 +26,13 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
 
 public interface SnapshotDataStoreDao extends GenericDao<SnapshotDataStoreVO, Long>,
-        StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
+StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
 
     List<SnapshotDataStoreVO> listByStoreId(long id, DataStoreRole role);
 
-    void deletePrimaryRecordsForStore(long id);
+    List<SnapshotDataStoreVO> listActiveOnCache(long id);
+
+    void deletePrimaryRecordsForStore(long id, DataStoreRole role);
 
     SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId);
     SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index 13b84ff..9350751 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -28,12 +28,14 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
 
 public interface TemplateDataStoreDao extends GenericDao<TemplateDataStoreVO, Long>,
-        StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
+StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
 
     List<TemplateDataStoreVO> listByStoreId(long id);
 
     List<TemplateDataStoreVO> listDestroyed(long storeId);
 
+    List<TemplateDataStoreVO> listActiveOnCache(long id);
+
     void deletePrimaryRecordsForStore(long id);
 
     void deletePrimaryRecordsForTemplate(long templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
index 4152516..698465f 100644
--- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
+++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
@@ -25,10 +25,12 @@ import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
 
 public interface VolumeDataStoreDao extends GenericDao<VolumeDataStoreVO, Long>,
-        StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
+StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
 
     List<VolumeDataStoreVO> listByStoreId(long id);
 
+    List<VolumeDataStoreVO> listActiveOnCache(long id);
+
     void deletePrimaryRecordsForStore(long id);
 
     VolumeDataStoreVO findByVolume(long volumeId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index f5e7421..f33d51a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -48,12 +48,13 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     private SearchBuilder<SnapshotDataStoreVO> updateStateSearch;
     private SearchBuilder<SnapshotDataStoreVO> storeSearch;
     private SearchBuilder<SnapshotDataStoreVO> destroyedSearch;
+    private SearchBuilder<SnapshotDataStoreVO> cacheSearch;
     private SearchBuilder<SnapshotDataStoreVO> snapshotSearch;
     private SearchBuilder<SnapshotDataStoreVO> storeSnapshotSearch;
     private String parentSearch = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where store_id = ? " +
-                                    " and store_role = ? and volume_id = ? and state = 'Ready'" +
-                                    " order by created DESC " +
-                                    " limit 1";
+            " and store_role = ? and volume_id = ? and state = 'Ready'" +
+            " order by created DESC " +
+            " limit 1";
 
 
 
@@ -61,6 +62,9 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         super.configure(name, params);
 
+        // Note that snapshot_store_ref stores snapshots on primary as well as
+        // those on secondary, so we need to
+        // use (store_id, store_role) to search
         storeSearch = createSearchBuilder();
         storeSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
         storeSearch.and("store_role", storeSearch.entity().getRole(), SearchCriteria.Op.EQ);
@@ -72,6 +76,13 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
         destroyedSearch.and("state", destroyedSearch.entity().getState(), SearchCriteria.Op.EQ);
         destroyedSearch.done();
 
+        cacheSearch = createSearchBuilder();
+        cacheSearch.and("store_id", cacheSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
+        cacheSearch.and("store_role", cacheSearch.entity().getRole(), SearchCriteria.Op.EQ);
+        cacheSearch.and("state", cacheSearch.entity().getState(), SearchCriteria.Op.NEQ);
+        cacheSearch.and("ref_cnt", cacheSearch.entity().getRefCnt(), SearchCriteria.Op.NEQ);
+        cacheSearch.done();
+
         updateStateSearch = this.createSearchBuilder();
         updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ);
         updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ);
@@ -115,14 +126,14 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
             if (dbVol != null) {
                 StringBuilder str = new StringBuilder("Unable to update ").append(dataObj.toString());
                 str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState())
-                        .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
-                        .append(dbVol.getUpdated());
+                .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
+                .append(dbVol.getUpdated());
                 str.append(": New Data={id=").append(dataObj.getId()).append("; state=").append(nextState)
-                        .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
-                        .append("; updatedTime=").append(dataObj.getUpdated());
+                .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
+                .append("; updatedTime=").append(dataObj.getUpdated());
                 str.append(": stale Data={id=").append(dataObj.getId()).append("; state=").append(currentState)
-                        .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
-                        .append("; updatedTime=").append(oldUpdatedTime);
+                .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
+                .append("; updatedTime=").append(oldUpdatedTime);
             } else {
                 s_logger.debug("Unable to update objectIndatastore: id=" + dataObj.getId()
                         + ", as there is no such object exists in the database anymore");
@@ -140,9 +151,10 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     }
 
     @Override
-    public void deletePrimaryRecordsForStore(long id) {
+    public void deletePrimaryRecordsForStore(long id, DataStoreRole role) {
         SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
         sc.setParameters("store_id", id);
+        sc.setParameters("store_role", role);
         Transaction txn = Transaction.currentTxn();
         txn.start();
         remove(sc);
@@ -176,7 +188,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
                 return this.findByStoreSnapshot(role, sid, snid);
             }
         } catch (SQLException e) {
-           s_logger.debug("Failed to find parent snapshot: " + e.toString());
+            s_logger.debug("Failed to find parent snapshot: " + e.toString());
         } finally {
             txn.close();
         }
@@ -199,4 +211,14 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
         sc.setParameters("state", ObjectInDataStoreStateMachine.State.Destroyed);
         return listBy(sc);
     }
+
+    @Override
+    public List<SnapshotDataStoreVO> listActiveOnCache(long id) {
+        SearchCriteria<SnapshotDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", id);
+        sc.setParameters("store_role", DataStoreRole.ImageCache);
+        sc.setParameters("state", ObjectInDataStoreStateMachine.State.Destroyed);
+        sc.setParameters("ref_cnt", 0);
+        return listBy(sc);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 362f7a6..7388ca9 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -51,6 +51,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     private static final Logger s_logger = Logger.getLogger(TemplateDataStoreDaoImpl.class);
     private SearchBuilder<TemplateDataStoreVO> updateStateSearch;
     private SearchBuilder<TemplateDataStoreVO> storeSearch;
+    private SearchBuilder<TemplateDataStoreVO> cacheSearch;
     private SearchBuilder<TemplateDataStoreVO> templateSearch;
     private SearchBuilder<TemplateDataStoreVO> templateRoleSearch;
     private SearchBuilder<TemplateDataStoreVO> storeTemplateSearch;
@@ -69,6 +70,12 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         storeSearch.and("destroyed", storeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
         storeSearch.done();
 
+        cacheSearch = createSearchBuilder();
+        cacheSearch.and("store_id", cacheSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
+        cacheSearch.and("destroyed", cacheSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+        cacheSearch.and("ref_cnt", cacheSearch.entity().getRefCnt(), SearchCriteria.Op.NEQ);
+        cacheSearch.done();
+
         templateSearch = createSearchBuilder();
         templateSearch.and("template_id", templateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
         templateSearch.and("destroyed", templateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
@@ -148,14 +155,14 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
             if (dbVol != null) {
                 StringBuilder str = new StringBuilder("Unable to update ").append(dataObj.toString());
                 str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState())
-                        .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
-                        .append(dbVol.getUpdated());
+                .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
+                .append(dbVol.getUpdated());
                 str.append(": New Data={id=").append(dataObj.getId()).append("; state=").append(nextState)
-                        .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
-                        .append("; updatedTime=").append(dataObj.getUpdated());
+                .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
+                .append("; updatedTime=").append(dataObj.getUpdated());
                 str.append(": stale Data={id=").append(dataObj.getId()).append("; state=").append(currentState)
-                        .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
-                        .append("; updatedTime=").append(oldUpdatedTime);
+                .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
+                .append("; updatedTime=").append(oldUpdatedTime);
             } else {
                 s_logger.debug("Unable to update objectIndatastore: id=" + dataObj.getId()
                         + ", as there is no such object exists in the database anymore");
@@ -180,6 +187,17 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         return listIncludingRemovedBy(sc);
     }
 
+
+    @Override
+    public List<TemplateDataStoreVO> listActiveOnCache(long id) {
+        SearchCriteria<TemplateDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", id);
+        sc.setParameters("destroyed", false);
+        sc.setParameters("ref_cnt", 0);
+        return listIncludingRemovedBy(sc);
+    }
+
+
     @Override
     public void deletePrimaryRecordsForStore(long id) {
         SearchCriteria<TemplateDataStoreVO> sc = storeSearch.create();
@@ -279,10 +297,11 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         sc.setParameters("store_id", storeId);
         sc.setParameters("template_id", templateId);
         sc.setParameters("destroyed", false);
-        if (!lock)
+        if (!lock) {
             return findOneIncludingRemovedBy(sc);
-        else
+        } else {
             return lockOneRandomRow(sc, true);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 5602072..04f8b70 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -43,6 +43,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
     private SearchBuilder<VolumeDataStoreVO> updateStateSearch;
     private SearchBuilder<VolumeDataStoreVO> volumeSearch;
     private SearchBuilder<VolumeDataStoreVO> storeSearch;
+    private SearchBuilder<VolumeDataStoreVO> cacheSearch;
     private SearchBuilder<VolumeDataStoreVO> storeVolumeSearch;
 
     @Override
@@ -54,6 +55,12 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
         storeSearch.and("destroyed", storeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
         storeSearch.done();
 
+        cacheSearch = createSearchBuilder();
+        cacheSearch.and("store_id", cacheSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
+        cacheSearch.and("destroyed", cacheSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+        cacheSearch.and("ref_cnt", cacheSearch.entity().getRefCnt(), SearchCriteria.Op.NEQ);
+        cacheSearch.done();
+
         volumeSearch = createSearchBuilder();
         volumeSearch.and("volume_id", volumeSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
         volumeSearch.and("destroyed", volumeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
@@ -99,14 +106,14 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
             if (dbVol != null) {
                 StringBuilder str = new StringBuilder("Unable to update ").append(dataObj.toString());
                 str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState())
-                        .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
-                        .append(dbVol.getUpdated());
+                .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=")
+                .append(dbVol.getUpdated());
                 str.append(": New Data={id=").append(dataObj.getId()).append("; state=").append(nextState)
-                        .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
-                        .append("; updatedTime=").append(dataObj.getUpdated());
+                .append("; event=").append(event).append("; updatecount=").append(dataObj.getUpdatedCount())
+                .append("; updatedTime=").append(dataObj.getUpdated());
                 str.append(": stale Data={id=").append(dataObj.getId()).append("; state=").append(currentState)
-                        .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
-                        .append("; updatedTime=").append(oldUpdatedTime);
+                .append("; event=").append(event).append("; updatecount=").append(oldUpdated)
+                .append("; updatedTime=").append(oldUpdatedTime);
             } else {
                 s_logger.debug("Unable to update objectIndatastore: id=" + dataObj.getId()
                         + ", as there is no such object exists in the database anymore");
@@ -124,6 +131,15 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
     }
 
     @Override
+    public List<VolumeDataStoreVO> listActiveOnCache(long id) {
+        SearchCriteria<VolumeDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", id);
+        sc.setParameters("destroyed", false);
+        sc.setParameters("ref_cnt", 0);
+        return listIncludingRemovedBy(sc);
+    }
+
+    @Override
     public void deletePrimaryRecordsForStore(long id) {
         SearchCriteria<VolumeDataStoreVO> sc = storeSearch.create();
         sc.setParameters("store_id", id);
@@ -156,10 +172,11 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
         sc.setParameters("store_id", storeId);
         sc.setParameters("volume_id", volumeId);
         sc.setParameters("destroyed", false);
-        if (!lock)
+        if (!lock) {
             return findOneIncludingRemovedBy(sc);
-        else
+        } else {
             return lockOneRandomRow(sc, true);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index f7fc834..e5e9c26 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -145,6 +145,7 @@ import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd;
 import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
 import org.apache.cloudstack.api.command.admin.storage.FindStoragePoolsForMigrationCmd;
@@ -725,15 +726,15 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     }
 
     public ManagementServerImpl() {
-    	setRunLevel(ComponentLifecycle.RUN_LEVEL_APPLICATION_MAINLOOP);
+        setRunLevel(ComponentLifecycle.RUN_LEVEL_APPLICATION_MAINLOOP);
     }
 
     public List<UserAuthenticator> getUserAuthenticators() {
-    	return _userAuthenticators;
+        return _userAuthenticators;
     }
 
     public void setUserAuthenticators(List<UserAuthenticator> authenticators) {
-    	_userAuthenticators = authenticators;
+        _userAuthenticators = authenticators;
     }
 
     public List<UserAuthenticator> getUserPasswordEncoders() {
@@ -745,18 +746,18 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     }
 
     public List<HostAllocator> getHostAllocators() {
-		return _hostAllocators;
-	}
+        return _hostAllocators;
+    }
 
-	public void setHostAllocators(List<HostAllocator> _hostAllocators) {
-		this._hostAllocators = _hostAllocators;
-	}
+    public void setHostAllocators(List<HostAllocator> _hostAllocators) {
+        this._hostAllocators = _hostAllocators;
+    }
 
-	@Override
-	public boolean configure(String name, Map<String, Object> params)
-			throws ConfigurationException {
+    @Override
+    public boolean configure(String name, Map<String, Object> params)
+            throws ConfigurationException {
 
-		_configs = _configDao.getConfiguration();
+        _configs = _configDao.getConfiguration();
 
         String value = _configs.get("event.purge.interval");
         int cleanup = NumbersUtil.parseInt(value, 60 * 60 * 24); // 1 day.
@@ -781,10 +782,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
             _availableIdsMap.put(id, true);
         }
 
-		return true;
-	}
+        return true;
+    }
 
-	@Override
+    @Override
     public boolean start() {
         s_logger.info("Startup CloudStack management server...");
 
@@ -886,7 +887,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
             return result;
         }
         for (EventVO event : events) {
-        _eventDao.remove(event.getId());
+            _eventDao.remove(event.getId());
         }
         return result;
     }
@@ -916,7 +917,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
     @Override
     public Pair<List<? extends Cluster>, Integer> searchForClusters(ListClustersCmd cmd) {
-    	Object id = cmd.getId();
+        Object id = cmd.getId();
         Object name = cmd.getClusterName();
         Object podId = cmd.getPodId();
         Long zoneId = cmd.getZoneId();
@@ -927,7 +928,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
 
 
-    	Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
+        Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
 
         SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();
         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
@@ -999,7 +1000,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
     @Override
     public Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>>
-            listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) {
+    listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) {
         // access check - only root admin can migrate VM
         Account caller = UserContext.current().getCaller();
         if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
@@ -1390,7 +1391,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
 
 
-    	Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
+        Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
         SearchBuilder<HostPodVO> sb = _hostPodDao.createSearchBuilder();
         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
         sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
@@ -1732,7 +1733,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
         return templateZonePairSet;
     }
-*/
+     */
 
     private VMTemplateVO updateTemplateOrIso(BaseUpdateTemplateOrIsoCmd cmd) {
         Long id = cmd.getId();
@@ -2782,6 +2783,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         cmdList.add(DeleteImageStoreCmd.class);
         cmdList.add(CreateCacheStoreCmd.class);
         cmdList.add(ListCacheStoresCmd.class);
+        cmdList.add(DeleteCacheStoreCmd.class);
         cmdList.add(CreateApplicationLoadBalancerCmd.class);
         cmdList.add(ListApplicationLoadBalancersCmd.class);
         cmdList.add(DeleteApplicationLoadBalancerCmd.class);
@@ -3203,8 +3205,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
             elasticLoadBalancerEnabled = elbEnabled == null ? false : Boolean.parseBoolean(elbEnabled);
             if (elasticLoadBalancerEnabled) {
                 String networkType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key());
-                if (networkType != null)
+                if (networkType != null) {
                     supportELB = networkType;
+                }
             }
         }
 
@@ -3310,10 +3313,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         String certificate = cmd.getCertificate();
         String key = cmd.getPrivateKey();
         try {
-            if (certificate != null)
+            if (certificate != null) {
                 certificate = URLDecoder.decode(certificate, "UTF-8");
-            if (key != null)
+            }
+            if (key != null) {
                 key = URLDecoder.decode(key, "UTF-8");
+            }
         } catch (UnsupportedEncodingException e) {
         } finally {
         }
@@ -3330,8 +3335,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
         _consoleProxyMgr.setManagementState(ConsoleProxyManagementState.ResetSuspending);
         List<SecondaryStorageVmVO> alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(null, State.Running, State.Migrating, State.Starting);
-        for (SecondaryStorageVmVO ssVmVm : alreadyRunning)
+        for (SecondaryStorageVmVO ssVmVm : alreadyRunning) {
             _secStorageVmMgr.rebootSecStorageVm(ssVmVm.getId());
+        }
         return "Certificate has been updated, we will stop all running console proxy VMs and secondary storage VMs to propagate the new certificate, please give a few minutes for console access service to be up again";
     }
 
@@ -3376,7 +3382,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         // give us the same key
         if (_hashKey == null) {
             _hashKey = _configDao.getValueAndInitIfNotExist(Config.HashKey.key(), Config.HashKey.getCategory(),
-            	getBase64EncodedRandomKey(128));
+                    getBase64EncodedRandomKey(128));
         }
         return _hashKey;
     }
@@ -3385,8 +3391,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     public String getEncryptionKey() {
         if (_encryptionKey == null) {
             _encryptionKey = _configDao.getValueAndInitIfNotExist(Config.EncryptionKey.key(),
-            	Config.EncryptionKey.getCategory(),
-            	getBase64EncodedRandomKey(128));
+                    Config.EncryptionKey.getCategory(),
+                    getBase64EncodedRandomKey(128));
         }
         return _encryptionKey;
     }
@@ -3395,8 +3401,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     public String getEncryptionIV() {
         if (_encryptionIV == null) {
             _encryptionIV = _configDao.getValueAndInitIfNotExist(Config.EncryptionIV.key(),
-            	Config.EncryptionIV.getCategory(),
-            	getBase64EncodedRandomKey(128));
+                    Config.EncryptionIV.getCategory(),
+                    getBase64EncodedRandomKey(128));
         }
         return _encryptionIV;
     }
@@ -3405,18 +3411,18 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     @DB
     public void resetEncryptionKeyIV() {
 
-    	SearchBuilder<ConfigurationVO> sb = _configDao.createSearchBuilder();
-    	sb.and("name1", sb.entity().getName(), SearchCriteria.Op.EQ);
-    	sb.or("name2", sb.entity().getName(), SearchCriteria.Op.EQ);
-    	sb.done();
+        SearchBuilder<ConfigurationVO> sb = _configDao.createSearchBuilder();
+        sb.and("name1", sb.entity().getName(), SearchCriteria.Op.EQ);
+        sb.or("name2", sb.entity().getName(), SearchCriteria.Op.EQ);
+        sb.done();
 
-    	SearchCriteria<ConfigurationVO> sc = sb.create();
-    	sc.setParameters("name1", Config.EncryptionKey.key());
-    	sc.setParameters("name2", Config.EncryptionIV.key());
+        SearchCriteria<ConfigurationVO> sc = sb.create();
+        sc.setParameters("name1", Config.EncryptionKey.key());
+        sc.setParameters("name2", Config.EncryptionIV.key());
 
-    	_configDao.expunge(sc);
-    	_encryptionKey = null;
-    	_encryptionIV = null;
+        _configDao.expunge(sc);
+        _encryptionKey = null;
+        _encryptionIV = null;
     }
 
     @Override
@@ -3425,16 +3431,16 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     }
 
     private static String getBase64EncodedRandomKey(int nBits) {
-		SecureRandom random;
-		try {
-			random = SecureRandom.getInstance("SHA1PRNG");
-	        byte[] keyBytes = new byte[nBits/8];
-	        random.nextBytes(keyBytes);
-	        return Base64.encodeBase64URLSafeString(keyBytes);
-		} catch (NoSuchAlgorithmException e) {
-			s_logger.error("Unhandled exception: ", e);
-		}
-		return null;
+        SecureRandom random;
+        try {
+            random = SecureRandom.getInstance("SHA1PRNG");
+            byte[] keyBytes = new byte[nBits/8];
+            random.nextBytes(keyBytes);
+            return Base64.encodeBase64URLSafeString(keyBytes);
+        } catch (NoSuchAlgorithmException e) {
+            s_logger.error("Unhandled exception: ", e);
+        }
+        return null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e23e6b02/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index 0c586ab..ba7409a 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -45,6 +45,7 @@ import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
@@ -400,7 +401,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
     @Override
     public StoragePool findStoragePool(DiskProfile dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, Long hostId, VMInstanceVO vm,
-                                       final Set<StoragePool> avoid) {
+            final Set<StoragePool> avoid) {
 
         VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
         for (StoragePoolAllocator allocator : _storagePoolAllocators) {
@@ -637,7 +638,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     @SuppressWarnings("rawtypes")
     public PrimaryDataStoreInfo createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, UnknownHostException,
-            ResourceUnavailableException {
+    ResourceUnavailableException {
         String providerName = cmd.getStorageProviderName();
         DataStoreProvider storeProvider = dataStoreProviderMgr.getDataStoreProvider(providerName);
 
@@ -1185,7 +1186,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     @DB
     public PrimaryDataStoreInfo preparePrimaryStorageForMaintenance(Long primaryStorageId) throws ResourceUnavailableException,
-            InsufficientCapacityException {
+    InsufficientCapacityException {
         Long userId = UserContext.current().getCallerUserId();
         User user = _userDao.findById(userId);
         Account account = UserContext.current().getCaller();
@@ -1279,8 +1280,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
                         // check if pool is in an inconsistent state
                         if (pool != null
                                 && (pool.getStatus().equals(StoragePoolStatus.ErrorInMaintenance)
-                                || pool.getStatus().equals(StoragePoolStatus.PrepareForMaintenance) || pool.getStatus().equals(
-                                StoragePoolStatus.CancelMaintenance))) {
+                                        || pool.getStatus().equals(StoragePoolStatus.PrepareForMaintenance) || pool.getStatus().equals(
+                                                StoragePoolStatus.CancelMaintenance))) {
                             _storagePoolWorkDao.removePendingJobsOnMsRestart(vo.getMsid(), poolId);
                             pool.setStatus(StoragePoolStatus.ErrorInMaintenance);
                             _storagePoolDao.update(poolId, pool);
@@ -1490,7 +1491,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
     @Override
     public boolean storagePoolHasEnoughIops(List<Volume> requestedVolumes,
-                                            StoragePool pool) {
+            StoragePool pool) {
         if (requestedVolumes == null || requestedVolumes.isEmpty() || pool == null) {
             return false;
         }
@@ -1528,7 +1529,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
     @Override
     public boolean storagePoolHasEnoughSpace(List<Volume> volumes,
-                                             StoragePool pool) {
+            StoragePool pool) {
         if (volumes == null || volumes.isEmpty()){
             return false;
         }
@@ -1771,7 +1772,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         // we are not actually deleting record from main
         // image_data_store table, so delete cascade will not work
         _imageStoreDetailsDao.deleteDetails(storeId);
-        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId);
+        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
         _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
         _templateStoreDao.deletePrimaryRecordsForStore(storeId);
         _imageStoreDao.remove(storeId);
@@ -1847,6 +1848,48 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.ImageCache);
     }
 
+    @Override
+    public boolean deleteCacheStore(DeleteCacheStoreCmd cmd) {
+        long storeId = cmd.getId();
+        User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
+        // Verify that cache store exists
+        ImageStoreVO store = _imageStoreDao.findById(storeId);
+        if (store == null) {
+            throw new InvalidParameterValueException("Cache store with id " + storeId + " doesn't exist");
+        }
+        _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), store.getDataCenterId());
+
+        // Verify that there are no live snapshot, template, volume on the cache
+        // store that is currently referenced
+        List<SnapshotDataStoreVO> snapshots = _snapshotStoreDao.listActiveOnCache(storeId);
+        if (snapshots != null && snapshots.size() > 0) {
+            throw new InvalidParameterValueException("Cannot delete cache store with staging snapshots currently in use!");
+        }
+        List<VolumeDataStoreVO> volumes = _volumeStoreDao.listActiveOnCache(storeId);
+        if (volumes != null && volumes.size() > 0) {
+            throw new InvalidParameterValueException("Cannot delete cache store with staging volumes currently in use!");
+        }
+
+        List<TemplateDataStoreVO> templates = this._templateStoreDao.listActiveOnCache(storeId);
+        if (templates != null && templates.size() > 0) {
+            throw new InvalidParameterValueException("Cannot delete cache store with staging templates currently in use!");
+        }
+
+        // ready to delete
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        // first delete from image_store_details table, we need to do that since
+        // we are not actually deleting record from main
+        // image_data_store table, so delete cascade will not work
+        _imageStoreDetailsDao.deleteDetails(storeId);
+        _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
+        _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+        _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+        _imageStoreDao.remove(storeId);
+        txn.commit();
+        return true;
+    }
+
     // get bytesReadRate from service_offering, disk_offering and vm.disk.throttling.bytes_read_rate
     @Override
     public Long getDiskBytesReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) {