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/10/26 06:18:44 UTC

[1/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Updated Branches:
  refs/heads/object_store_migration [created] 9da56fe1f


Add PrepareSecondaryStorageForMigrationCmd for preparing migration
of existing NFS secondary storage to object store like S3.

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

Branch: refs/heads/object_store_migration
Commit: 6935dd2888531e39d8e8c09c1467f7dabea72a36
Parents: ec3302a
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 18 18:26:46 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 18 18:26:46 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/event/EventTypes.java         |   3 +
 api/src/com/cloud/storage/StorageService.java   |  16 ++-
 .../cloudstack/api/ApiCommandJobType.java       |   1 +
 .../PrepareSecondaryStorageForMigrationCmd.java | 109 +++++++++++++++++++
 client/tomcatconf/commands.properties.in        |   1 +
 .../api/storage/DataStoreLifeCycle.java         |   2 +
 .../datastore/db/SnapshotDataStoreDao.java      |   2 +
 .../datastore/db/SnapshotDataStoreVO.java       |  36 +++---
 .../datastore/db/TemplateDataStoreDao.java      |   4 +-
 .../datastore/db/TemplateDataStoreVO.java       |  53 ++++-----
 .../datastore/db/VolumeDataStoreDao.java        |   2 +
 .../storage/datastore/db/VolumeDataStoreVO.java |  49 +++++----
 .../image/datastore/ImageStoreHelper.java       |  16 ++-
 .../image/db/SnapshotDataStoreDaoImpl.java      |  39 ++++++-
 .../image/db/TemplateDataStoreDaoImpl.java      |  31 ++++++
 .../image/db/VolumeDataStoreDaoImpl.java        |  33 +++++-
 .../SimulatorImageStoreLifeCycleImpl.java       |  36 ++++--
 .../CloudStackImageStoreLifeCycleImpl.java      |   9 ++
 .../lifecycle/S3ImageStoreLifeCycleImpl.java    |  12 +-
 .../SampleImageStoreLifeCycleImpl.java          |   9 ++
 .../lifecycle/SwiftImageStoreLifeCycleImpl.java |  30 +++--
 ...CloudStackPrimaryDataStoreLifeCycleImpl.java |  17 ++-
 .../SamplePrimaryDataStoreLifeCycleImpl.java    |  34 ++++--
 .../SolidFirePrimaryDataStoreLifeCycle.java     |  15 ++-
 .../com/cloud/server/ManagementServerImpl.java  |   9 +-
 .../com/cloud/storage/StorageManagerImpl.java   |  32 ++++++
 tools/apidoc/gen_toc.py                         |   1 +
 27 files changed, 488 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index a762606..2825077 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -448,6 +448,9 @@ public class EventTypes {
 
     public static final String EVENT_UCS_ASSOCIATED_PROFILE = "UCS.ASSOCIATEPROFILE";
 
+    // Object store migration
+    public static final String EVENT_MIGRATE_PREPARE_SECONDARY_STORAGE = "MIGRATE.PREPARE.SS";
+
     static {
 
         // TODO: need a way to force author adding event types to declare the entity details as well, with out braking

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 1ae1d3a..cbbc1f3 100644
--- a/api/src/com/cloud/storage/StorageService.java
+++ b/api/src/com/cloud/storage/StorageService.java
@@ -22,9 +22,9 @@ 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.CreateSecondaryStagingStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
-import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd;
 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.DeleteSecondaryStagingStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
 
 import com.cloud.exception.DiscoveryException;
@@ -97,4 +97,18 @@ public interface StorageService{
 
     ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
 
+    /**
+     * Prepare NFS secondary storage for object store migration
+     *
+     * @param cmd
+     *            - the command specifying secondaryStorageId
+     * @return the storage pool
+     * @throws ResourceUnavailableException
+     *             TODO
+     * @throws InsufficientCapacityException
+     *             TODO
+     */
+    public ImageStore prepareSecondaryStorageForObjectStoreMigration(Long storeId) throws ResourceUnavailableException,
+            InsufficientCapacityException;
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiCommandJobType.java b/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
index 204fe3e..3067af8 100644
--- a/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
+++ b/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
@@ -28,6 +28,7 @@ public enum ApiCommandJobType {
     SystemVm,
     Host,
     StoragePool,
+    ImageStore,
     IpAddress,
     PortableIpAddress,
     SecurityGroup,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
new file mode 100644
index 0000000..d0c995a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/PrepareSecondaryStorageForMigrationCmd.java
@@ -0,0 +1,109 @@
+// 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.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.storage.ImageStore;
+import com.cloud.user.Account;
+
+@APICommand(name = "prepareSecondaryStorageForMigration", description = "Prepare a NFS secondary storage to migrate to use object store like S3", responseObject = ImageStoreResponse.class)
+public class PrepareSecondaryStorageForMigrationCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(PrepareSecondaryStorageForMigrationCmd.class.getName());
+    private static final String s_name = "preparesecondarystorageformigrationresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class,
+            required = true, description = "Secondary image store ID")
+    private Long id;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public ApiCommandJobType getInstanceType() {
+        return ApiCommandJobType.ImageStore;
+    }
+
+    @Override
+    public Long getInstanceId() {
+        return getId();
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        Account account = CallContext.current().getCallingAccount();
+        if (account != null) {
+            return account.getId();
+        }
+
+        return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_MIGRATE_PREPARE_SECONDARY_STORAGE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "preparing secondary storage: " + getId() + " for object store migration";
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException{
+        ImageStore result = _storageService.prepareSecondaryStorageForObjectStoreMigration(getId());
+        if (result != null){
+            ImageStoreResponse response = _responseGenerator.createImageStoreResponse(result);
+            response.setResponseName(getCommandName());
+            response.setResponseName("secondarystorage");
+            setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to prepare secondary storage for object store migration");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index 96e841a..f5a8a71 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -255,6 +255,7 @@ deleteImageStore=1
 createSecondaryStagingStore=1
 listSecondaryStagingStores=1
 deleteSecondaryStagingStore=1
+prepareSecondaryStorageForMigration=1
 
 #### host commands
 addHost=3

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
index 1e893db..c881570 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
@@ -37,4 +37,6 @@ public interface DataStoreLifeCycle {
     boolean cancelMaintain(DataStore store);
 
     boolean deleteDataStore(DataStore store);
+
+    boolean migrateToObjectStore(DataStore store);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index e350a76..df74c17 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -41,4 +41,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
 
     List<SnapshotDataStoreVO> listDestroyed(long storeId);
     List<SnapshotDataStoreVO> findBySnapshotId(long snapshotId);
+
+    void duplicateCacheRecordsOnRegionStore(long storeId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 0fe5e08..98fb7b1 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -34,7 +34,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 
 import com.cloud.storage.DataStoreRole;
-import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.fsm.StateObject;
 
@@ -60,7 +59,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     private long snapshotId;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private Date created = null;
+    private final Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)
@@ -98,6 +97,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     @Column(name = "volume_id")
     Long volumeId;
 
+    @Override
     public String getInstallPath() {
         return installPath;
     }
@@ -108,7 +108,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     }
 
     public void setDataStoreId(long storeId) {
-        this.dataStoreId = storeId;
+        dataStoreId = storeId;
     }
 
     public long getSnapshotId() {
@@ -135,15 +135,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         lastUpdated = date;
     }
 
+    @Override
     public void setInstallPath(String installPath) {
         this.installPath = installPath;
     }
 
     public SnapshotDataStoreVO(long hostId, long snapshotId) {
         super();
-        this.dataStoreId = hostId;
+        dataStoreId = hostId;
         this.snapshotId = snapshotId;
-        this.state = ObjectInDataStoreStateMachine.State.Allocated;
+        state = ObjectInDataStoreStateMachine.State.Allocated;
     }
 
     public SnapshotDataStoreVO() {
@@ -158,14 +159,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         return jobId;
     }
 
+    @Override
     public boolean equals(Object obj) {
         if (obj instanceof SnapshotDataStoreVO) {
             SnapshotDataStoreVO other = (SnapshotDataStoreVO) obj;
-            return (this.snapshotId == other.getSnapshotId() && this.dataStoreId == other.getDataStoreId());
+            return (snapshotId == other.getSnapshotId() && dataStoreId == other.getDataStoreId());
         }
         return false;
     }
 
+    @Override
     public int hashCode() {
         Long tid = new Long(snapshotId);
         Long hid = new Long(dataStoreId);
@@ -192,21 +195,22 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         return -1;
     }
 
+    @Override
     public String toString() {
         return new StringBuilder("SnapshotDataStore[").append(id).append("-").append(snapshotId).append("-")
                 .append(dataStoreId).append(installPath).append("]").toString();
     }
 
     public long getUpdatedCount() {
-        return this.updatedCount;
+        return updatedCount;
     }
 
     public void incrUpdatedCount() {
-        this.updatedCount++;
+        updatedCount++;
     }
 
     public void decrUpdatedCount() {
-        this.updatedCount--;
+        updatedCount--;
     }
 
     public Date getUpdated() {
@@ -216,7 +220,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     @Override
     public ObjectInDataStoreStateMachine.State getState() {
         // TODO Auto-generated method stub
-        return this.state;
+        return state;
     }
 
     public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -225,7 +229,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
 
     @Override
     public long getObjectId() {
-        return this.getSnapshotId();
+        return getSnapshotId();
     }
 
     public DataStoreRole getRole() {
@@ -238,7 +242,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
 
     @Override
     public State getObjectInStoreState() {
-        return this.state;
+        return state;
     }
 
     public long getParentSnapshotId() {
@@ -253,12 +257,16 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         return refCnt;
     }
 
+    public void setRefCnt(Long refCnt) {
+        this.refCnt = refCnt;
+    }
+
     public void incrRefCnt() {
-        this.refCnt++;
+        refCnt++;
     }
 
     public void decrRefCnt() {
-        this.refCnt--;
+        refCnt--;
     }
 
     public Long getVolumeId() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index 9350751..ba569c1 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -18,9 +18,9 @@ package org.apache.cloudstack.storage.datastore.db;
 
 import java.util.List;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
@@ -62,4 +62,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
     TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role);
 
     List<TemplateDataStoreVO> listByTemplate(long templateId);
+
+    void duplicateCacheRecordsOnRegionStore(long storeId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
index a890e4b..7d0a967 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
@@ -35,7 +35,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreState
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.fsm.StateObject;
 
@@ -61,7 +60,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     private DataStoreRole dataStoreRole;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private Date created = null;
+    private final Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)
@@ -117,17 +116,17 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
 
     public TemplateDataStoreVO(Long hostId, long templateId) {
         super();
-        this.dataStoreId = hostId;
+        dataStoreId = hostId;
         this.templateId = templateId;
-        this.state = ObjectInDataStoreStateMachine.State.Allocated;
-        this.refCnt = 0L;
+        state = ObjectInDataStoreStateMachine.State.Allocated;
+        refCnt = 0L;
     }
 
     public TemplateDataStoreVO(Long hostId, long templateId, Date lastUpdated, int downloadPercent,
             Status downloadState, String localDownloadPath, String errorString, String jobId, String installPath,
             String downloadUrl) {
         super();
-        this.dataStoreId = hostId;
+        dataStoreId = hostId;
         this.templateId = templateId;
         this.lastUpdated = lastUpdated;
         this.downloadPercent = downloadPercent;
@@ -135,33 +134,33 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         this.localDownloadPath = localDownloadPath;
         this.errorString = errorString;
         this.jobId = jobId;
-        this.refCnt = 0L;
+        refCnt = 0L;
         this.installPath = installPath;
-        this.setDownloadUrl(downloadUrl);
+        setDownloadUrl(downloadUrl);
         switch (downloadState) {
         case DOWNLOADED:
-            this.state = ObjectInDataStoreStateMachine.State.Ready;
+            state = ObjectInDataStoreStateMachine.State.Ready;
             break;
         case CREATING:
         case DOWNLOAD_IN_PROGRESS:
         case UPLOAD_IN_PROGRESS:
-            this.state = ObjectInDataStoreStateMachine.State.Creating2;
+            state = ObjectInDataStoreStateMachine.State.Creating2;
             break;
         case DOWNLOAD_ERROR:
         case UPLOAD_ERROR:
-            this.state = ObjectInDataStoreStateMachine.State.Failed;
+            state = ObjectInDataStoreStateMachine.State.Failed;
             break;
         case ABANDONED:
-            this.state = ObjectInDataStoreStateMachine.State.Destroyed;
+            state = ObjectInDataStoreStateMachine.State.Destroyed;
             break;
         default:
-            this.state = ObjectInDataStoreStateMachine.State.Allocated;
+            state = ObjectInDataStoreStateMachine.State.Allocated;
             break;
         }
     }
 
     public TemplateDataStoreVO() {
-        this.refCnt = 0L;
+        refCnt = 0L;
     }
 
     @Override
@@ -175,7 +174,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     }
 
     public void setDataStoreId(long storeId) {
-        this.dataStoreId = storeId;
+        dataStoreId = storeId;
     }
 
     public long getTemplateId() {
@@ -224,7 +223,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     }
 
     public void setLocalDownloadPath(String localPath) {
-        this.localDownloadPath = localPath;
+        localDownloadPath = localPath;
     }
 
     public String getLocalDownloadPath() {
@@ -251,7 +250,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     public boolean equals(Object obj) {
         if (obj instanceof TemplateDataStoreVO) {
             TemplateDataStoreVO other = (TemplateDataStoreVO) obj;
-            return (this.templateId == other.getTemplateId() && this.dataStoreId == other.getDataStoreId());
+            return (templateId == other.getTemplateId() && dataStoreId == other.getDataStoreId());
         }
         return false;
     }
@@ -316,7 +315,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     @Override
     public ObjectInDataStoreStateMachine.State getState() {
         // TODO Auto-generated method stub
-        return this.state;
+        return state;
     }
 
     public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -324,15 +323,15 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     }
 
     public long getUpdatedCount() {
-        return this.updatedCount;
+        return updatedCount;
     }
 
     public void incrUpdatedCount() {
-        this.updatedCount++;
+        updatedCount++;
     }
 
     public void decrUpdatedCount() {
-        this.updatedCount--;
+        updatedCount--;
     }
 
     public Date getUpdated() {
@@ -341,12 +340,12 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
 
     @Override
     public long getObjectId() {
-        return this.getTemplateId();
+        return getTemplateId();
     }
 
     @Override
     public State getObjectInStoreState() {
-        return this.state;
+        return state;
     }
 
     public DataStoreRole getDataStoreRole() {
@@ -361,12 +360,16 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
         return refCnt;
     }
 
+    public void setRefCnt(Long refCnt) {
+        this.refCnt = refCnt;
+    }
+
     public void incrRefCnt() {
-        this.refCnt++;
+        refCnt++;
     }
 
     public void decrRefCnt() {
-        this.refCnt--;
+        refCnt--;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
index 698465f..00a6d2a 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
@@ -40,4 +40,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
     VolumeDataStoreVO findByStoreVolume(long storeId, long volumeId, boolean lock);
 
     List<VolumeDataStoreVO> listDestroyed(long storeId);
+
+    void duplicateCacheRecordsOnRegionStore(long storeId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
index e11071b..6f3ccae 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
@@ -33,8 +33,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 
-import com.cloud.storage.Storage;
-import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.fsm.StateObject;
@@ -60,7 +58,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
     private long zoneId;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private Date created = null;
+    private final Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)
@@ -117,6 +115,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
     @Column(name = "ref_cnt")
     Long refCnt = 0L;
 
+    @Override
     public String getInstallPath() {
         return installPath;
     }
@@ -127,7 +126,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
     }
 
     public void setDataStoreId(long storeId) {
-        this.dataStoreId = storeId;
+        dataStoreId = storeId;
     }
 
     public long getVolumeId() {
@@ -174,6 +173,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
         lastUpdated = date;
     }
 
+    @Override
     public void setInstallPath(String installPath) {
         this.installPath = installPath;
     }
@@ -192,17 +192,17 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
 
     public VolumeDataStoreVO(long hostId, long volumeId) {
         super();
-        this.dataStoreId = hostId;
+        dataStoreId = hostId;
         this.volumeId = volumeId;
-        this.state = ObjectInDataStoreStateMachine.State.Allocated;
-        this.refCnt = 0L;
+        state = ObjectInDataStoreStateMachine.State.Allocated;
+        refCnt = 0L;
     }
 
     public VolumeDataStoreVO(long hostId, long volumeId, Date lastUpdated, int downloadPercent, Status downloadState,
             String localDownloadPath, String errorString, String jobId, String installPath, String downloadUrl,
             String checksum) {
         // super();
-        this.dataStoreId = hostId;
+        dataStoreId = hostId;
         this.volumeId = volumeId;
         // this.zoneId = zoneId;
         this.lastUpdated = lastUpdated;
@@ -212,17 +212,17 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
         this.errorString = errorString;
         this.jobId = jobId;
         this.installPath = installPath;
-        this.setDownloadUrl(downloadUrl);
+        setDownloadUrl(downloadUrl);
         this.checksum = checksum;
-        this.refCnt = 0L;
+        refCnt = 0L;
     }
 
     public VolumeDataStoreVO() {
-        this.refCnt = 0L;
+        refCnt = 0L;
     }
 
     public void setLocalDownloadPath(String localPath) {
-        this.localDownloadPath = localPath;
+        localDownloadPath = localPath;
     }
 
     public String getLocalDownloadPath() {
@@ -245,14 +245,16 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
         return jobId;
     }
 
+    @Override
     public boolean equals(Object obj) {
         if (obj instanceof VolumeDataStoreVO) {
             VolumeDataStoreVO other = (VolumeDataStoreVO) obj;
-            return (this.volumeId == other.getVolumeId() && this.dataStoreId == other.getDataStoreId());
+            return (volumeId == other.getVolumeId() && dataStoreId == other.getDataStoreId());
         }
         return false;
     }
 
+    @Override
     public int hashCode() {
         Long tid = new Long(volumeId);
         Long hid = new Long(dataStoreId);
@@ -295,21 +297,22 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
         return -1;
     }
 
+    @Override
     public String toString() {
         return new StringBuilder("VolumeDataStore[").append(id).append("-").append(volumeId).append("-").append(dataStoreId)
                 .append(installPath).append("]").toString();
     }
 
     public long getUpdatedCount() {
-        return this.updatedCount;
+        return updatedCount;
     }
 
     public void incrUpdatedCount() {
-        this.updatedCount++;
+        updatedCount++;
     }
 
     public void decrUpdatedCount() {
-        this.updatedCount--;
+        updatedCount--;
     }
 
     public Date getUpdated() {
@@ -319,7 +322,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
     @Override
     public ObjectInDataStoreStateMachine.State getState() {
         // TODO Auto-generated method stub
-        return this.state;
+        return state;
     }
 
     public void setState(ObjectInDataStoreStateMachine.State state) {
@@ -328,24 +331,28 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
 
     @Override
     public long getObjectId() {
-        return this.getVolumeId();
+        return getVolumeId();
     }
 
     @Override
     public State getObjectInStoreState() {
-        return this.state;
+        return state;
     }
 
     public Long getRefCnt() {
         return refCnt;
     }
 
+    public void setRefCnt(Long refCnt) {
+        this.refCnt = refCnt;
+    }
+
     public void incrRefCnt() {
-        this.refCnt++;
+        refCnt++;
     }
 
     public void decrRefCnt() {
-        this.refCnt--;
+        refCnt--;
     }
 
     public String getExtractUrl() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
index a641146..4b202f5 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
@@ -24,11 +24,13 @@ import java.util.UUID;
 
 import javax.inject.Inject;
 
+import org.springframework.stereotype.Component;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.ScopeType;
@@ -115,4 +117,16 @@ public class ImageStoreHelper {
         imageStoreDao.remove(id);
         return true;
     }
+
+    /**
+     * Convert current NFS secondary storage to Staging store to be ready to migrate to S3 object store.
+     * @param store NFS image store.
+     * @return true if successful.
+     */
+    public boolean convertToStagingStore(DataStore store) {
+        ImageStoreVO nfsStore = imageStoreDao.findById(store.getId());
+        nfsStore.setRole(DataStoreRole.ImageCache);
+        imageStoreDao.update(store.getId(), nfsStore);
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 d828085..5a21ae2 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
@@ -25,23 +25,23 @@ import java.util.Map;
 
 import javax.naming.ConfigurationException;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
-import com.cloud.utils.db.DB;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
+import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.UpdateBuilder;
 
 @Component
@@ -54,7 +54,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     private SearchBuilder<SnapshotDataStoreVO> snapshotSearch;
     private SearchBuilder<SnapshotDataStoreVO> storeSnapshotSearch;
     private SearchBuilder<SnapshotDataStoreVO> snapshotIdSearch;
-    private String parentSearch = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where store_id = ? " +
+    private final 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";
@@ -195,7 +195,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
                 long sid = rs.getLong(1);
                 String rl = rs.getString(2);
                 long snid = rs.getLong(3);
-                return this.findByStoreSnapshot(role, sid, snid);
+                return findByStoreSnapshot(role, sid, snid);
             }
         } catch (SQLException e) {
             s_logger.debug("Failed to find parent snapshot: " + e.toString());
@@ -236,4 +236,31 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
         sc.setParameters("ref_cnt", 0);
         return listBy(sc);
     }
+
+    @Override
+    public void duplicateCacheRecordsOnRegionStore(long storeId) {
+        // find all records on image cache
+        SearchCriteria<SnapshotDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", storeId);
+        sc.setParameters("destroyed", false);
+        List<SnapshotDataStoreVO> snapshots = listBy(sc);
+        // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+        if (snapshots != null) {
+            for (SnapshotDataStoreVO snap : snapshots) {
+                SnapshotDataStoreVO ss = new SnapshotDataStoreVO();
+                ss.setSnapshotId(snap.getId());
+                ss.setDataStoreId(storeId);
+                ss.setRole(DataStoreRole.Image);
+                ss.setVolumeId(snap.getVolumeId());
+                ss.setParentSnapshotId(snap.getParentSnapshotId());
+                ss.setState(snap.getState());
+                ss.setSize(snap.getSize());
+                ss.setPhysicalSize(snap.getPhysicalSize());
+                ss.setRefCnt(snap.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+                persist(ss);
+            }
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 5f47de8..a102537 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
@@ -341,4 +341,35 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         return null;
     }
 
+    /**
+     * Duplicate all image cache store entries
+     */
+    @Override
+    public void duplicateCacheRecordsOnRegionStore(long storeId) {
+        // find all records on image cache
+        SearchCriteria<TemplateDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", storeId);
+        sc.setParameters("destroyed", false);
+        List<TemplateDataStoreVO> tmpls = listBy(sc);
+        // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+        if (tmpls != null) {
+            for (TemplateDataStoreVO tmpl : tmpls) {
+                TemplateDataStoreVO ts = new TemplateDataStoreVO();
+                ts.setTemplateId(tmpl.getTemplateId());
+                ts.setDataStoreId(storeId);
+                ts.setDataStoreRole(DataStoreRole.Image);
+                ts.setState(tmpl.getState());
+                ts.setDownloadPercent(tmpl.getDownloadPercent());
+                ts.setDownloadState(tmpl.getDownloadState());
+                ts.setSize(tmpl.getSize());
+                ts.setPhysicalSize(tmpl.getPhysicalSize());
+                ts.setErrorString(tmpl.getErrorString());
+                ts.setDownloadUrl(tmpl.getDownloadUrl());
+                ts.setRefCnt(tmpl.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+                persist(ts);
+            }
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 04f8b70..e2adb3e 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
@@ -22,19 +22,20 @@ import java.util.Map;
 
 import javax.naming.ConfigurationException;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.UpdateBuilder;
 
 @Component
@@ -186,4 +187,30 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
         sc.setParameters("destroyed", true);
         return listIncludingRemovedBy(sc);
     }
+
+    @Override
+    public void duplicateCacheRecordsOnRegionStore(long storeId) {
+        // find all records on image cache
+        SearchCriteria<VolumeDataStoreVO> sc = cacheSearch.create();
+        sc.setParameters("store_id", storeId);
+        sc.setParameters("destroyed", false);
+        List<VolumeDataStoreVO> vols = listBy(sc);
+        // create an entry for each record, but with empty install path since the content is not yet on region-wide store yet
+        if (vols != null) {
+            for (VolumeDataStoreVO vol : vols) {
+                VolumeDataStoreVO vs = new VolumeDataStoreVO();
+                vs.setVolumeId(vol.getId());
+                vs.setDataStoreId(storeId);
+                vs.setState(vol.getState());
+                vs.setDownloadPercent(vol.getDownloadPercent());
+                vs.setDownloadState(vol.getDownloadState());
+                vs.setSize(vol.getSize());
+                vs.setPhysicalSize(vol.getPhysicalSize());
+                vs.setErrorString(vol.getErrorString());
+                vs.setRefCnt(vol.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
+                persist(vs);
+            }
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
index beaa7a5..0964414 100644
--- a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
+++ b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/lifecycle/SimulatorImageStoreLifeCycleImpl.java
@@ -20,12 +20,15 @@
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
 
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
-import com.cloud.utils.UriUtils;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
@@ -34,13 +37,13 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
 import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
 
-import javax.inject.Inject;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
+import com.cloud.utils.UriUtils;
 
 public class SimulatorImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreLifeCycleImpl.class);
@@ -129,4 +132,13 @@ public class SimulatorImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     public boolean deleteDataStore(DataStore store) {
         return false;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
index ee6f47b..d644878 100644
--- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
@@ -161,4 +161,13 @@ public class CloudStackImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     public boolean deleteDataStore(DataStore store) {
         return false;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return imageStoreHelper.convertToStagingStore(store);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
index 249a4c6..de25830 100644
--- a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java
@@ -22,6 +22,8 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@@ -32,7 +34,6 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
 import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.StoragePoolInfo;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
@@ -131,4 +132,13 @@ public class S3ImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     public boolean deleteDataStore(DataStore store) {
         return false;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
index e4df6f5..b10b756 100644
--- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java
@@ -79,4 +79,13 @@ public class SampleImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     public boolean deleteDataStore(DataStore store) {
         return false;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
index 4256cc2..0a2b72c 100644
--- a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java
@@ -16,11 +16,13 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.resource.ResourceManager;
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.ScopeType;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
@@ -30,11 +32,12 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
 import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle;
-import org.apache.log4j.Logger;
 
-import javax.inject.Inject;
-import java.util.HashMap;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.resource.ResourceManager;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
 
 public class SwiftImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
 
@@ -113,4 +116,13 @@ public class SwiftImageStoreLifeCycleImpl implements ImageStoreLifeCycle {
     public boolean deleteDataStore(DataStore store) {
         return false;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
index 5e0dd95..d916d45 100644
--- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
@@ -433,7 +433,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
         List<HostVO> poolHosts = new ArrayList<HostVO>();
         for (HostVO host : hosts) {
             try {
-                this.storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
+                storageMgr.connectHostToSharedPool(host.getId(), dataStore.getId());
                 poolHosts.add(host);
             } catch (Exception e) {
                 s_logger.warn("Unable to establish a connection between " + host + " and " + dataStore, e);
@@ -444,20 +444,20 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
             primaryDataStoreDao.expunge(dataStore.getId());
             throw new CloudRuntimeException("Failed to create storage pool as it is not accessible to hosts.");
         }
-        this.dataStoreHelper.attachZone(dataStore, hypervisorType);
+        dataStoreHelper.attachZone(dataStore, hypervisorType);
         return true;
     }
 
     @Override
     public boolean maintain(DataStore dataStore) {
         storagePoolAutmation.maintain(dataStore);
-        this.dataStoreHelper.maintain(dataStore);
+        dataStoreHelper.maintain(dataStore);
         return true;
     }
 
     @Override
     public boolean cancelMaintain(DataStore store) {
-        this.dataStoreHelper.cancelMaintain(store);
+        dataStoreHelper.cancelMaintain(store);
         storagePoolAutmation.cancelMaintain(store);
         return true;
     }
@@ -513,4 +513,13 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore
         dataStoreHelper.attachHost(store, scope, existingInfo);
         return true;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
index 92538ad..6b5e431 100644
--- a/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SamplePrimaryDataStoreLifeCycleImpl.java
@@ -18,12 +18,18 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.StoragePoolStatus;
-import org.apache.cloudstack.engine.subsystem.api.storage.*;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
+import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
@@ -31,9 +37,11 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
 
-import javax.inject.Inject;
-import java.util.List;
-import java.util.Map;
+import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.StoragePoolStatus;
 
 public class SamplePrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle {
     @Inject
@@ -119,4 +127,12 @@ public class SamplePrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLife
         return false;
     }
 
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
index f1ac3b3..a16ebad 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/lifecycle/SolidFirePrimaryDataStoreLifeCycle.java
@@ -26,20 +26,20 @@ import javax.inject.Inject;
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
-import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters;
+import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
 import org.apache.cloudstack.storage.datastore.util.SolidFireUtil;
 import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
 
+import com.cloud.agent.api.StoragePoolInfo;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.agent.api.StoragePoolInfo;
-import com.cloud.storage.StoragePoolAutomation;
 import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.StoragePoolAutomation;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeCycle {
@@ -330,4 +330,13 @@ public class SolidFirePrimaryDataStoreLifeCycle implements PrimaryDataStoreLifeC
     public boolean deleteDataStore(DataStore store) {
         return dataStoreHelper.deletePrimaryDataStore(store);
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle#migrateToObjectStore(org.apache.cloudstack.engine.subsystem.api.storage.DataStore)
+     */
+    @Override
+    public boolean migrateToObjectStore(DataStore store) {
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 699f469..e3d4137 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -42,6 +42,9 @@ import javax.crypto.spec.SecretKeySpec;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
@@ -156,6 +159,7 @@ import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStore
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStorageProvidersCmd;
 import org.apache.cloudstack.api.command.admin.storage.PreparePrimaryStorageForMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.storage.PrepareSecondaryStorageForMigrationCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
 import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
 import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
@@ -436,8 +440,6 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.GetVncPortAnswer;
@@ -2830,6 +2832,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         cmdList.add(CreateSecondaryStagingStoreCmd.class);
         cmdList.add(ListSecondaryStagingStoresCmd.class);
         cmdList.add(DeleteSecondaryStagingStoreCmd.class);
+        cmdList.add(PrepareSecondaryStorageForMigrationCmd.class);
         cmdList.add(CreateApplicationLoadBalancerCmd.class);
         cmdList.add(ListApplicationLoadBalancersCmd.class);
         cmdList.add(DeleteApplicationLoadBalancerCmd.class);
@@ -3878,6 +3881,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
 
     @Inject
     public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
-        this._storagePoolAllocators = storagePoolAllocators;
+        _storagePoolAllocators = storagePoolAllocators;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/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 c046057..eaefcb2 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -43,6 +43,7 @@ import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
+
 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.CreateSecondaryStagingStoreCmd;
@@ -1243,6 +1244,26 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         return (PrimaryDataStoreInfo) dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
     }
 
+    @Override
+    @DB
+    public ImageStore prepareSecondaryStorageForObjectStoreMigration(Long storeId) throws ResourceUnavailableException, InsufficientCapacityException {
+        // Verify that image store exists
+        ImageStoreVO store = _imageStoreDao.findById(storeId);
+        if (store == null) {
+            throw new InvalidParameterValueException("Image store with id " + storeId + " doesn't exist");
+        } else if (!store.getProviderName().equals(DataStoreProvider.NFS_IMAGE)) {
+            throw new InvalidParameterValueException("We only support migrate NFS secondary storage to use object store!");
+        }
+        _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), store.getDataCenterId());
+
+        DataStoreProvider provider = dataStoreProviderMgr.getDataStoreProvider(store.getProviderName());
+        DataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle();
+        DataStore secStore = dataStoreMgr.getDataStore(storeId, DataStoreRole.Image);
+        lifeCycle.migrateToObjectStore(secStore);
+        // converted to an image cache store
+        return (ImageStore)_dataStoreMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+    }
+
     protected class StorageGarbageCollector extends ManagedContextRunnable {
 
         public StorageGarbageCollector() {
@@ -1718,9 +1739,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         // store
         associateCrosszoneTemplatesToZone(dcId);
 
+        // duplicate cache store records to region wide storage
+        if (scopeType == ScopeType.REGION) {
+            duplicateCacheStoreRecordsToRegionStore(store.getId());
+        }
+
         return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image);
     }
 
+    private void duplicateCacheStoreRecordsToRegionStore(long storeId) {
+        _templateStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+        _snapshotStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+        _volumeStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
+    }
+
     private void associateCrosszoneTemplatesToZone(Long zoneId) {
         VMTemplateZoneVO tmpltZone;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6935dd28/tools/apidoc/gen_toc.py
----------------------------------------------------------------------
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index 9c53a48..aa73b2a 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -148,6 +148,7 @@ known_categories = {
     'createSecondaryStagingStore': 'Image Store',
     'deleteSecondaryStagingStore': 'Image Store',
     'listSecondaryStagingStores': 'Image Store',
+    'prepareSecondaryStorageForMigration' : 'Image Store',
     'InternalLoadBalancer': 'Internal LB',
 	'DeploymentPlanners': 'Configuration',
     'PortableIp': 'Portable IP',


[4/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Delete cache entries of template, snapshot, and volume when
deleteTemplate, deleteSnapshot, deleteVolume are invoked.

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

Branch: refs/heads/object_store_migration
Commit: 730832d8fa5e75d7a30f990046ab3a004abda0fa
Parents: 184e539
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 14:05:05 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 14:05:05 2013 -0700

----------------------------------------------------------------------
 .../subsystem/api/storage/DataStoreManager.java |  3 ++
 .../api/storage/SnapshotDataFactory.java        |  4 +++
 .../api/storage/TemplateDataFactory.java        |  4 +++
 .../api/storage/VolumeDataFactory.java          |  4 +++
 .../storage/datastore/db/ImageStoreDao.java     |  2 ++
 .../datastore/db/SnapshotDataStoreDao.java      |  2 ++
 .../datastore/db/TemplateDataStoreDao.java      |  2 ++
 .../storage/image/TemplateDataFactoryImpl.java  | 16 ++++++++++
 .../manager/ImageStoreProviderManagerImpl.java  | 15 +++++++--
 .../snapshot/SnapshotDataFactoryImpl.java       | 22 +++++++++++--
 .../snapshot/XenserverSnapshotStrategy.java     | 31 ++++++++++++------
 .../storage/datastore/DataStoreManagerImpl.java |  5 +++
 .../datastore/ImageStoreProviderManager.java    |  2 ++
 .../storage/image/db/ImageStoreDaoImpl.java     | 10 +++++-
 .../image/db/SnapshotDataStoreDaoImpl.java      |  8 +++++
 .../image/db/TemplateDataStoreDaoImpl.java      |  8 +++++
 .../image/db/VolumeDataStoreDaoImpl.java        |  1 +
 .../storage/volume/VolumeDataFactoryImpl.java   | 33 +++++++++++++++++---
 .../com/cloud/storage/VolumeApiServiceImpl.java | 12 +++++--
 .../template/HypervisorTemplateAdapter.java     | 29 ++++++++++-------
 .../com/cloud/template/TemplateManagerImpl.java |  1 +
 21 files changed, 181 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
index 0884453..7fbec0a 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
@@ -19,6 +19,7 @@
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
 import java.util.List;
+
 import com.cloud.storage.DataStoreRole;
 
 public interface DataStoreManager {
@@ -37,4 +38,6 @@ public interface DataStoreManager {
     DataStore getImageCacheStore(long zoneId);
 
     List<DataStore> listImageStores();
+
+    List<DataStore> listImageCacheStores();
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
index 0b8d1f1..d5255f4 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import java.util.List;
+
 import com.cloud.storage.DataStoreRole;
 
 public interface SnapshotDataFactory {
@@ -26,4 +28,6 @@ public interface SnapshotDataFactory {
     SnapshotInfo getSnapshot(DataObject obj, DataStore store);
 
     SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role);
+
+    List<SnapshotInfo> listSnapshotOnCache(long snapshotId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
index 980ed31..801c442 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import java.util.List;
+
 import com.cloud.storage.DataStoreRole;
 
 public interface TemplateDataFactory {
@@ -30,4 +32,6 @@ public interface TemplateDataFactory {
     TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId);
 
     TemplateInfo getReadyTemplateOnCache(long templateId);
+
+    List<TemplateInfo> listTemplateOnCache(long templateId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
index 99e3b59..3de0b5b 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import java.util.List;
+
 import com.cloud.storage.DataStoreRole;
 
 public interface VolumeDataFactory {
@@ -28,4 +30,6 @@ public interface VolumeDataFactory {
     VolumeInfo getVolume(long volumeId, DataStoreRole storeRole);
 
     VolumeInfo getVolume(long volumeId);
+
+    List<VolumeInfo> listVolumeOnCache(long volumeId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
index f95e66c..d0f8fe8 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
@@ -36,4 +36,6 @@ public interface ImageStoreDao extends GenericDao<ImageStoreVO, Long> {
     List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
 
     List<ImageStoreVO> listImageStores();
+
+    List<ImageStoreVO> listImageCacheStores();
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index df74c17..19eac38 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -43,4 +43,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
     List<SnapshotDataStoreVO> findBySnapshotId(long snapshotId);
 
     void duplicateCacheRecordsOnRegionStore(long storeId);
+
+    List<SnapshotDataStoreVO> listOnCache(long snapshotId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index fc61be5..95cbdb6 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -66,4 +66,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
     void duplicateCacheRecordsOnRegionStore(long storeId);
 
     TemplateDataStoreVO findReadyOnCache(long templateId);
+
+    List<TemplateDataStoreVO> listOnCache(long templateId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
index fe1c62c..6369311 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
@@ -18,6 +18,9 @@
  */
 package org.apache.cloudstack.storage.image;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
@@ -127,4 +130,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
 
     }
 
+    @Override
+    public List<TemplateInfo> listTemplateOnCache(long templateId) {
+        List<TemplateDataStoreVO> cacheTmpls = templateStoreDao.listOnCache(templateId);
+        List<TemplateInfo> tmplObjs = new ArrayList<TemplateInfo>();
+        for (TemplateDataStoreVO cacheTmpl : cacheTmpls) {
+            long storeId = cacheTmpl.getDataStoreId();
+            DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+            TemplateInfo tmplObj = getTemplate(templateId, store);
+            tmplObjs.add(tmplObj);
+        }
+        return tmplObjs;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
index 64ef78f..0991860 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
@@ -26,6 +26,9 @@ import java.util.Map;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
@@ -37,8 +40,6 @@ import org.apache.cloudstack.storage.image.ImageStoreDriver;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
 import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.ScopeType;
 import com.cloud.storage.dao.VMTemplateDao;
@@ -95,6 +96,16 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
     }
 
     @Override
+    public List<DataStore> listImageCacheStores() {
+        List<ImageStoreVO> stores = dataStoreDao.listImageCacheStores();
+        List<DataStore> imageStores = new ArrayList<DataStore>();
+        for (ImageStoreVO store : stores) {
+            imageStores.add(getImageStore(store.getId()));
+        }
+        return imageStores;
+    }
+
+    @Override
     public List<DataStore> listImageStoresByScope(ZoneScope scope) {
         List<ImageStoreVO> stores = dataStoreDao.findByScope(scope);
         List<DataStore> imageStores = new ArrayList<DataStore>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
index aafdad0..6205fe4 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java
@@ -18,8 +18,13 @@
  */
 package org.apache.cloudstack.storage.snapshot;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.inject.Inject;
 
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -28,7 +33,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.SnapshotVO;
@@ -70,8 +74,22 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
         if (snapshotStore == null) {
             return null;
         }
-        DataStore store = this.storeMgr.getDataStore(snapshotStore.getDataStoreId(), role);
+        DataStore store = storeMgr.getDataStore(snapshotStore.getDataStoreId(), role);
         SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
         return so;
     }
+
+    @Override
+    public List<SnapshotInfo> listSnapshotOnCache(long snapshotId) {
+        List<SnapshotDataStoreVO> cacheSnapshots = snapshotStoreDao.listOnCache(snapshotId);
+        List<SnapshotInfo> snapObjs = new ArrayList<SnapshotInfo>();
+        for (SnapshotDataStoreVO cacheSnap : cacheSnapshots) {
+            long storeId = cacheSnap.getDataStoreId();
+            DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache);
+            SnapshotInfo tmplObj = getSnapshot(snapshotId, store);
+            snapObjs.add(tmplObj);
+        }
+        return snapObjs;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index 6a874d6..cf67aeb 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -16,8 +16,13 @@
 // under the License.
 package org.apache.cloudstack.storage.snapshot;
 
+import java.util.List;
+
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
@@ -33,8 +38,6 @@ import org.apache.cloudstack.storage.command.CreateObjectAnswer;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 import org.apache.cloudstack.storage.to.SnapshotObjectTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.storage.DataStoreRole;
@@ -74,7 +77,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
         if (parentSnapshot != null && snapshot.getPath().equalsIgnoreCase(parentSnapshot.getPath())) {
             s_logger.debug("backup an empty snapshot");
             // don't need to backup this snapshot
-            SnapshotDataStoreVO parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(
+            SnapshotDataStoreVO parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(
                     parentSnapshot.getId(), DataStoreRole.Image);
             if (parentSnapshotOnBackupStore != null && parentSnapshotOnBackupStore.getState() == State.Ready) {
                 DataStore store = dataStoreMgr.getDataStore(parentSnapshotOnBackupStore.getDataStoreId(),
@@ -96,7 +99,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
                     s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString());
                     throw new CloudRuntimeException(e.toString());
                 }
-                return this.snapshotDataFactory.getSnapshot(snapObj.getId(), store);
+                return snapshotDataFactory.getSnapshot(snapObj.getId(), store);
             } else {
                 s_logger.debug("parent snapshot hasn't been backed up yet");
             }
@@ -114,7 +117,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
             int i;
             SnapshotDataStoreVO parentSnapshotOnBackupStore = null;
             for (i = 1; i < deltaSnap; i++) {
-                parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(parentSnapshot.getId(),
+                parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(parentSnapshot.getId(),
                         DataStoreRole.Image);
                 if (parentSnapshotOnBackupStore == null) {
                     break;
@@ -125,7 +128,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
                     break;
                 }
 
-                parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image);
+                parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image);
             }
             if (i >= deltaSnap) {
                 fullBackup = true;
@@ -133,7 +136,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
         }
 
         snapshot.addPayload(fullBackup);
-        return this.snapshotSvr.backupSnapshot(snapshot);
+        return snapshotSvr.backupSnapshot(snapshot);
     }
 
     protected boolean deleteSnapshotChain(SnapshotInfo snapshot) {
@@ -167,7 +170,15 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
                     }
                 }
                 if (!deleted) {
-                    boolean r = this.snapshotSvr.deleteSnapshot(snapshot);
+                    boolean r = snapshotSvr.deleteSnapshot(snapshot);
+                    if (r) {
+                        // delete snapshot in cache if there is
+                        List<SnapshotInfo> cacheSnaps = snapshotDataFactory.listSnapshotOnCache(snapshot.getId());
+                        for (SnapshotInfo cacheSnap : cacheSnaps) {
+                            s_logger.debug("Delete snapshot " + snapshot.getId() + " from image cache store: " + cacheSnap.getDataStore().getName());
+                            cacheSnap.delete();
+                        }
+                    }
                     if (!resultIsSet) {
                         result = r;
                         resultIsSet = true;
@@ -203,7 +214,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
         // first mark the snapshot as destroyed, so that ui can't see it, but we
         // may not destroy the snapshot on the storage, as other snapshots may
         // depend on it.
-        SnapshotInfo snapshotOnImage = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
+        SnapshotInfo snapshotOnImage = snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
         if (snapshotOnImage == null) {
             s_logger.debug("Can't find snapshot on backup storage, delete it in db");
             snapshotDao.remove(snapshotId);
@@ -276,7 +287,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
             snapshot = result.getSnashot();
             DataStore primaryStore = snapshot.getDataStore();
 
-            SnapshotInfo backupedSnapshot = this.backupSnapshot(snapshot);
+            SnapshotInfo backupedSnapshot = backupSnapshot(snapshot);
 
             try {
                 SnapshotInfo parent = snapshot.getParent();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
index a9263a9..88061aa 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
@@ -107,6 +107,11 @@ public class DataStoreManagerImpl implements DataStoreManager {
         return imageDataStoreMgr.listImageStores();
     }
 
+    @Override
+    public List<DataStore> listImageCacheStores() {
+        return imageDataStoreMgr.listImageCacheStores();
+    }
+
     public void setPrimaryStoreMgr(PrimaryDataStoreProviderManager primaryStoreMgr) {
         this.primaryStoreMgr = primaryStoreMgr;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
index be66cc5..8afb3d9 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
@@ -32,6 +32,8 @@ public interface ImageStoreProviderManager {
 
     List<DataStore> listImageStores();
 
+    List<DataStore> listImageCacheStores();
+
     List<DataStore> listImageStoresByScope(ZoneScope scope);
 
     List<DataStore> listImageStoreByProvider(String provider);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
index b9ef9c3..13a7f47 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java
@@ -23,10 +23,11 @@ import java.util.Map;
 
 import javax.naming.ConfigurationException;
 
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.ScopeType;
@@ -118,4 +119,11 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
         return listBy(sc);
     }
 
+    @Override
+    public List<ImageStoreVO> listImageCacheStores() {
+        SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
+        sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.ImageCache);
+        return listBy(sc);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/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 5a21ae2..96a0c17 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
@@ -263,4 +263,12 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
 
     }
 
+    @Override
+    public List<SnapshotDataStoreVO> listOnCache(long snapshotId) {
+        SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
+        sc.setParameters("snapshot_id", snapshotId);
+        sc.setParameters("store_role", DataStoreRole.ImageCache);
+        return search(sc, null);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/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 25f3486..5c1ec33 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
@@ -335,6 +335,14 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     }
 
     @Override
+    public List<TemplateDataStoreVO> listOnCache(long templateId) {
+        SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
+        sc.setParameters("template_id", templateId);
+        sc.setParameters("store_role", DataStoreRole.ImageCache);
+        return search(sc, null);
+    }
+
+    @Override
     public List<TemplateDataStoreVO> listByTemplate(long templateId) {
         SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
         sc.setParameters("template_id", templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/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 e2adb3e..4118079 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 static final Logger s_logger = Logger.getLogger(VolumeDataStoreDaoImpl.class);
     private SearchBuilder<VolumeDataStoreVO> updateStateSearch;
     private SearchBuilder<VolumeDataStoreVO> volumeSearch;
+    private SearchBuilder<VolumeDataStoreVO> volumeRoleSearch;
     private SearchBuilder<VolumeDataStoreVO> storeSearch;
     private SearchBuilder<VolumeDataStoreVO> cacheSearch;
     private SearchBuilder<VolumeDataStoreVO> storeVolumeSearch;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
index 1d75ba1..8065f9c 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
@@ -18,8 +18,13 @@
  */
 package org.apache.cloudstack.storage.volume;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.inject.Inject;
 
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -27,7 +32,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VolumeVO;
@@ -58,13 +62,13 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
         if (storeRole == DataStoreRole.Image) {
             VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId);
             if (volumeStore != null) {
-                DataStore store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
+                DataStore store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
                 vol = VolumeObject.getVolumeObject(store, volumeVO);
             }
         } else {
             // Primary data store
             if (volumeVO.getPoolId() != null) {
-                DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
+                DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
                 vol = VolumeObject.getVolumeObject(store, volumeVO);
             }
         }
@@ -82,11 +86,11 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
             DataStore store = null;
             VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId);
             if (volumeStore != null) {
-                store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
+                store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
             }
             vol = VolumeObject.getVolumeObject(store, volumeVO);
         } else {
-            DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
+            DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary);
             vol = VolumeObject.getVolumeObject(store, volumeVO);
         }
         return vol;
@@ -99,4 +103,23 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory {
         return vol;
     }
 
+    @Override
+    public List<VolumeInfo> listVolumeOnCache(long volumeId) {
+        List<VolumeInfo> cacheVols = new ArrayList<VolumeInfo>();
+        // find all image cache stores for this zone scope
+        List<DataStore> cacheStores = storeMgr.listImageCacheStores();
+        if (cacheStores == null || cacheStores.size() == 0) {
+            return cacheVols;
+        }
+        for (DataStore store : cacheStores) {
+            // check if the volume is stored there
+            VolumeDataStoreVO volStore = volumeStoreDao.findByStoreVolume(store.getId(), volumeId);
+            if (volStore != null) {
+                VolumeInfo vol = getVolume(volumeId, store);
+                cacheVols.add(vol);
+            }
+        }
+        return cacheVols;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 00df333..12f0102 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
@@ -64,7 +66,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
@@ -945,6 +946,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
                 AsyncCallFuture<VolumeApiResult> future2 = volService.expungeVolumeAsync(volOnSecondary);
                 future2.get();
             }
+            // delete all cache entries for this volume
+            List<VolumeInfo> cacheVols = volFactory.listVolumeOnCache(volume.getId());
+            for (VolumeInfo volOnCache : cacheVols) {
+                s_logger.info("Delete volume from image cache store: " + volOnCache.getDataStore().getName());
+                volOnCache.delete();
+            }
+
         } catch (Exception e) {
             s_logger.warn("Failed to expunge volume:", e);
             return false;
@@ -1725,7 +1733,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
     @Inject
     public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
-        this._storagePoolAllocators = storagePoolAllocators;
+        _storagePoolAllocators = storagePoolAllocators;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/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 00e6222..b33a192 100755
--- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
 import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
@@ -44,7 +46,6 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.framework.async.AsyncRpcContext;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
-import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.alert.AlertManager;
@@ -56,11 +57,11 @@ import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.org.Grouping;
+import com.cloud.storage.ScopeType;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
 import com.cloud.storage.TemplateProfile;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import com.cloud.storage.ScopeType;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VMTemplateZoneVO;
 import com.cloud.storage.dao.VMTemplateZoneDao;
@@ -182,7 +183,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
         }
 
         // find all eligible image stores for this zone scope
-        List<DataStore> imageStores = this.storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId()));
+        List<DataStore> imageStores = 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());
         }
@@ -205,12 +206,12 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
                 }
             }
 
-            TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore);
+            TemplateInfo tmpl = 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);
+            imageService.createTemplateAsync(tmpl, imageStore, caller);
             if( !(profile.getIsPublic() || profile.getFeatured()) ){  // If private template then break
                 break;
             }
@@ -237,7 +238,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
             // populated template entry
             _tmpltDao.remove(template.getId());
         } else {
-            VMTemplateVO tmplt = this._tmpltDao.findById(template.getId());
+            VMTemplateVO tmplt = _tmpltDao.findById(template.getId());
             long accountId = tmplt.getAccountId();
             if (template.getSize() != null) {
                 // publish usage event
@@ -283,7 +284,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
         VMTemplateVO template = profile.getTemplate();
 
         // find all eligible image stores for this template
-        List<DataStore> imageStores = this.templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId());
+        List<DataStore> imageStores = templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId());
         if (imageStores == null || imageStores.size() == 0) {
             // already destroyed on image stores
             s_logger.info("Unable to find image store still having template: " + template.getName()
@@ -321,7 +322,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
                 }
 
                 s_logger.info("Delete template from image store: " + imageStore.getName());
-                AsyncCallFuture<TemplateApiResult> future = this.imageService.deleteTemplateAsync(this.imageFactory
+                AsyncCallFuture<TemplateApiResult> future = imageService.deleteTemplateAsync(imageFactory
                         .getTemplate(template.getId(), imageStore));
                 try {
                     TemplateApiResult result = future.get();
@@ -350,9 +351,15 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
             }
         }
         if (success) {
+            // delete all cache entries for this template
+            List<TemplateInfo> cacheTmpls = imageFactory.listTemplateOnCache(template.getId());
+            for (TemplateInfo tmplOnCache : cacheTmpls) {
+                s_logger.info("Delete template from image cache store: " + tmplOnCache.getDataStore().getName());
+                tmplOnCache.delete();
+            }
 
             // find all eligible image stores for this template
-            List<DataStore> iStores = this.templateMgr.getImageStoreByTemplate(template.getId(), null);
+            List<DataStore> iStores = templateMgr.getImageStoreByTemplate(template.getId(), null);
             if (iStores == null || iStores.size() == 0) {
                 // remove template from vm_templates table
                 if (_tmpltDao.remove(template.getId())) {
@@ -380,7 +387,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
             throw new InvalidParameterValueException("The DomR template cannot be deleted.");
         }
 
-        if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) {
+        if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) {
             throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone.");
         }
 
@@ -392,7 +399,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
         TemplateProfile profile = super.prepareDelete(cmd);
         Long zoneId = profile.getZoneId();
 
-        if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) {
+        if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) {
             throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone.");
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index 452e079..3b2ec58 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -1707,6 +1707,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         return stores;
     }
 
+
     @Override
     public VMTemplateVO updateTemplate(UpdateIsoCmd cmd) {
         return updateTemplateOrIso(cmd);


[3/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Trigger syncing templates to S3 in case of copyTemplate and
extractTemplate.

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

Branch: refs/heads/object_store_migration
Commit: 184e53940ae247a744c4a6c5222c20d331af7d2e
Parents: 1b07c33
Author: Min Chen <mi...@citrix.com>
Authored: Mon Oct 21 17:23:58 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Oct 21 17:23:58 2013 -0700

----------------------------------------------------------------------
 .../api/storage/TemplateDataFactory.java        |  2 +
 .../subsystem/api/storage/TemplateService.java  |  2 +
 .../datastore/db/TemplateDataStoreDao.java      |  2 +
 .../storage/image/TemplateDataFactoryImpl.java  | 22 +++++--
 .../storage/image/TemplateServiceImpl.java      | 68 ++++++++++++++++++++
 .../image/db/TemplateDataStoreDaoImpl.java      | 12 ++++
 .../com/cloud/template/TemplateManagerImpl.java | 20 ++++--
 7 files changed, 117 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
index 0b78da0..980ed31 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java
@@ -28,4 +28,6 @@ public interface TemplateDataFactory {
     TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);
 
     TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId);
+
+    TemplateInfo getReadyTemplateOnCache(long templateId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index 0d8b3c1..185d254 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -54,6 +54,8 @@ public interface TemplateService {
 
     AsyncCallFuture<TemplateApiResult> prepareTemplateOnPrimary(TemplateInfo srcTemplate, StoragePool pool);
 
+    void syncTemplateToRegionStore(long templateId, DataStore store);
+
     void handleSysTemplateDownload(HypervisorType hostHyper, Long dcId);
 
     void handleTemplateSync(DataStore store);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index ba569c1..fc61be5 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -64,4 +64,6 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
     List<TemplateDataStoreVO> listByTemplate(long templateId);
 
     void duplicateCacheRecordsOnRegionStore(long storeId);
+
+    TemplateDataStoreVO findReadyOnCache(long templateId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
index a67f08f..fe1c62c 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java
@@ -20,6 +20,9 @@ package org.apache.cloudstack.storage.image;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -28,8 +31,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.image.store.TemplateObject;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStoragePoolVO;
@@ -87,7 +88,7 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
         TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplate(templateId, storeRole);
         DataStore store = null;
         if (tmplStore != null) {
-            store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
+            store = storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
         }
         return this.getTemplate(templateId, store);
     }
@@ -97,7 +98,7 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
         TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplateZone(templateId, zoneId, storeRole);
         DataStore store = null;
         if (tmplStore != null) {
-            store = this.storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
+            store = storeMgr.getDataStore(tmplStore.getDataStoreId(), storeRole);
         }
         return this.getTemplate(templateId, store);
     }
@@ -113,4 +114,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
         tmpObj.setUrl(origTmpl.getUrl());
         return tmpObj;
     }
+
+    @Override
+    public TemplateInfo getReadyTemplateOnCache(long templateId) {
+        TemplateDataStoreVO tmplStore = templateStoreDao.findReadyOnCache(templateId);
+        if (tmplStore != null) {
+            DataStore store = storeMgr.getDataStore(tmplStore.getDataStoreId(), DataStoreRole.ImageCache);
+            return getTemplate(templateId, store);
+        } else {
+            return null;
+        }
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 06cb652..163c125 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -73,6 +73,7 @@ import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.ScopeType;
 import com.cloud.storage.Storage.TemplateType;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
@@ -609,6 +610,73 @@ public class TemplateServiceImpl implements TemplateService {
         return copyAsync(volume, template, store);
     }
 
+    private AsyncCallFuture<TemplateApiResult> syncToRegionStoreAsync(TemplateInfo template, DataStore store) {
+        AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
+        // no need to create entry on template_store_ref here, since entries are already created when prepareSecondaryStorageForMigration is invoked.
+        TemplateInfo templateOnStore = _templateFactory.getTemplate(template, store);
+        TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(null,
+                (TemplateObject)templateOnStore, future);
+        AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+        caller.setCallback(caller.getTarget().syncTemplateCallBack(null, null)).setContext(context);
+        _motionSrv.copyAsync(template, templateOnStore, caller);
+        return future;
+    }
+
+    protected Void syncTemplateCallBack(AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> callback,
+            TemplateOpContext<TemplateApiResult> context) {
+        TemplateInfo destTemplate = context.getTemplate();
+        CopyCommandResult result = callback.getResult();
+        AsyncCallFuture<TemplateApiResult> future = context.getFuture();
+        TemplateApiResult res = new TemplateApiResult(destTemplate);
+        try {
+            if (result.isFailed()) {
+                res.setResult(result.getResult());
+                // no change to existing template_store_ref, will try to re-sync later if other call triggers this sync operation, like copy template
+            } else {
+                // this will update install path properly, next time it will not sync anymore.
+                destTemplate.processEvent(Event.OperationSuccessed, result.getAnswer());
+            }
+            future.complete(res);
+        } catch (Exception e) {
+            s_logger.debug("Failed to process sync template callback", e);
+            res.setResult(e.toString());
+            future.complete(res);
+        }
+
+        return null;
+    }
+
+    // This routine is used to push templates currently on cache store, but not in region store to region store.
+    // used in migrating existing NFS secondary storage to S3.
+    @Override
+    public void syncTemplateToRegionStore(long templateId, DataStore store) {
+        if (store.getScope().getScopeType() == ScopeType.REGION) {
+            // if template is on region wide object store, check if it is really downloaded there (by checking install_path). Sync template to region
+            // wide store if it is not there physically.
+            TemplateInfo tmplOnStore = _templateFactory.getTemplate(templateId, store);
+            if (tmplOnStore == null) {
+                throw new CloudRuntimeException("Cannot find an entry in template_store_ref for template " + templateId + " on region store: " + store.getName());
+            }
+            if (tmplOnStore.getInstallPath() == null || tmplOnStore.getInstallPath().length() == 0) {
+                // template is not on region store yet, sync to region store
+                TemplateInfo srcTemplate = _templateFactory.getReadyTemplateOnCache(templateId);
+                if (srcTemplate == null) {
+                    throw new CloudRuntimeException("Cannot find template " + templateId + "  on cache store");
+                }
+                AsyncCallFuture<TemplateApiResult> future = syncToRegionStoreAsync(srcTemplate, store);
+                try {
+                    TemplateApiResult result = future.get();
+                    if (result.isFailed()) {
+                        throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName() + ":"
+                                + result.getResult());
+                    }
+                } catch (Exception ex) {
+                    throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName());
+                }
+            }
+        }
+    }
+
     @Override
     public AsyncCallFuture<TemplateApiResult> copyTemplate(TemplateInfo srcTemplate, DataStore destStore) {
         // generate a URL from source template ssvm to download to destination data store

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/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 008180f..25f3486 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
@@ -31,6 +31,7 @@ import org.springframework.stereotype.Component;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
@@ -94,6 +95,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         templateRoleSearch.and("template_id", templateRoleSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
         templateRoleSearch.and("store_role", templateRoleSearch.entity().getDataStoreRole(), SearchCriteria.Op.EQ);
         templateRoleSearch.and("destroyed", templateRoleSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+        templateRoleSearch.and("state", templateRoleSearch.entity().getState(), SearchCriteria.Op.EQ);
         templateRoleSearch.done();
 
         updateStateSearch = this.createSearchBuilder();
@@ -323,6 +325,16 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     }
 
     @Override
+    public TemplateDataStoreVO findReadyOnCache(long templateId) {
+        SearchCriteria<TemplateDataStoreVO> sc = templateRoleSearch.create();
+        sc.setParameters("template_id", templateId);
+        sc.setParameters("store_role", DataStoreRole.ImageCache);
+        sc.setParameters("destroyed", false);
+        sc.setParameters("state", ObjectInDataStoreStateMachine.State.Ready);
+        return findOneIncludingRemovedBy(sc);
+    }
+
+    @Override
     public List<TemplateDataStoreVO> listByTemplate(long templateId) {
         SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
         sc.setParameters("template_id", templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/184e5394/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index c1ce892..452e079 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -479,6 +479,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
             throw new InvalidParameterValueException("The " + desc + " has not been downloaded ");
         }
 
+        // Handle NFS to S3 object store migration case, we trigger template sync from NFS to S3 during extract template or copy template
+        _tmpltSvr.syncTemplateToRegionStore(templateId, tmpltStore);
+
         DataObject templateObject = _tmplFactory.getTemplate(templateId, tmpltStore);
 
         return tmpltStore.createEntityExtractUrl(tmpltStoreRef.getInstallPath(), template.getFormat(), templateObject);
@@ -698,7 +701,15 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
             throw new InvalidParameterValueException("Unable to find template with id");
         }
 
+        DataStore srcSecStore = getImageStore(sourceZoneId, templateId);
+        if (srcSecStore == null) {
+            throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
+        }
+
         if (template.isCrossZones()){
+            //TODO: we may need UI still enable CopyTemplate in case of cross zone template to trigger sync to region store.
+            // sync template from cache store to region store if it is not there, for cases where we are going to migrate existing NFS to S3.
+            _tmpltSvr.syncTemplateToRegionStore(templateId, srcSecStore);
             s_logger.debug("Template " + templateId + " is cross-zone, don't need to copy");
             return template;
         }
@@ -710,11 +721,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
             return template;
         }
 
-        DataStore srcSecStore = getImageStore(sourceZoneId, templateId);
-        if (srcSecStore == null) {
-            throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
-        }
-
         _accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, template);
 
         boolean success = copy(userId, template, srcSecStore, dstZone);
@@ -781,7 +787,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
         }
 
         try {
-            StoragePool pool = (StoragePool) this._dataStoreMgr.getPrimaryDataStore(templatePoolVO.getPoolId());
+            StoragePool pool = (StoragePool) _dataStoreMgr.getPrimaryDataStore(templatePoolVO.getPoolId());
             VMTemplateVO template = _tmpltDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
 
             if (s_logger.isDebugEnabled()) {
@@ -1830,6 +1836,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
 
     @Inject
     public void setTemplateAdapters(List<TemplateAdapter> adapters) {
-        this._adapters = adapters;
+        _adapters = adapters;
     }
 }


[8/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Remove wrong final modifier from Created field in SnapshotDataStoreVO,
TemplateDataStoreVO and VolumeDataStoreVO.

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

Branch: refs/heads/object_store_migration
Commit: 9da56fe1fe18cc544910365aaea72eafd8208c78
Parents: 7a1ee00
Author: Min Chen <mi...@citrix.com>
Authored: Fri Oct 25 21:15:36 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Oct 25 21:15:36 2013 -0700

----------------------------------------------------------------------
 .../cloudstack/storage/datastore/db/SnapshotDataStoreVO.java       | 2 +-
 .../cloudstack/storage/datastore/db/TemplateDataStoreVO.java       | 2 +-
 .../apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 98fb7b1..db86c3f 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -59,7 +59,7 @@ public class SnapshotDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     private long snapshotId;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private final Date created = null;
+    private Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
index 7d0a967..a3696d8 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
@@ -60,7 +60,7 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
     private DataStoreRole dataStoreRole;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private final Date created = null;
+    private Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9da56fe1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
index 6f3ccae..e34d4a6 100755
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
@@ -58,7 +58,7 @@ public class VolumeDataStoreVO implements StateObject<ObjectInDataStoreStateMach
     private long zoneId;
 
     @Column(name = GenericDaoBase.CREATED_COLUMN)
-    private final Date created = null;
+    private Date created = null;
 
     @Column(name = "last_updated")
     @Temporal(value = TemporalType.TIMESTAMP)


[7/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Merge branch 'master' into object_store_migration.



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

Branch: refs/heads/object_store_migration
Commit: 7a1ee002756ea545a849b29268e3cc72f7fcd8b3
Parents: 81686e8 7120c1e
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 16:46:28 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 16:46:28 2013 -0700

----------------------------------------------------------------------
 agent/pom.xml                                   |    4 +
 agent/src/com/cloud/agent/Agent.java            |    1 -
 agent/src/com/cloud/agent/AgentShell.java       |   61 +-
 agent/test/com/cloud/agent/AgentShellTest.java  |   48 +
 .../cloudstack/api-planner/module.properties    |   18 +
 .../api-planner/spring-api-planner-context.xml  |   34 +
 .../exception/ConcurrentOperationException.java |    3 +-
 .../element/RemoteAccessVPNServiceProvider.java |    5 +-
 api/src/com/cloud/offering/NetworkOffering.java |    2 +
 api/src/com/cloud/vm/VmDetailConstants.java     |    1 +
 .../org/apache/cloudstack/api/ApiConstants.java |    7 +-
 .../admin/network/CreateNetworkOfferingCmd.java |    9 +-
 .../admin/network/UpdateNetworkOfferingCmd.java |    7 +
 .../command/user/network/UpdateNetworkCmd.java  |    4 +-
 .../command/user/ssh/CreateSSHKeyPairCmd.java   |    6 +-
 .../api/command/user/vm/DestroyVMCmd.java       |   27 +-
 .../user/volume/RemoveResourceDetailCmd.java    |   15 +-
 .../command/user/volume/UpdateVolumeCmd.java    |    6 +-
 .../api/response/CreateSSHKeyPairResponse.java  |   41 +
 .../api/response/SSHKeyPairResponse.java        |   16 -
 .../api/response/SnapshotResponse.java          |   25 +-
 .../cloudstack/api/response/UserVmResponse.java |    9 +-
 .../apache/cloudstack/context/CallContext.java  |    4 +-
 .../bridge/persist/dao/BucketPolicyDaoImpl.java |    6 +-
 .../persist/dao/CloudStackAccountDaoImpl.java   |    3 +-
 .../dao/CloudStackConfigurationDaoImpl.java     |    3 +-
 .../dao/CloudStackSvcOfferingDaoImpl.java       |    5 +-
 .../persist/dao/CloudStackUserDaoImpl.java      |    3 +-
 .../cloud/bridge/persist/dao/MHostDaoImpl.java  |    5 +-
 .../bridge/persist/dao/MHostMountDaoImpl.java   |    3 +-
 .../persist/dao/MultiPartPartsDaoImpl.java      |    9 +-
 .../persist/dao/MultiPartUploadsDaoImpl.java    |   15 +-
 .../bridge/persist/dao/MultipartLoadDao.java    |    9 +-
 .../persist/dao/MultipartMetaDaoImpl.java       |    3 +-
 .../bridge/persist/dao/OfferingDaoImpl.java     |   11 +-
 .../cloud/bridge/persist/dao/SAclDaoImpl.java   |    7 +-
 .../bridge/persist/dao/SBucketDaoImpl.java      |    5 +-
 .../cloud/bridge/persist/dao/SHostDaoImpl.java  |    5 +-
 .../cloud/bridge/persist/dao/SMetaDaoImpl.java  |    5 +-
 .../bridge/persist/dao/SObjectDaoImpl.java      |    7 +-
 .../bridge/persist/dao/SObjectItemDaoImpl.java  |    5 +-
 .../persist/dao/UserCredentialsDaoImpl.java     |    5 +-
 .../cloud/bridge/service/EC2RestServlet.java    |   13 +-
 .../com/cloud/bridge/service/S3RestServlet.java |    5 +-
 .../service/controller/s3/S3BucketAction.java   |    3 +-
 .../service/controller/s3/ServiceProvider.java  |    7 +-
 .../cloud/bridge/service/core/s3/S3Engine.java  |   23 +-
 .../classes/resources/messages.properties       |    2 +
 client/WEB-INF/web.xml                          |    6 +-
 client/pom.xml                                  |   56 +-
 .../cloudstack/webApplicationContext.xml        |   32 +
 client/tomcatconf/applicationContext.xml.in     |  956 ------
 client/tomcatconf/commands.properties.in        |    2 +-
 client/tomcatconf/componentContext.xml.in       |  324 --
 client/tomcatconf/log4j-cloud.xml.in            |    8 +
 client/tomcatconf/nonossComponentContext.xml.in |  421 ---
 .../tomcatconf/simulatorComponentContext.xml.in |  284 --
 client/tomcatconf/tomcat6-nonssl.conf.in        |    2 +-
 client/tomcatconf/tomcat6-ssl.conf.in           |    2 +-
 .../cloudstack/allocator/module.properties      |   18 +
 .../allocator/spring-core-allocator-context.xml |   32 +
 ...-lifecycle-allocator-context-inheritable.xml |   42 +
 .../META-INF/cloudstack/api/module.properties   |   18 +
 ...g-core-lifecycle-api-context-inheritable.xml |   53 +
 .../cloudstack/backend/module.properties        |   18 +
 .../cloudstack/bootstrap/module.properties      |   17 +
 .../spring-bootstrap-context-inheritable.xml    |   39 +
 .../bootstrap/spring-bootstrap-context.xml      |   32 +
 .../cloudstack/compute/module.properties        |   18 +
 ...re-lifecycle-compute-context-inheritable.xml |   45 +
 .../META-INF/cloudstack/core/module.properties  |   18 +
 .../cloudstack/core/spring-core-context.xml     |   36 +
 ...-core-lifecycle-core-context-inheritable.xml |   41 +
 .../core/spring-core-registry-core-context.xml  |  197 ++
 .../cloudstack/discoverer/module.properties     |   18 +
 ...lifecycle-discoverer-context-inheritable.xml |   35 +
 .../cloudstack/network/module.properties        |   18 +
 ...re-lifecycle-network-context-inheritable.xml |   58 +
 .../cloudstack/planner/module.properties        |   18 +
 ...re-lifecycle-planner-context-inheritable.xml |   41 +
 .../cloudstack/storage/module.properties        |   18 +
 ...ng-lifecycle-storage-context-inheritable.xml |   74 +
 .../cloudstack/system/module.properties         |   18 +
 .../spring-core-system-context-inheritable.xml  |   54 +
 .../system/spring-core-system-context.xml       |   50 +
 .../com/cloud/agent/api/ClusterSyncAnswer.java  |    8 +-
 .../cloud/agent/api/StartupRoutingCommand.java  |    8 +-
 core/src/com/cloud/agent/api/StopAnswer.java    |   23 +-
 .../api/routing/LoadBalancerConfigCommand.java  |    4 +-
 .../virtualnetwork/VirtualRoutingResource.java  |   25 +-
 .../com/cloud/network/HAProxyConfigurator.java  |   54 +-
 .../StorageSubsystemCommandHandlerBase.java     |    5 +-
 .../cloud/network/HAProxyConfiguratorTest.java  |   97 +
 .../core/spring-engine-api-core-context.xml     |   44 +
 .../api/storage/DataMotionStrategy.java         |    4 +-
 .../subsystem/api/storage/SnapshotInfo.java     |    2 +
 .../subsystem/api/storage/SnapshotStrategy.java |    9 +-
 .../api/storage/StorageStrategyFactory.java     |   45 +
 .../subsystem/api/storage/StrategyPriority.java |   86 +-
 .../api/storage/StrategyPriorityTest.java       |  116 -
 ...pring-engine-components-api-core-context.xml |   30 +
 .../configuration/ConfigurationManager.java     |    2 +-
 ...spring-engine-orchestration-core-context.xml |   71 +
 .../cloud/agent/manager/AgentManagerImpl.java   |    5 +-
 .../manager/ClusteredAgentManagerImpl.java      |    4 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  390 ++-
 .../entity/api/db/dao/DcDetailsDaoImpl.java     |    4 +-
 .../entity/api/db/dao/EngineClusterDaoImpl.java |    6 +-
 .../api/db/dao/EngineDataCenterDaoImpl.java     |    6 +-
 .../entity/api/db/dao/EngineHostDaoImpl.java    |   14 +-
 .../entity/api/db/dao/EngineHostPodDaoImpl.java |    6 +-
 .../entity/api/db/dao/HostDetailsDaoImpl.java   |    4 +-
 .../entity/api/db/dao/HostTagsDaoImpl.java      |    4 +-
 .../orchestration/NetworkOrchestrator.java      |  916 ++---
 .../orchestration/VolumeOrchestrator.java       |   88 +-
 .../spring-engine-schema-core-daos-context.xml  |  322 ++
 ...ng-engine-schema-system-checkers-context.xml |   34 +
 .../src/com/cloud/alert/dao/AlertDaoImpl.java   |    4 +-
 .../com/cloud/capacity/dao/CapacityDaoImpl.java |   26 +-
 .../configuration/dao/ResourceCountDaoImpl.java |    4 +-
 .../src/com/cloud/dc/ClusterDetailsDaoImpl.java |    6 +-
 .../src/com/cloud/dc/dao/ClusterDaoImpl.java    |    6 +-
 .../com/cloud/dc/dao/ClusterVSMMapDaoImpl.java  |    4 +-
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |    6 +-
 .../dc/dao/DataCenterIpAddressDaoImpl.java      |    8 +-
 .../DataCenterLinkLocalIpAddressDaoImpl.java    |    6 +-
 .../src/com/cloud/dc/dao/DataCenterVnetDao.java |    3 +-
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java |    8 +-
 .../src/com/cloud/dc/dao/DcDetailsDaoImpl.java  |    4 +-
 .../src/com/cloud/dc/dao/HostPodDaoImpl.java    |    6 +-
 .../src/com/cloud/dc/dao/PodVlanDaoImpl.java    |    8 +-
 .../dc/dao/StorageNetworkIpAddressDaoImpl.java  |    6 +-
 .../src/com/cloud/dc/dao/VlanDaoImpl.java       |    4 +-
 .../src/com/cloud/domain/dao/DomainDaoImpl.java |    8 +-
 .../src/com/cloud/event/dao/EventDaoImpl.java   |    4 +-
 .../com/cloud/event/dao/UsageEventDaoImpl.java  |   10 +-
 .../src/com/cloud/host/dao/HostDaoImpl.java     |   14 +-
 .../com/cloud/host/dao/HostDetailsDaoImpl.java  |    4 +-
 .../src/com/cloud/host/dao/HostTagsDaoImpl.java |    4 +-
 .../src/com/cloud/keystore/KeystoreDaoImpl.java |    4 +-
 .../network/dao/FirewallRulesCidrsDaoImpl.java  |    4 +-
 .../cloud/network/dao/FirewallRulesDaoImpl.java |    6 +-
 .../com/cloud/network/dao/IPAddressDaoImpl.java |    6 +-
 .../com/cloud/network/dao/NetworkDaoImpl.java   |   10 +-
 .../cloud/network/dao/PortProfileDaoImpl.java   |    4 +-
 .../security/dao/SecurityGroupDaoImpl.java      |    6 +-
 .../security/dao/SecurityGroupWorkDaoImpl.java  |    8 +-
 .../security/dao/VmRulesetLogDaoImpl.java       |    8 +-
 .../cloud/network/vpc/dao/PrivateIpDaoImpl.java |    4 +-
 .../network/vpc/dao/StaticRouteDaoImpl.java     |    4 +-
 .../com/cloud/network/vpc/dao/VpcDaoImpl.java   |    8 +-
 .../network/vpc/dao/VpcOfferingDaoImpl.java     |    4 +-
 .../com/cloud/offerings/NetworkOfferingVO.java  |   12 +
 .../offerings/dao/NetworkOfferingDaoImpl.java   |    6 +-
 .../com/cloud/projects/dao/ProjectDaoImpl.java  |    4 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |    4 +-
 .../storage/dao/LaunchPermissionDaoImpl.java    |    6 +-
 .../com/cloud/storage/dao/SnapshotDaoImpl.java  |   14 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |    4 +-
 .../storage/dao/StoragePoolHostDaoImpl.java     |   10 +-
 .../storage/dao/StoragePoolWorkDaoImpl.java     |    4 +-
 .../com/cloud/storage/dao/VMTemplateDao.java    |    3 +
 .../cloud/storage/dao/VMTemplateDaoImpl.java    |   31 +-
 .../cloud/storage/dao/VMTemplateDetailsDao.java |    2 +
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |   16 +-
 .../storage/dao/VMTemplateHostDaoImpl.java      |    8 +-
 .../storage/dao/VMTemplatePoolDaoImpl.java      |    8 +-
 .../storage/dao/VMTemplateZoneDaoImpl.java      |    4 +-
 .../com/cloud/storage/dao/VolumeDaoImpl.java    |   12 +-
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |    4 +-
 .../src/com/cloud/upgrade/DatabaseCreator.java  |    8 +-
 .../cloud/upgrade/DatabaseIntegrityChecker.java |    7 +-
 .../cloud/upgrade/DatabaseUpgradeChecker.java   |    9 +-
 .../com/cloud/upgrade/dao/Upgrade307to410.java  |    1 -
 .../com/cloud/upgrade/dao/VersionDaoImpl.java   |    4 +-
 .../src/com/cloud/usage/dao/UsageDaoImpl.java   |   26 +-
 .../cloud/usage/dao/UsageIPAddressDaoImpl.java  |    6 +-
 .../com/cloud/usage/dao/UsageJobDaoImpl.java    |    8 +-
 .../dao/UsageLoadBalancerPolicyDaoImpl.java     |    8 +-
 .../cloud/usage/dao/UsageNetworkDaoImpl.java    |    8 +-
 .../usage/dao/UsageNetworkOfferingDaoImpl.java  |    6 +-
 .../dao/UsagePortForwardingRuleDaoImpl.java     |    8 +-
 .../usage/dao/UsageSecurityGroupDaoImpl.java    |    6 +-
 .../cloud/usage/dao/UsageStorageDaoImpl.java    |    8 +-
 .../cloud/usage/dao/UsageVMInstanceDaoImpl.java |    8 +-
 .../cloud/usage/dao/UsageVMSnapshotDaoImpl.java |    8 +-
 .../cloud/usage/dao/UsageVPNUserDaoImpl.java    |    6 +-
 .../com/cloud/usage/dao/UsageVmDiskDaoImpl.java |    8 +-
 .../com/cloud/usage/dao/UsageVolumeDaoImpl.java |    8 +-
 .../com/cloud/user/AccountDetailsDaoImpl.java   |    4 +-
 .../src/com/cloud/user/dao/AccountDaoImpl.java  |    4 +-
 .../cloud/user/dao/UserStatisticsDaoImpl.java   |    6 +-
 .../cloud/user/dao/VmDiskStatisticsDaoImpl.java |    6 +-
 .../com/cloud/vm/dao/ConsoleProxyDaoImpl.java   |   16 +-
 .../com/cloud/vm/dao/DomainRouterDaoImpl.java   |    8 +-
 .../src/com/cloud/vm/dao/NicDetailDaoImpl.java  |    4 +-
 .../cloud/vm/dao/SecondaryStorageVmDaoImpl.java |    8 +-
 .../src/com/cloud/vm/dao/UserVmDaoImpl.java     |    8 +-
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java  |    3 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |   17 +-
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java |   12 +-
 .../affinity/dao/AffinityGroupVMMapDaoImpl.java |    4 +-
 .../entity/api/db/dao/VMComputeTagDaoImpl.java  |    4 +-
 .../entity/api/db/dao/VMEntityDaoImpl.java      |    4 +-
 .../entity/api/db/dao/VMNetworkMapDaoImpl.java  |    4 +-
 .../entity/api/db/dao/VMReservationDaoImpl.java |    4 +-
 .../entity/api/db/dao/VMRootDiskTagDaoImpl.java |    4 +-
 .../datastore/db/PrimaryDataStoreDaoImpl.java   |   10 +-
 ...spring-engine-storage-cache-core-context.xml |   38 +
 ...g-engine-storage-datamotion-core-context.xml |   34 +
 ...ngine-storage-datamotion-storage-context.xml |   34 +
 .../motion/AncientDataMotionStrategy.java       |   10 +-
 .../storage/motion/DataMotionServiceImpl.java   |   42 +-
 ...spring-engine-storage-image-core-context.xml |   45 +
 .../cloudstack/storage/test/AopTestAdvice.java  |    3 +-
 .../storage/test/CloudStackTestNGBase.java      |    5 +-
 .../test/FakePrimaryDataStoreDriver.java        |    7 +-
 .../storage/test/MockStorageMotionStrategy.java |   10 +-
 .../cloudstack/storage/test/SnapshotTest.java   |   58 +-
 .../cloudstack/storage/test/TestNGAop.java      |    4 +-
 .../test/resources/storageContext.xml           |    1 +
 .../core/spring-engine-storage-core-context.xml |   68 +
 .../storage-allocator/module.properties         |   18 +
 ...engine-storage-storage-allocator-context.xml |   49 +
 ...ing-engine-storage-snapshot-core-context.xml |   41 +
 ...-engine-storage-snapshot-storage-context.xml |   33 +
 .../storage/snapshot/SnapshotObject.java        |   40 +-
 .../snapshot/XenserverSnapshotStrategy.java     |    8 +-
 .../ClusterScopeStoragePoolAllocator.java       |   19 +-
 .../allocator/LocalStoragePoolAllocator.java    |   19 +-
 .../allocator/ZoneWideStoragePoolAllocator.java |   31 +-
 .../provider/DataStoreProviderManagerImpl.java  |  112 +-
 .../endpoint/DefaultEndPointSelector.java       |    3 +-
 .../helper/StorageStrategyFactoryImpl.java      |  139 +
 .../image/db/ImageStoreDetailsDaoImpl.java      |    4 +-
 .../image/db/SnapshotDataStoreDaoImpl.java      |    8 +-
 .../image/db/TemplateDataStoreDaoImpl.java      |    6 +-
 .../image/db/VolumeDataStoreDaoImpl.java        |    5 +-
 .../datastore/PrimaryDataStoreHelper.java       |    4 +-
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |    4 +-
 .../api/storage/StrategyPriorityTest.java       |  122 +
 ...pring-engine-storage-volume-core-context.xml |   49 +
 .../storage/volume/VolumeServiceImpl.java       |    2 +-
 .../spring-framework-cluster-core-context.xml   |   36 +
 .../com/cloud/cluster/ClusterManagerImpl.java   |  102 +-
 .../dao/ManagementServerHostDaoImpl.java        |   16 +-
 .../dao/ManagementServerHostPeerDaoImpl.java    |    4 +-
 ...mework-config-system-context-inheritable.xml |   38 +
 .../spring-framework-config-system-context.xml  |   51 +
 .../framework/config/ConfigDepotAdmin.java      |    2 +
 .../framework/config/dao/ConfigurationDao.java  |    2 +
 .../config/dao/ConfigurationDaoImpl.java        |   24 +-
 .../framework/config/impl/ConfigDepotImpl.java  |   98 +-
 .../config/impl/ConfigDepotAdminTest.java       |    1 +
 .../spring-framework-db-system-context.xml      |   32 +
 .../utils/crypt/EncryptionSecretKeyChanger.java |    3 +-
 .../com/cloud/utils/db/ConnectionConcierge.java |    2 +-
 framework/db/src/com/cloud/utils/db/DbUtil.java |    2 +-
 .../src/com/cloud/utils/db/GenericDaoBase.java  |   36 +-
 .../db/src/com/cloud/utils/db/Merovingian2.java |    2 +-
 .../src/com/cloud/utils/db/SequenceFetcher.java |    2 +-
 .../db/src/com/cloud/utils/db/Transaction.java  | 1165 +------
 .../com/cloud/utils/db/TransactionCallback.java |   25 +
 .../utils/db/TransactionCallbackNoReturn.java   |   31 +
 .../db/TransactionCallbackWithException.java    |   25 +
 ...ransactionCallbackWithExceptionNoReturn.java |   32 +
 .../utils/db/TransactionContextBuilder.java     |    6 +-
 .../utils/db/TransactionContextInterceptor.java |   39 +
 .../utils/db/TransactionContextListener.java    |   41 +
 .../com/cloud/utils/db/TransactionLegacy.java   | 1194 +++++++
 .../cloud/utils/db/TransactionMBeanImpl.java    |   18 +-
 .../com/cloud/utils/db/TransactionStatus.java   |   25 +
 .../db/test/com/cloud/utils/db/DbTestDao.java   |    4 +-
 .../db/test/com/cloud/utils/db/DbTestUtils.java |    4 +-
 .../com/cloud/utils/db/TestTransaction.java     |  154 +
 .../com/cloud/utils/db/TransactionTest.java     |   26 +-
 framework/db/test/db.properties                 |   18 +
 .../core/spring-framework-ipc-core-context.xml  |   59 +
 .../core/spring-framework-jobs-core-context.xml |   48 +
 .../framework/jobs/dao/AsyncJobDaoImpl.java     |    4 +-
 .../jobs/dao/AsyncJobJoinMapDaoImpl.java        |   10 +-
 .../framework/jobs/dao/SyncQueueDaoImpl.java    |    4 +-
 .../jobs/dao/SyncQueueItemDaoImpl.java          |    4 +-
 .../jobs/impl/AsyncJobManagerImpl.java          |  286 +-
 .../jobs/impl/SyncQueueManagerImpl.java         |  271 +-
 framework/pom.xml                               |    2 +
 framework/spring/lifecycle/pom.xml              |   34 +
 .../spring/lifecycle/AbstractBeanCollector.java |  113 +
 .../lifecycle/AbstractSmartLifeCycle.java       |   53 +
 .../lifecycle/CloudStackExtendedLifeCycle.java  |  169 +
 .../CloudStackExtendedLifeCycleStart.java       |   49 +
 .../spring/lifecycle/CloudStackLog4jSetup.java  |   56 +
 .../spring/lifecycle/ConfigDepotLifeCycle.java  |   47 +
 .../spring/lifecycle/registry/DumpRegistry.java |   77 +
 .../lifecycle/registry/ExtensionRegistry.java   |  245 ++
 .../registry/PluggableServiceLifecycle.java     |   53 +
 .../lifecycle/registry/RegistryLifecycle.java   |  144 +
 framework/spring/module/pom.xml                 |   50 +
 .../context/ResourceApplicationContext.java     |   55 +
 .../module/factory/CloudStackSpringContext.java |  137 +
 .../factory/ModuleBasedContextFactory.java      |   84 +
 .../module/locator/ModuleDefinitionLocator.java |   36 +
 .../impl/ClasspathModuleDefinitionLocator.java  |   62 +
 .../spring/module/model/ModuleDefinition.java   |   48 +
 .../module/model/ModuleDefinitionSet.java       |   32 +
 .../model/impl/DefaultModuleDefinition.java     |  167 +
 .../model/impl/DefaultModuleDefinitionSet.java  |  243 ++
 .../cloudstack/spring/module/util/Main.java     |   58 +
 .../spring/module/util/ModuleLocationUtils.java |   53 +
 .../web/CloudStackContextLoaderListener.java    |   75 +
 .../module/model/impl/defaults-context.xml      |   28 +
 .../spring/module/factory/InitTest.java         |   39 +
 .../factory/ModuleBasedContextFactoryTest.java  |  121 +
 ...ClasspathModuleDefinitionSetLocatorTest.java |   40 +
 .../model/impl/DefaultModuleDefinitionTest.java |  131 +
 .../resources/testfiles/all/defaults.properties |   18 +
 .../testfiles/all/empty-context-inheritable.xml |   26 +
 .../resources/testfiles/all/empty-context.xml   |   26 +
 .../all/empty2-context-inheritable.xml          |   26 +
 .../resources/testfiles/all/empty2-context.xml  |   26 +
 .../resources/testfiles/all/module.properties   |   17 +
 .../testfiles/all/test2-defaults.properties     |   17 +
 .../testfiles/badname/module.properties         |   17 +
 .../testfiles/blankname/module.properties       |   18 +
 .../resources/testfiles/good/empty-context.xml  |   26 +
 .../resources/testfiles/good/module.properties  |   17 +
 .../testfiles/missingname/module.properties     |   17 +
 .../testfiles/wrongname/module.properties       |   17 +
 .../testhierarchy/base/module.properties        |   17 +
 .../base/test-context-inheritable.xml           |   28 +
 .../testhierarchy/base/test-context.xml         |   34 +
 .../testhierarchy/child1-1/module.properties    |   18 +
 .../testhierarchy/child1-1/test-context.xml     |   34 +
 .../testhierarchy/child1/module.properties      |   18 +
 .../child1/test-context-override.xml            |   30 +
 .../testhierarchy/child1/test-context.xml       |   38 +
 .../testhierarchy/child2/module.properties      |   18 +
 .../testhierarchy/child2/test-context.xml       |   33 +
 .../testhierarchy/orphan1/module.properties     |   18 +
 .../testhierarchy/orphan1/test-context.xml      |   30 +
 packaging/centos63/cloud-management.rc          |    4 +-
 packaging/centos63/cloud.spec                   |   18 +-
 packaging/centos63/cloudstack-sccs              |   20 +
 .../debian/config/opt/cloud/bin/savepassword.sh |   62 +
 .../acl-static-role-based/module.properties     |   18 +
 .../spring-acl-static-role-based-context.xml    |   34 +
 .../explicit-dedication/module.properties       |   18 +
 .../spring-explicit-dedication-context.xml      |   36 +
 .../affinity/ExplicitDedicationProcessor.java   |   32 +-
 .../host-anti-affinity/module.properties        |   18 +
 .../spring-host-anti-affinity-context.xml       |   37 +
 .../discovery/ApiDiscoveryServiceImpl.java      |   65 +-
 .../cloudstack/discovery/ApiDiscoveryTest.java  |    2 +-
 .../cloudstack/rate-limit/module.properties     |   18 +
 .../rate-limit/spring-rate-limit-context.xml    |   32 +
 .../spring-dedicated-resources-core-context.xml |   33 +
 .../dedicated/DedicatedResourceManagerImpl.java |  273 +-
 .../implicit-dedication/module.properties       |   18 +
 .../spring-implicit-dedication-context.xml      |   25 +
 .../user-concentrated-pod/module.properties     |   18 +
 .../spring-user-concentrated-pod-context.xml    |   35 +
 .../src/com/cloud/netapp/NetappManagerImpl.java |   10 +-
 .../host-allocator-random/module.properties     |   18 +
 .../spring-host-allocator-random-context.xml    |   34 +
 .../baremetal-compute/module.properties         |   18 +
 .../spring-baremetal-compute-context.xml        |   35 +
 .../baremetal-discoverer/module.properties      |   18 +
 .../spring-baremetal-discoverer-context.xml     |   34 +
 .../baremetal-network/module.properties         |   18 +
 .../spring-baremetal-network-context.xml        |   46 +
 .../baremetal-planner/module.properties         |   18 +
 .../spring-baremetal-planner-context.xml        |   34 +
 .../baremetal-storage/module.properties         |   18 +
 .../spring-baremetal-storage-context.xml        |   32 +
 .../core/spring-baremetal-core-context.xml      |   42 +
 .../BareMetalPingServiceImpl.java               |    3 -
 .../networkservice/BareMetalResourceBase.java   |    2 +-
 .../networkservice/BaremetaNetworkGuru.java     |   21 +-
 .../networkservice/BaremetalDhcpElement.java    |    4 -
 .../BaremetalDhcpManagerImpl.java               |    4 -
 .../BaremetalKickStartServiceImpl.java          |    7 +-
 .../networkservice/BaremetalPxeElement.java     |    4 -
 .../cloudstack/kvm-compute/module.properties    |   18 +
 .../kvm-compute/spring-kvm-compute-context.xml  |   34 +
 .../kvm/resource/LibvirtComputingResource.java  |    2 +-
 .../cloudstack/ovm-compute/module.properties    |   18 +
 .../ovm-compute/spring-ovm-compute-context.xml  |   39 +
 .../cloudstack/ovm-discoverer/module.properties |   18 +
 .../spring-ovm-discoverer-context.xml           |   34 +
 .../cloud/ovm/hypervisor/OvmResourceBase.java   |    4 +-
 .../core/spring-simulator-core-context.xml      |   45 +
 .../simulator-compute/module.properties         |   18 +
 .../spring-simulator-compute-context.xml        |   34 +
 .../simulator-discoverer/module.properties      |   18 +
 .../spring-simulator-discover-context.xml       |   36 +
 .../simulator-planner/module.properties         |   18 +
 .../simulator-planner/spring-context.xml        |   34 +
 .../simulator-storage/module.properties         |   18 +
 .../spring-simulator-storage-context.xml        |   33 +
 .../agent/manager/MockAgentManagerImpl.java     |   95 +-
 .../agent/manager/MockStorageManagerImpl.java   |  170 +-
 .../cloud/agent/manager/MockVmManagerImpl.java  |   48 +-
 .../agent/manager/SimulatorManagerImpl.java     |   10 +-
 .../cloud/resource/AgentRoutingResource.java    |    2 +-
 .../simulator/dao/MockConfigurationDaoImpl.java |    4 +-
 .../motion/SimulatorDataMotionStrategy.java     |   10 +-
 .../cloudstack/core/spring-ucs-core-context.xml |   35 +
 .../com/cloud/ucs/manager/UcsManagerImpl.java   |    3 -
 .../core/spring-vmware-core-context.xml         |   43 +
 .../cloudstack/vmware-compute/module.properties |   18 +
 .../spring-vmware-compute-context.xml           |   43 +
 .../vmware-compute/vmware-defaults.properties   |   17 +
 .../vmware-discoverer/module.properties         |   18 +
 .../spring-vmware-discoverer-context.xml        |   35 +
 .../cloudstack/vmware-network/module.properties |   18 +
 .../spring-vmware-network-context.xml           |   34 +
 .../cloudstack/vmware-storage/module.properties |   18 +
 .../spring-vmware-storage-context.xml           |   33 +
 .../vmware/VmwareServerDiscoverer.java          |   33 +-
 .../vmware/manager/VmwareManagerImpl.java       |   53 +-
 .../vmware/resource/VmwareResource.java         |   12 +-
 .../network/CiscoNexusVSMDeviceManagerImpl.java |   68 +-
 .../network/element/CiscoNexusVSMElement.java   |   50 +-
 .../motion/VmwareStorageMotionStrategy.java     |   12 +-
 .../motion/VmwareStorageMotionStrategyTest.java |   10 +-
 .../xenserver-compute/module.properties         |   18 +
 .../spring-xenserver-compute-context.xml        |   28 +
 .../xenserver-discoverer/module.properties      |   18 +
 .../spring-xenserver-discoverer-context.xml     |   25 +
 .../xen/resource/CitrixResourceBase.java        |  117 +-
 .../xen/resource/XenServer56FP1Resource.java    |   26 +-
 .../xen/resource/XenServer610Resource.java      |   22 +
 .../xen/resource/XenServerPoolVms.java          |   39 +-
 .../motion/XenServerStorageMotionStrategy.java  |   12 +-
 .../META-INF/cloudstack/vns/module.properties   |   18 +
 .../cloudstack/vns/spring-vns-context.xml       |   36 +
 .../network/element/BigSwitchVnsElement.java    |   45 +-
 .../cloud/network/element/CiscoVnmcElement.java |  263 +-
 .../META-INF/cloudstack/elb/module.properties   |   18 +
 .../cloudstack/elb/spring-elb-context.xml       |   34 +
 .../lb/ElasticLoadBalancerManagerImpl.java      |   34 +-
 .../core/spring-internallb-core-context.xml     |   37 +
 .../lb/InternalLoadBalancerVMManagerImpl.java   |    2 +-
 .../JuniperSRXExternalFirewallElement.java      |   38 +-
 .../cloudstack/midonet/module.properties        |   18 +
 .../midonet/spring-midonet-context.xml          |   37 +
 .../network/guru/MidoNetPublicNetworkGuru.java  |   19 +-
 .../cloud/network/element/NetscalerElement.java |   52 +-
 .../META-INF/cloudstack/nvp/module.properties   |   18 +
 .../cloudstack/nvp/spring-nvp-context.xml       |   40 +
 .../cloud/network/element/NiciraNvpElement.java |   45 +-
 .../META-INF/cloudstack/ovs/module.properties   |   18 +
 .../cloudstack/ovs/spring-ovs-context.xml       |   40 +
 .../META-INF/cloudstack/ssp/module.properties   |   18 +
 .../cloudstack/ssp/spring-ssp-context.xml       |   42 +
 .../META-INF/cloudstack/vxlan/module.properties |   18 +
 .../cloudstack/vxlan/spring-vxlan-context.xml   |   34 +
 .../storage-image-default/module.properties     |   18 +
 .../spring-storage-image-default-context.xml    |   33 +
 .../storage-image-s3/module.properties          |   18 +
 .../spring-storage-image-s3-context.xml         |   34 +
 .../storage-image-swift/module.properties       |   18 +
 .../spring-storage-image-swift-context.xml      |   33 +
 .../storage-volume-default/module.properties    |   18 +
 .../spring-storage-volume-default-context.xml   |   35 +
 .../CloudStackPrimaryDataStoreDriverImpl.java   |   49 +-
 .../SamplePrimaryDataStoreDriverImpl.java       |   22 +-
 .../storage-volume-solidfire/module.properties  |   18 +
 .../spring-storage-volume-solidfire-context.xml |   33 +
 .../driver/SolidfirePrimaryDataStoreDriver.java |   73 +-
 .../cloudstack/storage/test/AopTestAdvice.java  |    4 +-
 .../META-INF/cloudstack/ldap/module.properties  |   18 +
 .../cloudstack/ldap/spring-ldap-context.xml     |   39 +
 .../META-INF/cloudstack/md5/module.properties   |   18 +
 .../cloudstack/md5/spring-md5-context.xml       |   34 +
 .../cloudstack/plaintext/module.properties      |   18 +
 .../plaintext/spring-plaintext-context.xml      |   35 +
 .../cloudstack/sha256salted/module.properties   |   18 +
 .../spring-sha256salted-context.xml             |   34 +
 pom.xml                                         |   15 +-
 python/lib/cloudutils/serviceConfig.py          |    2 +-
 quickcloud/pom.xml                              |   30 +
 .../spring-quickcloud-core-context-override.xml |   32 +
 .../vm/hypervisor/xenserver/setupxenserver.sh   |    2 +-
 scripts/vm/hypervisor/xenserver/vmops           |    2 +-
 server/conf/cloudstack-sudoers.in               |    2 +-
 server/pom.xml                                  |   15 +-
 .../spring-server-core-managers-context.xml     |  214 ++
 .../core/spring-server-core-misc-context.xml    |   68 +
 .../module.properties                           |   18 +
 ...ing-server-alert-adapter-backend-context.xml |   32 +
 .../module.properties                           |   18 +
 ...ing-server-alert-adapter-compute-context.xml |   32 +
 .../module.properties                           |   18 +
 ...ing-server-alert-adapter-storage-context.xml |   32 +
 .../server-allocator/module.properties          |   18 +
 .../spring-server-allocator-context.xml         |   48 +
 .../cloudstack/server-api/module.properties     |   18 +
 .../server-api/spring-server-api-context.xml    |   33 +
 .../cloudstack/server-compute/module.properties |   18 +
 .../spring-server-compute-context.xml           |   38 +
 .../server-discoverer/module.properties         |   18 +
 .../spring-server-discoverer-context.xml        |   45 +
 .../cloudstack/server-fencer/module.properties  |   18 +
 .../spring-server-fencer-context.xml            |   37 +
 .../server-investigator/module.properties       |   18 +
 .../spring-server-investigator-context.xml      |   46 +
 .../cloudstack/server-network/module.properties |   18 +
 .../spring-server-network-context.xml           |   64 +
 .../cloudstack/server-planner/module.properties |   18 +
 .../spring-server-planner-context.xml           |   34 +
 .../cloudstack/server-storage/module.properties |   18 +
 .../spring-server-storage-context.xml           |   34 +
 .../server-template-adapter/module.properties   |   18 +
 .../spring-server-template-adapter-context.xml  |   32 +
 server/src/com/cloud/api/ApiResponseHelper.java |   22 +-
 server/src/com/cloud/api/ApiServer.java         |   72 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |   59 +-
 .../cloud/api/query/dao/UserVmJoinDaoImpl.java  |   13 +-
 .../com/cloud/api/query/vo/UserVmJoinVO.java    |   15 +
 .../com/cloud/capacity/CapacityManagerImpl.java |  321 +-
 server/src/com/cloud/configuration/Config.java  |    4 +-
 .../configuration/ConfigurationManagerImpl.java |  925 ++---
 .../consoleproxy/ConsoleProxyManagerImpl.java   |   34 +-
 .../consoleproxy/StaticConsoleProxyManager.java |    3 +
 .../cloud/dc/dao/DedicatedResourceDaoImpl.java  |    3 +-
 .../deploy/DeploymentPlanningManagerImpl.java   |  190 +-
 .../com/cloud/event/ActionEventInterceptor.java |   33 +-
 .../ha/HighAvailabilityManagerExtImpl.java      |    7 +-
 .../cloud/ha/dao/HighAvailabilityDaoImpl.java   |    3 +-
 .../cloud/hypervisor/HypervisorGuruBase.java    |    6 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |  116 +-
 .../network/ExternalDeviceUsageManagerImpl.java |  155 +-
 .../ExternalFirewallDeviceManagerImpl.java      |   46 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java  |  171 +-
 .../com/cloud/network/IpAddressManagerImpl.java |  988 +++---
 .../com/cloud/network/NetworkServiceImpl.java   |  605 ++--
 .../cloud/network/NetworkUsageManagerImpl.java  |   50 +-
 .../cloud/network/PortProfileManagerImpl.java   |   39 +-
 .../network/StorageNetworkManagerImpl.java      |  169 +-
 .../cloud/network/as/AutoScaleManagerImpl.java  |  191 +-
 .../network/element/VirtualRouterElement.java   |    8 +-
 .../network/firewall/FirewallManagerImpl.java   |   93 +-
 .../cloud/network/guru/DirectNetworkGuru.java   |  121 +-
 .../network/guru/DirectPodBasedNetworkGuru.java |  113 +-
 .../cloud/network/guru/GuestNetworkGuru.java    |   17 +-
 .../cloud/network/guru/PublicNetworkGuru.java   |   20 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |  395 ++-
 .../VirtualNetworkApplianceManagerImpl.java     |  456 ++-
 .../cloud/network/rules/RulesManagerImpl.java   |  227 +-
 .../security/SecurityGroupManagerImpl.java      |  526 +--
 .../network/vpc/NetworkACLManagerImpl.java      |   40 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |  639 ++--
 .../network/vpn/RemoteAccessVpnManagerImpl.java |  228 +-
 .../com/cloud/projects/ProjectManagerImpl.java  |  365 +-
 .../com/cloud/resource/ResourceManagerImpl.java |  305 +-
 .../resourcelimit/ResourceLimitManagerImpl.java |  333 +-
 .../cloud/server/ConfigurationServerImpl.java   |  637 ++--
 .../com/cloud/server/ManagementServerImpl.java  |   47 +-
 server/src/com/cloud/server/StatsCollector.java |  247 +-
 .../com/cloud/servlet/CloudStartupServlet.java  |    3 +-
 .../com/cloud/servlet/ConsoleProxyServlet.java  |    3 +-
 .../com/cloud/storage/StorageManagerImpl.java   |   30 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |   32 +-
 .../storage/snapshot/SnapshotManagerImpl.java   |   68 +-
 .../cloud/tags/TaggedResourceManagerImpl.java   |  110 +-
 .../com/cloud/template/TemplateAdapterBase.java |   17 +
 .../com/cloud/template/TemplateManagerImpl.java |   42 +-
 server/src/com/cloud/test/DatabaseConfig.java   |   67 +-
 server/src/com/cloud/test/IPRangeConfig.java    |   15 +-
 server/src/com/cloud/test/PodZoneConfig.java    |    7 +-
 .../src/com/cloud/usage/UsageServiceImpl.java   |   28 +-
 .../src/com/cloud/user/AccountManagerImpl.java  |  192 +-
 .../src/com/cloud/user/DomainManagerImpl.java   |   70 +-
 .../cloud/uuididentity/dao/IdentityDaoImpl.java |   13 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  714 ++--
 .../vm/snapshot/VMSnapshotManagerImpl.java      |   45 +-
 .../affinity/AffinityGroupServiceImpl.java      |  107 +-
 .../lb/ApplicationLoadBalancerManagerImpl.java  |   52 +-
 .../cloudstack/region/RegionManagerImpl.java    |    2 +-
 .../GlobalLoadBalancingRulesServiceImpl.java    |  219 +-
 .../configuration/ConfigurationManagerTest.java |   20 +-
 .../cloud/network/CreatePrivateNetworkTest.java |    6 +-
 .../network/DedicateGuestVlanRangesTest.java    |   18 +-
 .../network/UpdatePhysicalNetworkTest.java      |    5 +-
 .../vpn/MockRemoteAccessVPNServiceProvider.java |    5 +-
 .../cloud/vpc/MockConfigurationManagerImpl.java |    2 +-
 .../cloud/vpc/dao/MockConfigurationDaoImpl.java |   11 +-
 .../CreateNetworkOfferingTest.java              |   20 +-
 .../cloudstack/region/RegionManagerTest.java    |   29 +-
 ...GlobalLoadBalancingRulesServiceImplTest.java |   28 +-
 .../module.properties                           |   18 +
 ...ing-secondary-storage-discoverer-context.xml |   36 +
 setup/db/db/schema-420to421.sql                 |  190 +-
 setup/db/db/schema-421to430.sql                 |    2 +
 setup/dev/advanced.cfg                          |    6 +-
 .../debian/config/etc/init.d/cloud-early-config |    1 +
 .../debian/config/opt/cloud/bin/savepassword.sh |   65 +
 .../redundant_router/check_heartbeat.sh.templ   |    5 +-
 .../config/root/redundant_router/fault.sh.templ |    4 +
 .../patches/debian/config/root/savepassword.sh  |   58 -
 .../component/test_egress_fw_rules.py           |  108 +-
 .../component/test_persistent_networks.py       |  290 ++
 tools/appliance/definitions/devcloud/base.sh    |    2 +-
 .../definitions/systemvm64template/base.sh      |    2 +-
 .../systemvm64template/postinstall.sh           |    2 +-
 .../definitions/systemvmtemplate/base.sh        |    2 +-
 .../definitions/systemvmtemplate/postinstall.sh |    2 +-
 .../src/deps/boxes/basebox-build/postinstall.sh |    2 +-
 tools/marvin/marvin/cloudstackConnection.py     |  120 +-
 tools/marvin/marvin/cloudstackTestClient.py     |   55 +-
 tools/marvin/marvin/codegenerator.py            |    2 +-
 tools/marvin/marvin/codes.py                    |   35 +
 tools/marvin/marvin/configGenerator.py          |    9 +-
 tools/marvin/marvin/deployDataCenter.py         |   54 +-
 ui/css/cloudstack3.css                          |   23 +-
 ui/dictionary.jsp                               |    2 +
 ui/index.jsp                                    | 3229 +++++++++---------
 ui/scripts/accounts.js                          |   30 +
 ui/scripts/instanceWizard.js                    |    3 +
 ui/scripts/instances.js                         |   51 +-
 ui/scripts/network.js                           |    4 +-
 ui/scripts/sharedFunctions.js                   |    1 +
 ui/scripts/storage.js                           |    2 +-
 ui/scripts/system.js                            |   38 +-
 ui/scripts/templates.js                         |  105 +-
 ui/scripts/ui-custom/instanceWizard.js          |   67 +-
 ui/scripts/ui/dialog.js                         |   10 +-
 ui/scripts/ui/widgets/detailView.js             |    7 +
 usage/src/com/cloud/usage/UsageManagerImpl.java |   16 +-
 .../src/com/cloud/usage/UsageSanityChecker.java |    4 +-
 utils/pom.xml                                   |   29 +
 utils/src/com/cloud/utils/DateUtil.java         |   41 +-
 utils/src/com/cloud/utils/PropertiesUtil.java   |   16 +
 .../cloud/utils/component/ComponentContext.java |   27 +-
 .../cloud/utils/exception/ExceptionUtil.java    |   12 +
 utils/src/com/cloud/utils/net/NetUtils.java     |   12 +
 utils/src/com/cloud/utils/ssh/SshHelper.java    |   10 +-
 .../com/cloud/utils/PropertiesUtilsTest.java    |   41 +
 .../utils/exception/ExceptionUtilTest.java      |   48 +
 640 files changed, 23160 insertions(+), 13139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 913112c,48416a2..d566b31
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@@ -40,8 -40,8 +40,8 @@@ import com.cloud.utils.db.DB
  import com.cloud.utils.db.GenericDaoBase;
  import com.cloud.utils.db.SearchBuilder;
  import com.cloud.utils.db.SearchCriteria;
 -import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.db.UpdateBuilder;
  
  @Component
@@@ -171,16 -171,6 +171,16 @@@ public class SnapshotDataStoreDaoImpl e
      }
  
      @Override
 +    public void deleteSnapshotRecordsOnPrimary() {
 +        SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
 +        sc.setParameters("store_role", DataStoreRole.Primary);
-         Transaction txn = Transaction.currentTxn();
++        TransactionLegacy txn = TransactionLegacy.currentTxn();
 +        txn.start();
 +        remove(sc);
 +        txn.commit();
 +    }
 +
 +    @Override
      public SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId) {
          SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
          sc.setParameters("store_id", storeId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 5c1ec33,4509e23..b7c70cc
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@@ -47,9 -43,8 +47,9 @@@ import com.cloud.utils.db.GenericDaoBas
  import com.cloud.utils.db.SearchBuilder;
  import com.cloud.utils.db.SearchCriteria;
  import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.db.UpdateBuilder;
 +import com.cloud.utils.exception.CloudRuntimeException;
  
  @Component
  public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO, Long> implements TemplateDataStoreDao {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 4118079,2bacd03..ef0a8c5
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@@ -34,8 -33,8 +34,8 @@@ import org.apache.cloudstack.storage.da
  import com.cloud.utils.db.GenericDaoBase;
  import com.cloud.utils.db.SearchBuilder;
  import com.cloud.utils.db.SearchCriteria;
 -import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.db.SearchCriteria.Op;
- import com.cloud.utils.db.Transaction;
++import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.db.UpdateBuilder;
  
  @Component

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index e3d4137,bce6b45..5273203
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -2214,27 -2215,26 +2217,26 @@@ public class ManagementServerImpl exten
              }
          }
  
-         Transaction txn = Transaction.currentTxn();
- 
-         txn.start();
- 
+         Transaction.execute(new TransactionCallbackNoReturn() {
+             @Override
+             public void doInTransactionWithoutResult(TransactionStatus status) {
 -                if (domainName != null) {
 -                    String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
 -                    updateDomainChildren(domain, updatedDomainPath);
 -                    domain.setName(domainName);
 -                    domain.setPath(updatedDomainPath);
 -                }
 -        
 -                if (networkDomain != null) {
 -                    if (networkDomain.isEmpty()) {
 -                        domain.setNetworkDomain(null);
 -                    } else {
 -                        domain.setNetworkDomain(networkDomain);
 -                    }
 -                }
 -                _domainDao.update(domainId, domain);
 +        if (domainName != null) {
 +            String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
 +            updateDomainChildren(domain, updatedDomainPath);
 +            domain.setName(domainName);
 +            domain.setPath(updatedDomainPath);
 +        }
 +
 +        if (networkDomain != null) {
 +            if (networkDomain.isEmpty()) {
 +                domain.setNetworkDomain(null);
 +            } else {
 +                domain.setNetworkDomain(networkDomain);
 +            }
 +        }
 +        _domainDao.update(domainId, domain);
- 
-         txn.commit();
+             }
+         });
  
          return _domainDao.findById(domainId);
  
@@@ -3671,35 -3670,30 +3673,30 @@@
                  throw new InvalidParameterValueException("This operation is not supported for this hypervisor type");
              }
              // get all the hosts in this cluster
-             List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
-             Transaction txn = Transaction.currentTxn();
-             try {
-                 txn.start();
+             final List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
+ 
+             Transaction.execute(new TransactionCallbackNoReturn() {
+                 @Override
+                 public void doInTransactionWithoutResult(TransactionStatus status) {
 -                    for (HostVO h : hosts) {
 -                        if (s_logger.isDebugEnabled()) {
 -                            s_logger.debug("Changing password for host name = " + h.getName());
 -                        }
 -                        // update password for this host
 -                        DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
 -                        if (nv.getValue().equals(cmd.getUsername())) {
 -                            DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
 -                            nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
 -                            _detailsDao.persist(nvp);
 -                        } else {
 -                            // if one host in the cluster has diff username then
 -                            // rollback to maintain consistency
 -                            throw new InvalidParameterValueException(
 -                                    "The username is not same for all hosts, please modify passwords for individual hosts.");
 -                        }
 +                for (HostVO h : hosts) {
 +                    if (s_logger.isDebugEnabled()) {
 +                        s_logger.debug("Changing password for host name = " + h.getName());
 +                    }
 +                    // update password for this host
 +                    DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
 +                    if (nv.getValue().equals(cmd.getUsername())) {
 +                        DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
 +                        nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
 +                        _detailsDao.persist(nvp);
 +                    } else {
 +                        // if one host in the cluster has diff username then
 +                        // rollback to maintain consistency
-                         txn.rollback();
 +                        throw new InvalidParameterValueException(
 +                                "The username is not same for all hosts, please modify passwords for individual hosts.");
                      }
                  }
-                 txn.commit();
-                 // if hypervisor is xenserver then we update it in
-                 // CitrixResourceBase
-             } catch (Exception e) {
-                 txn.rollback();
-                 throw new CloudRuntimeException("Failed to update password " + e.getMessage());
 +            }
+             });
          }
  
          return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/StorageManagerImpl.java
index eaefcb2,75cedd0..8e199ee
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@@ -1810,17 -1782,20 +1814,20 @@@ public class StorageManagerImpl extend
          }
  
          // ready to delete
-         Transaction txn = Transaction.currentTxn();
-         txn.start();
+         Transaction.execute(new TransactionCallbackNoReturn() {
+             @Override
+             public void doInTransactionWithoutResult(TransactionStatus status) {
 -                // 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.Image);
 -                _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
 -                _templateStoreDao.deletePrimaryRecordsForStore(storeId);
 -                _imageStoreDao.remove(storeId);
 +        // 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.Image);
 +        _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
 +        _templateStoreDao.deletePrimaryRecordsForStore(storeId);
 +        _imageStoreDao.remove(storeId);
-         txn.commit();
+             }
+         });
+ 
          return true;
      }
  
@@@ -1919,17 -1894,20 +1926,20 @@@
          }
  
          // ready to delete
-         Transaction txn = Transaction.currentTxn();
-         txn.start();
+         Transaction.execute(new TransactionCallbackNoReturn() {
+             @Override
+             public void doInTransactionWithoutResult(TransactionStatus status) {
 -                // 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);
 +        // 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;
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 12f0102,071281c..cfb54f0
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@@ -404,35 -405,35 +406,35 @@@ public class VolumeApiServiceImpl exten
      }
  
      @DB
-     protected VolumeVO persistVolume(Account owner, Long zoneId, String volumeName, String url, String format) {
- 
-         Transaction txn = Transaction.currentTxn();
-         txn.start();
- 
+     protected VolumeVO persistVolume(final Account owner, final Long zoneId, final String volumeName, final String url, final String format) {
+         return Transaction.execute(new TransactionCallback<VolumeVO>() {
+             @Override
+             public VolumeVO doInTransaction(TransactionStatus status) {
 -                VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 -                volume.setPoolId(null);
 -                volume.setDataCenterId(zoneId);
 -                volume.setPodId(null);
 -                volume.setAccountId(owner.getAccountId());
 -                volume.setDomainId(owner.getDomainId());
 -                long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
 -                volume.setDiskOfferingId(diskOfferingId);
 -                // volume.setSize(size);
 -                volume.setInstanceId(null);
 -                volume.setUpdated(new Date());
 -                volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
 -                volume.setFormat(ImageFormat.valueOf(format));
 -                volume = _volsDao.persist(volume);
 -                CallContext.current().setEventDetails("Volume Id: " + volume.getId());
 -        
 -                // Increment resource count during allocation; if actual creation fails,
 -                // decrement it
 -                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
 -                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
 -                
 -                return volume;
 -            }
 +        VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 +        volume.setPoolId(null);
 +        volume.setDataCenterId(zoneId);
 +        volume.setPodId(null);
 +        volume.setAccountId(owner.getAccountId());
 +        volume.setDomainId(owner.getDomainId());
 +        long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
 +        volume.setDiskOfferingId(diskOfferingId);
 +        // volume.setSize(size);
 +        volume.setInstanceId(null);
 +        volume.setUpdated(new Date());
 +        volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
 +        volume.setFormat(ImageFormat.valueOf(format));
 +        volume = _volsDao.persist(volume);
 +        CallContext.current().setEventDetails("Volume Id: " + volume.getId());
 +
 +        // Increment resource count during allocation; if actual creation fails,
 +        // decrement it
 +        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
 +        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
 +
-         txn.commit();
 +        return volume;
 +    }
+         });
+     }
  
      /*
       * Just allocate a volume in the database, don't send the createvolume cmd
@@@ -600,48 -601,56 +602,56 @@@
              userSpecifiedName = getRandomVolumeName();
          }
  
-         Transaction txn = Transaction.currentTxn();
-         txn.start();
+         VolumeVO volume = commitVolume(cmd, caller, ownerId, displayVolumeEnabled, zoneId, diskOfferingId, size,
+                 minIops, maxIops, parentVolume, userSpecifiedName);
  
+         return volume;
+     }
+ 
+     private VolumeVO commitVolume(final CreateVolumeCmd cmd, final Account caller, final long ownerId, final Boolean displayVolumeEnabled,
+             final Long zoneId, final Long diskOfferingId, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume,
+             final String userSpecifiedName) {
+         return Transaction.execute(new TransactionCallback<VolumeVO>() {
+             @Override
+             public VolumeVO doInTransaction(TransactionStatus status) {
 -                VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 -                volume.setPoolId(null);
 -                volume.setDataCenterId(zoneId);
 -                volume.setPodId(null);
 -                volume.setAccountId(ownerId);
 -                volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
 -                volume.setDiskOfferingId(diskOfferingId);
 -                volume.setSize(size);
 -                volume.setMinIops(minIops);
 -                volume.setMaxIops(maxIops);
 -                volume.setInstanceId(null);
 -                volume.setUpdated(new Date());
 -                volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
 -                volume.setDisplayVolume(displayVolumeEnabled);
 -                if (parentVolume != null) {
 -                    volume.setTemplateId(parentVolume.getTemplateId());
 -                    volume.setFormat(parentVolume.getFormat());
 -                } else {
 -                    volume.setTemplateId(null);
 -                }
 -        
 -                volume = _volsDao.persist(volume);
 -                if (cmd.getSnapshotId() == null) {
 -                    // for volume created from snapshot, create usage event after volume creation
 -                    UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
 -                            null, size, Volume.class.getName(), volume.getUuid());
 -                }
 -        
 -                CallContext.current().setEventDetails("Volume Id: " + volume.getId());
 -        
 -                // Increment resource count during allocation; if actual creation fails,
 -                // decrement it
 -                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
 -                _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
 -                return volume;
 -            }
 +        VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 +        volume.setPoolId(null);
 +        volume.setDataCenterId(zoneId);
 +        volume.setPodId(null);
 +        volume.setAccountId(ownerId);
 +        volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
 +        volume.setDiskOfferingId(diskOfferingId);
 +        volume.setSize(size);
 +        volume.setMinIops(minIops);
 +        volume.setMaxIops(maxIops);
 +        volume.setInstanceId(null);
 +        volume.setUpdated(new Date());
 +        volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
 +        volume.setDisplayVolume(displayVolumeEnabled);
 +        if (parentVolume != null) {
 +            volume.setTemplateId(parentVolume.getTemplateId());
 +            volume.setFormat(parentVolume.getFormat());
 +        } else {
 +            volume.setTemplateId(null);
 +        }
 +
 +        volume = _volsDao.persist(volume);
 +        if (cmd.getSnapshotId() == null) {
 +            // for volume created from snapshot, create usage event after volume creation
 +            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
 +                    null, size, Volume.class.getName(), volume.getUuid());
 +        }
 +
 +        CallContext.current().setEventDetails("Volume Id: " + volume.getId());
 +
 +        // Increment resource count during allocation; if actual creation fails,
 +        // decrement it
 +        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
 +        _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
- 
-         txn.commit();
- 
 +        return volume;
 +    }
+         });
+     }
  
      public boolean validateVolumeSizeRange(long size) {
          if (size < 0 || (size > 0 && size < (1024 * 1024 * 1024))) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7a1ee002/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateManagerImpl.java
index 3b2ec58,fb1bb27..aa4473d
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@@ -1290,28 -1284,31 +1290,31 @@@ public class TemplateManagerImpl extend
  
          //Derive the domain id from the template owner as updateTemplatePermissions is not cross domain operation
          Account owner = _accountMgr.getAccount(ownerId);
-         Domain domain = _domainDao.findById(owner.getDomainId());
+         final Domain domain = _domainDao.findById(owner.getDomainId());
          if ("add".equalsIgnoreCase(operation)) {
-             txn.start();
-             for (String accountName : accountNames) {
+             final List<String> accountNamesFinal = accountNames; 
+             Transaction.execute(new TransactionCallbackNoReturn() {
+                 @Override
+                 public void doInTransactionWithoutResult(TransactionStatus status) {
+                     for (String accountName : accountNamesFinal) {
 -                        Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
 -                        if (permittedAccount != null) {
 -                            if (permittedAccount.getId() == caller.getId()) {
 -                                continue; // don't grant permission to the template
 -                                // owner, they implicitly have permission
 -                            }
 -                            LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
 -                            if (existingPermission == null) {
 -                                LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
 -                                _launchPermissionDao.persist(launchPermission);
 -                            }
 -                        } else {
 -                            throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
 -                                    + ", account not found.  " + "No permissions updated, please verify the account names and retry.");
 -                        }
 +                Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
 +                if (permittedAccount != null) {
 +                    if (permittedAccount.getId() == caller.getId()) {
 +                        continue; // don't grant permission to the template
 +                        // owner, they implicitly have permission
                      }
 +                    LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
 +                    if (existingPermission == null) {
 +                        LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
 +                        _launchPermissionDao.persist(launchPermission);
 +                    }
 +                } else {
-                     txn.rollback();
 +                    throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
 +                            + ", account not found.  " + "No permissions updated, please verify the account names and retry.");
 +                }
 +            }
-             txn.commit();
+                 }
+             });
          } else if ("remove".equalsIgnoreCase(operation)) {
              List<Long> accountIds = new ArrayList<Long>();
              for (String accountName : accountNames) {
@@@ -1434,26 -1431,31 +1437,31 @@@
                          zoneId, accountId, volumeId);
              }*/
              if (privateTemplate == null) {
-                 Transaction txn = Transaction.currentTxn();
-                 txn.start();
+                 final VolumeVO volumeFinal = volume;
+                 final SnapshotVO snapshotFinal = snapshot;
+                 Transaction.execute(new TransactionCallbackNoReturn() {
+                     @Override
+                     public void doInTransactionWithoutResult(TransactionStatus status) {
 -                        // template_store_ref entries should have been removed using our
 -                        // DataObject.processEvent command in case of failure, but clean
 -                        // it up here to avoid
 -                        // some leftovers which will cause removing template from
 -                        // vm_template table fail.
 -                        _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
 -                        // Remove the template_zone_ref record
 -                        _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
 -                        // Remove the template record
 -                        _tmpltDao.expunge(templateId);
 -        
 -                        // decrement resource count
 -                        if (accountId != null) {
 -                            _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
 +                // template_store_ref entries should have been removed using our
 +                // DataObject.processEvent command in case of failure, but clean
 +                // it up here to avoid
 +                // some leftovers which will cause removing template from
 +                // vm_template table fail.
 +                _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
 +                // Remove the template_zone_ref record
 +                _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
 +                // Remove the template record
 +                _tmpltDao.expunge(templateId);
 +
 +                // decrement resource count
 +                if (accountId != null) {
 +                    _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
-                     _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volume != null ? volume.getSize()
-                             : snapshot.getSize()));
+                             _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volumeFinal != null ? volumeFinal.getSize()
+                                     : snapshotFinal.getSize()));
 -                        }
 +                }
-                 txn.commit();
+                     }
+                 });
+ 
              }
          }
  


[2/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Mark templates stored in current NFS secondary storage as cross-zones
when we invoke prepareSecondaryStorageForMigrationCmd.

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

Branch: refs/heads/object_store_migration
Commit: 1b07c3348174a56d81d951febd33d24032fe4b32
Parents: 6935dd2
Author: Min Chen <mi...@citrix.com>
Authored: Mon Oct 21 11:52:12 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Oct 21 11:52:12 2013 -0700

----------------------------------------------------------------------
 .../subsystem/api/storage/TemplateService.java  |  4 +++-
 .../storage/image/TemplateServiceImpl.java      | 11 +++++----
 .../image/db/TemplateDataStoreDaoImpl.java      | 25 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index 4950597..0d8b3c1 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -36,7 +36,7 @@ public interface TemplateService {
         }
 
         public TemplateInfo getTemplate() {
-            return this.template;
+            return template;
         }
     }
 
@@ -62,5 +62,7 @@ public interface TemplateService {
 
     void addSystemVMTemplatesToSecondary(DataStore store);
     
+    void associateTemplateToZone(long templateId, Long zoneId);
+
     void associateCrosszoneTemplatesToZone(long dcId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index a68e40c..06cb652 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -28,6 +28,9 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
@@ -59,9 +62,6 @@ import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
 import org.apache.cloudstack.storage.image.store.TemplateObject;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.ListTemplateAnswer;
 import com.cloud.agent.api.storage.ListTemplateCommand;
@@ -73,8 +73,8 @@ import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.StoragePool;
 import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.StoragePool;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VMTemplateZoneVO;
@@ -466,7 +466,8 @@ public class TemplateServiceImpl implements TemplateService {
     // persist entry in template_zone_ref table. zoneId can be empty for
     // region-wide image store, in that case,
     // we will associate the template to all the zones.
-    private void associateTemplateToZone(long templateId, Long zoneId) {
+    @Override
+    public void associateTemplateToZone(long templateId, Long zoneId) {
         List<Long> dcs = new ArrayList<Long>();
         if (zoneId != null) {
             dcs.add(zoneId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b07c334/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 a102537..008180f 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
@@ -33,18 +33,22 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 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
 public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO, Long> implements TemplateDataStoreDao {
@@ -61,6 +65,11 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
     @Inject
     private DataStoreManager _storeMgr;
 
+    @Inject
+    private VMTemplateDao _tmpltDao;
+    @Inject
+    private TemplateService _tmplSrv;
+
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         super.configure(name, params);
@@ -368,8 +377,24 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
                 ts.setRefCnt(tmpl.getRefCnt() + 1); // increase ref_cnt so that this will not be recycled before the content is pushed to region-wide store
                 persist(ts);
             }
+
+            // mark template as cross-zones and add template_zone association
+            for (TemplateDataStoreVO tmpl : tmpls) {
+                long templateId = tmpl.getTemplateId();
+                VMTemplateVO template = _tmpltDao.findById(templateId);
+                if (template == null) {
+                    throw new CloudRuntimeException("No template is found for template id: " + templateId);
+                }
+                // mark the template as cross-zones
+                template.setCrossZones(true);
+                _tmpltDao.update(templateId, template);
+                // add template_zone_ref association for these cross-zone templates
+                _tmplSrv.associateTemplateToZone(templateId, null);
+            }
+
         }
 
+
     }
 
 }


[5/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Modify various cache object deletion cases in orchestration layer to
handle cache store migrated from previous secondary storage.

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

Branch: refs/heads/object_store_migration
Commit: 1722c48087f663c1931814c36802cace1a52d898
Parents: 730832d
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 15:16:52 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 15:16:52 2013 -0700

----------------------------------------------------------------------
 .../motion/AncientDataMotionStrategy.java       | 30 +++++++++++++-------
 .../storage/image/TemplateServiceImpl.java      |  4 +++
 2 files changed, 24 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1722c480/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 5f5f01e..0d21047 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -22,6 +22,9 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -49,8 +52,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.MigrateVolumeAnswer;
@@ -211,7 +212,8 @@ AncientDataMotionStrategy implements DataMotionStrategy {
                     cacheMgr.deleteCacheObject(srcForCopy);
                 } else {
                     // for template, we want to leave it on cache for performance reason
-                    if (answer == null || !answer.getResult()) {
+                    if ((answer == null || !answer.getResult()) && srcForCopy.getRefCount() < 2) {
+                        // cache object created by this copy, not already there
                         cacheMgr.deleteCacheObject(srcForCopy);
                     } else {
                         cacheMgr.releaseCacheObject(srcForCopy);
@@ -248,6 +250,13 @@ AncientDataMotionStrategy implements DataMotionStrategy {
         }
     }
 
+    protected void releaseSnapshotCacheChain(SnapshotInfo snapshot) {
+        while (snapshot != null) {
+            cacheMgr.releaseCacheObject(snapshot);
+            snapshot = snapshot.getParent();
+        }
+    }
+
     protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) {
         SnapshotInfo snapshot = (SnapshotInfo) snapObj;
         StoragePool pool = (StoragePool) volObj.getDataStore();
@@ -281,7 +290,8 @@ AncientDataMotionStrategy implements DataMotionStrategy {
             throw new CloudRuntimeException(basicErrMsg);
         } finally {
             if (!(storTO instanceof NfsTO)) {
-                deleteSnapshotCacheChain((SnapshotInfo) srcData);
+                // still keep snapshot on cache which may be migrated from previous secondary storage
+                releaseSnapshotCacheChain((SnapshotInfo)srcData);
             }
         }
     }
@@ -307,7 +317,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
         if (cacheStore == null) {
             // need to find a nfs or cifs image store, assuming that can't copy volume
             // directly to s3
-            ImageStoreEntity imageStore = (ImageStoreEntity) this.dataStoreMgr.getImageStore(destScope.getScopeId());
+            ImageStoreEntity imageStore = (ImageStoreEntity) dataStoreMgr.getImageStore(destScope.getScopeId());
             if (!imageStore.getProtocol().equalsIgnoreCase("nfs") && !imageStore.getProtocol().equalsIgnoreCase("cifs")) {
                 s_logger.debug("can't find a nfs (or cifs) image store to satisfy the need for a staging store");
                 return null;
@@ -316,7 +326,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
             DataObject objOnImageStore = imageStore.create(srcData);
             objOnImageStore.processEvent(Event.CreateOnlyRequested);
 
-            Answer answer = this.copyObject(srcData, objOnImageStore);
+            Answer answer = copyObject(srcData, objOnImageStore);
             if (answer == null || !answer.getResult()) {
                 if (answer != null) {
                     s_logger.debug("copy to image store failed: " + answer.getDetails());
@@ -362,7 +372,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
 
     protected Answer migrateVolumeToPool(DataObject srcData, DataObject destData) {
         VolumeInfo volume = (VolumeInfo)srcData;
-        StoragePool destPool = (StoragePool)this.dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
+        StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
         MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(), destPool);
         EndPoint ep = selector.select(volume.getDataStore());
         MigrateVolumeAnswer answer = (MigrateVolumeAnswer) ep.sendMessage(command);
@@ -371,14 +381,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
             throw new CloudRuntimeException("Failed to migrate volume " + volume + " to storage pool " + destPool);
         } else {
             // Update the volume details after migration.
-            VolumeVO volumeVo = this.volDao.findById(volume.getId());
+            VolumeVO volumeVo = volDao.findById(volume.getId());
             Long oldPoolId = volume.getPoolId();
             volumeVo.setPath(answer.getVolumePath());
             volumeVo.setFolder(destPool.getPath());
             volumeVo.setPodId(destPool.getPodId());
             volumeVo.setPoolId(destPool.getId());
             volumeVo.setLastPoolId(oldPoolId);
-            this.volDao.update(volume.getId(), volumeVo);
+            volDao.update(volume.getId(), volumeVo);
         }
 
         return answer;
@@ -452,7 +462,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
 
         // clean up snapshot copied to staging
         if (needCache && srcData != null) {
-            cacheMgr.deleteCacheObject(srcData);
+            cacheMgr.releaseCacheObject(srcData);  // reduce ref count, but keep it there on cache which is converted from previous secondary storage
         }
         return answer;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1722c480/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
index 163c125..4121e85 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java
@@ -42,6 +42,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
@@ -129,6 +130,8 @@ public class TemplateServiceImpl implements TemplateService {
     TemplateManager _tmpltMgr;
     @Inject
     ConfigurationDao _configDao;
+    @Inject
+    StorageCacheManager _cacheMgr;
 
     class TemplateOpContext<T> extends AsyncRpcContext<T> {
         final TemplateObject template;
@@ -670,6 +673,7 @@ public class TemplateServiceImpl implements TemplateService {
                         throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName() + ":"
                                 + result.getResult());
                     }
+                    _cacheMgr.releaseCacheObject(srcTemplate); // reduce reference count for template on cache, so it can recycled by schedule
                 } catch (Exception ex) {
                     throw new CloudRuntimeException("sync template from cache to region wide store failed for image store " + store.getName());
                 }


[6/8] git commit: updated refs/heads/object_store_migration to 9da56fe

Posted by mc...@apache.org.
Clear snapshot entry on primary from snapshot_store_ref when we migrate
secondary storage to object store so that next snapshot will be full
snapshot.

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

Branch: refs/heads/object_store_migration
Commit: 81686e862c03fa8fd593e50490a2f80d5559d590
Parents: 1722c48
Author: Min Chen <mi...@citrix.com>
Authored: Wed Oct 23 15:57:08 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Oct 23 15:57:08 2013 -0700

----------------------------------------------------------------------
 .../storage/datastore/db/SnapshotDataStoreDao.java        |  3 +++
 .../storage/image/datastore/ImageStoreHelper.java         |  5 +++++
 .../storage/image/db/SnapshotDataStoreDaoImpl.java        | 10 ++++++++++
 3 files changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index 19eac38..9cde86d 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -44,5 +44,8 @@ StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Even
 
     void duplicateCacheRecordsOnRegionStore(long storeId);
 
+    // delete the snapshot entry on primary data store to make sure that next snapshot will be full snapshot
+    void deleteSnapshotRecordsOnPrimary();
+
     List<SnapshotDataStoreVO> listOnCache(long snapshotId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
index 4b202f5..e2c48ea 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.ScopeType;
@@ -42,6 +43,8 @@ public class ImageStoreHelper {
     ImageStoreDao imageStoreDao;
     @Inject
     ImageStoreDetailsDao imageStoreDetailsDao;
+    @Inject
+    SnapshotDataStoreDao snapshotStoreDao;
 
     public ImageStoreVO createImageStore(Map<String, Object> params) {
         ImageStoreVO store = imageStoreDao.findByName((String) params.get("name"));
@@ -127,6 +130,8 @@ public class ImageStoreHelper {
         ImageStoreVO nfsStore = imageStoreDao.findById(store.getId());
         nfsStore.setRole(DataStoreRole.ImageCache);
         imageStoreDao.update(store.getId(), nfsStore);
+        // clear snapshot entry on primary store to make next snapshot become full snapshot
+        snapshotStoreDao.deleteSnapshotRecordsOnPrimary();
         return true;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/81686e86/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 96a0c17..913112c 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
@@ -171,6 +171,16 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
     }
 
     @Override
+    public void deleteSnapshotRecordsOnPrimary() {
+        SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
+        sc.setParameters("store_role", DataStoreRole.Primary);
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        remove(sc);
+        txn.commit();
+    }
+
+    @Override
     public SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId) {
         SearchCriteria<SnapshotDataStoreVO> sc = storeSnapshotSearch.create();
         sc.setParameters("store_id", storeId);