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

[42/50] [abbrv] git commit: refs/heads/storage_refactor - squash changes into one giant patch

squash changes into one giant patch


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

Branch: refs/heads/storage_refactor
Commit: a9b79359140747440315a1046dc544456b944023
Parents: d346f63
Author: Edison Su <ed...@citrix.com>
Authored: Wed Jan 30 19:13:34 2013 -0800
Committer: Edison Su <su...@gmail.com>
Committed: Wed Feb 13 15:28:43 2013 -0800

----------------------------------------------------------------------
 .../agent/api/CreateVolumeFromSnapshotCommand.java |    1 +
 api/src/com/cloud/storage/StoragePool.java         |    9 +-
 api/src/com/cloud/storage/StoragePoolStatus.java   |    9 +-
 api/src/com/cloud/storage/StorageService.java      |   53 -
 api/src/com/cloud/storage/Volume.java              |   17 +-
 api/src/com/cloud/storage/VolumeApiService.java    |   80 +
 api/src/com/cloud/template/TemplateService.java    |   10 +
 api/src/com/cloud/vm/UserVmService.java            |   41 -
 .../org/apache/cloudstack/api/ApiConstants.java    |    1 +
 api/src/org/apache/cloudstack/api/BaseCmd.java     |    3 +-
 .../admin/storage/CreateStoragePoolCmd.java        |   17 +
 .../api/command/user/iso/RegisterIsoCmd.java       |    8 +
 .../command/user/template/CreateTemplateCmd.java   |    4 +-
 .../command/user/template/RegisterTemplateCmd.java |   10 +-
 .../api/command/user/volume/AttachVolumeCmd.java   |    2 +-
 .../api/command/user/volume/CreateVolumeCmd.java   |    4 +-
 .../api/command/user/volume/DeleteVolumeCmd.java   |    2 +-
 .../api/command/user/volume/DetachVolumeCmd.java   |    2 +-
 .../api/command/user/volume/MigrateVolumeCmd.java  |    2 +-
 .../api/command/user/volume/ResizeVolumeCmd.java   |    2 +-
 .../api/command/user/volume/UploadVolumeCmd.java   |   10 +-
 .../api/agent/test/BackupSnapshotCommandTest.java  |    6 +-
 .../api/agent/test/SnapshotCommandTest.java        |   12 +-
 .../agent/api/test/ResizeVolumeCommandTest.java    |    6 +-
 client/pom.xml                                     |    3 +-
 core/pom.xml                                       |    6 +-
 .../com/cloud/storage/StoragePoolDiscoverer.java   |    2 +
 core/src/com/cloud/storage/StoragePoolVO.java      |  346 --
 core/src/com/cloud/storage/VMTemplateHostVO.java   |   41 +-
 .../com/cloud/storage/VMTemplateStoragePoolVO.java |   43 +-
 core/src/com/cloud/storage/VMTemplateVO.java       |   70 +-
 core/src/com/cloud/storage/VolumeHostVO.java       |   41 +-
 core/src/com/cloud/storage/VolumeVO.java           |    8 +-
 engine/api/pom.xml                                 |    2 +-
 .../engine/subsystem/api/storage/DataObject.java   |    1 +
 .../subsystem/api/storage/DataObjectInStore.java   |   26 +
 .../engine/subsystem/api/storage/DataStore.java    |    3 +
 .../subsystem/api/storage/DataStoreLifeCycle.java  |   14 +-
 .../subsystem/api/storage/DataStoreManager.java    |   31 +
 .../subsystem/api/storage/DataStoreProvider.java   |   30 +
 .../api/storage/DataStoreProviderManager.java      |   31 +
 .../subsystem/api/storage/DataStoreStatus.java     |   23 +
 .../api/storage/HypervisorHostListener.java        |   24 +
 .../subsystem/api/storage/ImageDataFactory.java    |   26 +
 .../engine/subsystem/api/storage/ImageService.java |   29 +
 .../api/storage/ObjectInDataStoreStateMachine.java |   55 +
 .../api/storage/PrimaryDataStoreInfo.java          |   14 +-
 .../subsystem/api/storage/SnapshotDataFactory.java |   26 +
 .../engine/subsystem/api/storage/SnapshotInfo.java |   24 +
 .../subsystem/api/storage/TemplateEvent.java       |   26 +
 .../engine/subsystem/api/storage/TemplateInfo.java |   22 +
 .../subsystem/api/storage/TemplateState.java       |   27 +
 .../subsystem/api/storage/VolumeDataFactory.java   |   26 +
 .../engine/subsystem/api/storage/VolumeInfo.java   |    6 +-
 .../subsystem/api/storage/VolumeService.java       |   78 +
 .../storage/datastore/db/DataStoreProviderDao.java |   25 +
 .../datastore/db/DataStoreProviderDaoImpl.java     |   38 +
 .../storage/datastore/db/DataStoreProviderVO.java  |   60 +
 .../storage/datastore/db/PrimaryDataStoreDao.java  |  116 +
 .../datastore/db/PrimaryDataStoreDaoImpl.java      |  360 ++
 .../datastore/db/PrimaryDataStoreDetailVO.java     |   79 +
 .../datastore/db/PrimaryDataStoreDetailsDao.java   |   27 +
 .../db/PrimaryDataStoreDetailsDaoImpl.java         |   71 +
 .../storage/datastore/db/StoragePoolVO.java        |  304 ++
 .../cloud/entity/api/VMEntityManagerImpl.java      |   13 +-
 .../cloudstack/storage/backup/BackupService.java   |    2 +-
 .../storage/image/ImageDataFactoryImpl.java        |   56 +-
 .../cloudstack/storage/image/ImageServiceImpl.java |   95 +-
 .../storage/image/downloader/ImageDownloader.java  |    2 +-
 .../driver/AncientImageDataStoreDriverImpl.java    |  187 +
 .../driver/DefaultImageDataStoreDriverImpl.java    |    6 +-
 .../storage/image/manager/ImageDataManager.java    |    8 +-
 .../image/manager/ImageDataManagerImpl.java        |   12 +-
 .../image/manager/ImageDataStoreManagerImpl.java   |   38 +-
 .../image/store/AncientImageDataStoreProvider.java |   92 +
 .../image/store/DefaultImageDataStoreImpl.java     |  145 +
 .../image/store/DefaultImageDataStoreProvider.java |    2 -
 .../storage/image/store/HttpDataStoreImpl.java     |  144 -
 .../storage/image/store/TemplateObject.java        |   82 +-
 .../lifecycle/DefaultImageDataStoreLifeCycle.java  |   23 +-
 .../image/motion/DefaultImageMotionStrategy.java   |    9 +-
 .../image/motion/ImageMotionServiceImpl.java       |   12 +-
 .../storage/test/ChildTestConfiguration.java       |   58 +-
 .../storage/test/MockStorageMotionStrategy.java    |   42 +
 .../cloudstack/storage/test/volumeServiceTest.java |   65 +-
 .../integration-test/test/resource/component.xml   |  201 +
 .../test/resource/storageContext.xml               |    1 +
 .../storage/snapshot/SnapshotDataFactoryImpl.java  |   22 +-
 .../storage/snapshot/SnapshotObject.java           |    8 +
 .../storage/snapshot/SnapshotServiceImpl.java      |    1 +
 .../snapshot/strategy/HypervisorBasedSnapshot.java |    2 +-
 .../snapshot/strategy/StorageBasedSnapshot.java    |    2 +-
 .../storage/datastore/DataObjectManagerImpl.java   |   76 +-
 .../storage/datastore/DataStoreManager.java        |   29 -
 .../storage/datastore/DataStoreManagerImpl.java    |   20 +
 .../storage/datastore/DataStoreStatus.java         |   23 -
 .../datastore/ObjectInDataStoreManager.java        |   18 +-
 .../datastore/ObjectInDataStoreManagerImpl.java    |  185 +-
 .../storage/datastore/PrimaryDataStore.java        |   25 +-
 .../datastore/PrimaryDataStoreEntityImpl.java      |   23 +-
 .../datastore/PrimaryDataStoreProviderManager.java |    3 +
 .../storage/datastore/VolumeDataFactory.java       |   26 -
 .../storage/datastore/db/DataStoreProviderDao.java |   25 -
 .../datastore/db/DataStoreProviderDaoImpl.java     |   38 -
 .../storage/datastore/db/DataStoreProviderVO.java  |   60 -
 .../storage/datastore/db/PrimaryDataStoreDao.java  |  116 -
 .../datastore/db/PrimaryDataStoreDaoImpl.java      |  360 --
 .../datastore/db/PrimaryDataStoreDetailVO.java     |   79 -
 .../datastore/db/PrimaryDataStoreDetailsDao.java   |   28 -
 .../db/PrimaryDataStoreDetailsDaoImpl.java         |   71 -
 .../storage/datastore/db/PrimaryDataStoreVO.java   |  267 -
 .../datastore/provider/DataStoreProvider.java      |   32 -
 .../provider/DataStoreProviderManager.java         |   30 -
 .../provider/DataStoreProviderManagerImpl.java     |   30 +-
 .../datastore/provider/ImageDataStoreProvider.java |    2 +
 .../provider/PrimaryDataStoreProvider.java         |    2 +
 .../storage/db/ObjectInDataStoreDao.java           |    6 +-
 .../storage/db/ObjectInDataStoreDaoImpl.java       |   11 +-
 .../cloudstack/storage/db/ObjectInDataStoreVO.java |   39 +-
 .../cloudstack/storage/image/ImageDataFactory.java |   25 -
 .../cloudstack/storage/image/ImageService.java     |   28 -
 .../storage/image/TemplateEntityImpl.java          |    1 +
 .../cloudstack/storage/image/TemplateEvent.java    |   26 -
 .../cloudstack/storage/image/TemplateInfo.java     |   27 -
 .../cloudstack/storage/image/TemplateState.java    |   27 -
 .../storage/image/datastore/ImageDataStore.java    |    4 +-
 .../image/datastore/ImageDataStoreHelper.java      |   16 +-
 .../image/datastore/ImageDataStoreManager.java     |    5 +
 .../cloudstack/storage/image/db/ImageDataDao.java  |   85 -
 .../storage/image/db/ImageDataDaoImpl.java         |  975 ----
 .../cloudstack/storage/image/db/ImageDataVO.java   |  450 --
 .../storage/image/motion/ImageMotionService.java   |    2 +-
 .../storage/motion/AncientDataMotionStrategy.java  |  581 ++
 .../storage/snapshot/SnapshotDataFactory.java      |   25 -
 .../cloudstack/storage/snapshot/SnapshotInfo.java  |   26 -
 .../storage/snapshot/SnapshotService.java          |    1 +
 .../storage/snapshot/SnapshotStrategy.java         |    2 +
 .../cloudstack/storage/to/PrimaryDataStoreTO.java  |    4 +-
 .../apache/cloudstack/storage/to/TemplateTO.java   |    2 +-
 .../volume/ObjectInDataStoreStateMachine.java      |   54 -
 .../storage/volume/PrimaryDataStoreDriver.java     |    2 +-
 .../volume/TemplateOnPrimaryDataStoreInfo.java     |    2 +-
 .../cloudstack/storage/volume/VolumeService.java   |   91 -
 .../volume/datastore/PrimaryDataStoreHelper.java   |   28 +-
 .../volume/db/TemplatePrimaryDataStoreDao.java     |    2 +-
 .../volume/db/TemplatePrimaryDataStoreDaoImpl.java |    6 +-
 .../volume/db/TemplatePrimaryDataStoreVO.java      |    4 +-
 .../storage/datastore/DefaultPrimaryDataStore.java |  189 +-
 .../driver/AncientPrimaryDataStoreDriverImpl.java  |  289 +
 .../driver/DefaultPrimaryDataStoreDriverImpl.java  |    2 +-
 .../AncientPrimaryDataStoreLifeCyclImpl.java       |  952 ++++
 .../DefaultPrimaryDataStoreLifeCycleImpl.java      |   31 +-
 ...DefaultPrimaryDataStoreProviderManagerImpl.java |   34 +-
 .../storage/datastore/manager/data model.ucls      |   32 +-
 .../AncientPrimaryDataStoreProviderImpl.java       |   75 +
 .../datastore/provider/DefaultHostListener.java    |   90 +
 .../DefaultPrimaryDatastoreProviderImpl.java       |    4 +
 .../storage/volume/TemplateInstallStrategy.java    |    2 +-
 .../volume/TemplateInstallStrategyImpl.java        |   33 +-
 .../storage/volume/VolumeDataFactoryImpl.java      |   42 +-
 .../storage/volume/VolumeEntityImpl.java           |   11 +-
 .../cloudstack/storage/volume/VolumeManager.java   |   45 -
 .../storage/volume/VolumeManagerImpl.java          |  112 -
 .../cloudstack/storage/volume/VolumeObject.java    |  187 +-
 .../storage/volume/VolumeServiceImpl.java          |  268 +-
 framework/api/pom.xml                              |   42 +
 .../framework/async/AsyncCallFuture.java           |   84 +
 .../framework/async/AsyncCompletionCallback.java   |   23 +
 .../framework/async/AsyncCallFuture.java           |   84 -
 .../framework/async/AsyncCompletionCallback.java   |   23 -
 framework/pom.xml                                  |    1 +
 .../hypervisor/vmware/VmwareServerDiscoverer.java  |    2 +-
 .../xen/discoverer/XcpServerDiscoverer.java        |    2 +-
 .../xen/resource/XenServerStorageResource.java     |    5 +
 .../allocator/RandomStoragePoolAllocator.java      |    5 +-
 .../driver/SolidfirePrimaryDataStoreDriver.java    |    2 +-
 server/src/com/cloud/alert/AlertManagerImpl.java   |    6 +-
 server/src/com/cloud/api/ApiDBUtils.java           |   15 +-
 server/src/com/cloud/api/ApiResponseHelper.java    |    2 +
 .../com/cloud/api/commands/GetUsageRecordsCmd.java |  372 ++
 .../cloud/baremetal/BareMetalTemplateAdapter.java  |    4 +-
 .../cloud/baremetal/BareMetalVmManagerImpl.java    |   24 +-
 server/src/com/cloud/capacity/CapacityManager.java |    3 +-
 .../com/cloud/capacity/CapacityManagerImpl.java    |   29 +-
 .../com/cloud/capacity/dao/CapacityDaoImpl.java    |    2 +-
 .../consoleproxy/ConsoleProxyManagerImpl.java      |   16 +-
 server/src/com/cloud/deploy/FirstFitPlanner.java   |    9 +-
 .../com/cloud/ha/HighAvailabilityManagerImpl.java  |    6 +-
 .../com/cloud/resource/ResourceManagerImpl.java    |   20 +-
 server/src/com/cloud/server/ManagementServer.java  |    3 +-
 .../src/com/cloud/server/ManagementServerImpl.java |   26 +-
 server/src/com/cloud/server/StatsCollector.java    |   11 +-
 .../cloud/storage/LocalStoragePoolListener.java    |   66 +-
 server/src/com/cloud/storage/OCFS2ManagerImpl.java |    1 +
 .../com/cloud/storage/RegisterVolumePayload.java   |   43 +
 server/src/com/cloud/storage/StorageManager.java   |  173 +-
 .../src/com/cloud/storage/StorageManagerImpl.java  | 4211 ++++-----------
 server/src/com/cloud/storage/TemplateProfile.java  |   11 +-
 server/src/com/cloud/storage/VolumeManager.java    |   99 +
 .../src/com/cloud/storage/VolumeManagerImpl.java   | 2620 +++++++++
 .../allocator/AbstractStoragePoolAllocator.java    |   14 +-
 .../allocator/FirstFitStoragePoolAllocator.java    |    9 +-
 .../allocator/LocalStoragePoolAllocator.java       |    5 +-
 .../com/cloud/storage/dao/LaunchPermissionDao.java |    1 +
 .../src/com/cloud/storage/dao/StoragePoolDao.java  |    3 +-
 .../com/cloud/storage/dao/StoragePoolDaoImpl.java  |    2 +-
 .../src/com/cloud/storage/dao/VMTemplateDao.java   |    6 +-
 .../com/cloud/storage/dao/VMTemplateDaoImpl.java   |   59 +-
 .../com/cloud/storage/dao/VMTemplateHostDao.java   |    8 +-
 .../cloud/storage/dao/VMTemplateHostDaoImpl.java   |   57 +
 .../com/cloud/storage/dao/VMTemplatePoolDao.java   |    7 +-
 .../cloud/storage/dao/VMTemplatePoolDaoImpl.java   |   49 +
 .../src/com/cloud/storage/dao/VolumeDaoImpl.java   |    3 +-
 .../src/com/cloud/storage/dao/VolumeHostDao.java   |    6 +-
 .../com/cloud/storage/dao/VolumeHostDaoImpl.java   |   56 +-
 .../cloud/storage/download/DownloadListener.java   |    2 +-
 .../cloud/storage/download/DownloadMonitor.java    |    1 +
 .../storage/download/DownloadMonitorImpl.java      |   53 +-
 .../cloud/storage/listener/StoragePoolMonitor.java |   14 +-
 .../resource/DummySecondaryStorageResource.java    |    2 +-
 server/src/com/cloud/storage/s3/S3Manager.java     |    1 +
 server/src/com/cloud/storage/s3/S3ManagerImpl.java |    2 +-
 .../secondary/SecondaryStorageManagerImpl.java     |    2 +-
 .../storage/snapshot/SnapshotManagerImpl.java      |   89 +-
 .../com/cloud/storage/upload/UploadMonitor.java    |    1 +
 .../com/cloud/tags/dao/ResourceTagsDaoImpl.java    |    1 +
 .../cloud/template/HyervisorTemplateAdapter.java   |   33 +-
 server/src/com/cloud/template/TemplateAdapter.java |    3 +-
 .../com/cloud/template/TemplateAdapterBase.java    |   35 +-
 server/src/com/cloud/template/TemplateManager.java |   28 +-
 .../com/cloud/template/TemplateManagerImpl.java    |  703 +++-
 server/src/com/cloud/user/AccountManagerImpl.java  |    5 +-
 server/src/com/cloud/vm/UserVmManager.java         |   13 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java     | 1114 +----
 server/src/com/cloud/vm/VirtualMachineManager.java |    1 +
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |   28 +-
 .../com/cloud/vm/VirtualMachineProfileImpl.java    |    1 +
 .../test/com/cloud/vm/MockUserVmManagerImpl.java   |   50 +-
 setup/db/4.1-new-db-schema.sql                     |   14 +-
 setup/db/templates.sql                             |   32 +-
 240 files changed, 11515 insertions(+), 9391 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java
index a19d344..fbf6121 100644
--- a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java
+++ b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java
@@ -18,6 +18,7 @@ package com.cloud.agent.api;
 
 import com.cloud.storage.StoragePool;
 
+
 /**
  * This currently assumes that both primary and secondary storage are mounted on the XenServer.
  */

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/storage/StoragePool.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/StoragePool.java b/api/src/com/cloud/storage/StoragePool.java
index f517927..091eef1 100644
--- a/api/src/com/cloud/storage/StoragePool.java
+++ b/api/src/com/cloud/storage/StoragePool.java
@@ -99,10 +99,7 @@ public interface StoragePool extends Identity, InternalIdentity {
 	/**
 	 * @return
 	 */
-	String getStorageProvider();
-
-	/**
-	 * @return
-	 */
-	String getStorageType();
+	Long getStorageProviderId();
+	
+	boolean isInMaintenance();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/storage/StoragePoolStatus.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/StoragePoolStatus.java b/api/src/com/cloud/storage/StoragePoolStatus.java
index 94dd686..a35f706 100644
--- a/api/src/com/cloud/storage/StoragePoolStatus.java
+++ b/api/src/com/cloud/storage/StoragePoolStatus.java
@@ -17,11 +17,6 @@
 package com.cloud.storage;
 
 public enum StoragePoolStatus {
-	Creating,
-    Up,
-    PrepareForMaintenance,
-    ErrorInMaintenance,
-    CancelMaintenance,
-    Maintenance,
-    Removed;
+    Initial, Initialized, Creating, Attaching, Up, PrepareForMaintenance, 
+    ErrorInMaintenance, CancelMaintenance, Maintenance, Removed;
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/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 bd7dfd3..63c5023 100644
--- a/api/src/com/cloud/storage/StorageService.java
+++ b/api/src/com/cloud/storage/StorageService.java
@@ -22,17 +22,10 @@ import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaint
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
 import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
-import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
-import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
-import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
 
-import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceInUseException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.user.Account;
 
 public interface StorageService{
     /**
@@ -52,37 +45,6 @@ public interface StorageService{
     UnknownHostException, ResourceUnavailableException;
 
     /**
-     * Creates the database object for a volume based on the given criteria
-     *
-     * @param cmd
-     *            the API command wrapping the criteria (account/domainId [admin only], zone, diskOffering, snapshot,
-     *            name)
-     * @return the volume object
-     * @throws PermissionDeniedException
-     */
-    Volume allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationException;
-
-    /**
-     * Creates the volume based on the given criteria
-     *
-     * @param cmd
-     *            the API command wrapping the criteria (account/domainId [admin only], zone, diskOffering, snapshot,
-     *            name)
-     * @return the volume object
-     */
-    Volume createVolume(CreateVolumeCmd cmd);
-
-
-    /**
-     * Resizes the volume based on the given criteria
-     * 
-     * @param cmd
-     *            the API command wrapping the criteria
-     * @return the volume object
-     */
-    Volume resizeVolume(ResizeVolumeCmd cmd);
-
-    /**
      * Delete the storage pool
      *
      * @param cmd
@@ -120,19 +82,4 @@ public interface StorageService{
     public StoragePool updateStoragePool(UpdateStoragePoolCmd cmd) throws IllegalArgumentException;
 
     public StoragePool getStoragePool(long id);
-
-    Volume migrateVolume(Long volumeId, Long storagePoolId) throws ConcurrentOperationException;
-
-
-    /**
-     * Uploads the volume to secondary storage
-     *
-     * @param UploadVolumeCmd cmd
-     *
-     * @return Volume object
-     */
-    Volume uploadVolume(UploadVolumeCmd cmd)	throws ResourceAllocationException;
-
-    boolean deleteVolume(long volumeId, Account caller) throws ConcurrentOperationException;
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/storage/Volume.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java
index 284c83d..4903594 100755
--- a/api/src/com/cloud/storage/Volume.java
+++ b/api/src/com/cloud/storage/Volume.java
@@ -39,9 +39,12 @@ public interface Volume extends ControlledEntity, Identity, InternalIdentity, Ba
         Snapshotting("There is a snapshot created on this volume, not backed up to secondary storage yet"),
         Resizing("The volume is being resized"),
         Expunging("The volume is being expunging"),
+        Expunged("The volume is being expunging"),
         Destroy("The volume is destroyed, and can't be recovered."), 
         Destroying("The volume is destroying, and can't be recovered."),  
-        UploadOp ("The volume upload operation is in progress or in short the volume is on secondary storage");            
+        UploadOp ("The volume upload operation is in progress or in short the volume is on secondary storage"),
+        Uploading("volume is uploading"),
+        Uploaded("volume is uploaded");
 
         String _description;
 
@@ -70,12 +73,15 @@ public interface Volume extends ControlledEntity, Identity, InternalIdentity, Ba
             s_fsm.addTransition(Resizing, Event.OperationSucceeded, Ready);
             s_fsm.addTransition(Resizing, Event.OperationFailed, Ready);          
             s_fsm.addTransition(Allocated, Event.UploadRequested, UploadOp);
-            s_fsm.addTransition(UploadOp, Event.CopyRequested, Creating);// CopyRequested for volume from sec to primary storage            
+            s_fsm.addTransition(Uploaded, Event.CopyRequested, Creating);// CopyRequested for volume from sec to primary storage            
             s_fsm.addTransition(Creating, Event.CopySucceeded, Ready);
-            s_fsm.addTransition(Creating, Event.CopyFailed, UploadOp);// Copying volume from sec to primary failed.  
+            s_fsm.addTransition(Creating, Event.CopyFailed, Uploaded);// Copying volume from sec to primary failed.  
             s_fsm.addTransition(UploadOp, Event.DestroyRequested, Destroy);
             s_fsm.addTransition(Ready, Event.DestroyRequested, Destroy);
             s_fsm.addTransition(Destroy, Event.ExpungingRequested, Expunging);
+            s_fsm.addTransition(Expunging, Event.ExpungingRequested, Expunging);
+            s_fsm.addTransition(Expunging, Event.OperationSucceeded, Expunged);
+            s_fsm.addTransition(Expunging, Event.OperationFailed, Expunging);
             s_fsm.addTransition(Ready, Event.SnapshotRequested, Snapshotting);
             s_fsm.addTransition(Snapshotting, Event.OperationSucceeded, Ready);
             s_fsm.addTransition(Snapshotting, Event.OperationFailed, Ready);
@@ -83,6 +89,9 @@ public interface Volume extends ControlledEntity, Identity, InternalIdentity, Ba
             s_fsm.addTransition(Migrating, Event.OperationSucceeded, Ready);
             s_fsm.addTransition(Migrating, Event.OperationFailed, Ready);
             s_fsm.addTransition(Destroy, Event.OperationSucceeded, Destroy);
+            s_fsm.addTransition(UploadOp, Event.OperationSucceeded, Uploaded);
+            s_fsm.addTransition(UploadOp, Event.OperationFailed, Allocated);
+            s_fsm.addTransition(Uploaded, Event.DestroyRequested, Destroy);
         }
     }
 
@@ -110,7 +119,7 @@ public interface Volume extends ControlledEntity, Identity, InternalIdentity, Ba
     /**
      * @return total size of the partition
      */
-    long getSize();
+    Long getSize();
 
     /**
      * @return the vm instance id

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/storage/VolumeApiService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/VolumeApiService.java b/api/src/com/cloud/storage/VolumeApiService.java
new file mode 100644
index 0000000..92880f4
--- /dev/null
+++ b/api/src/com/cloud/storage/VolumeApiService.java
@@ -0,0 +1,80 @@
+/*
+ * 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 com.cloud.storage;
+
+import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.user.Account;
+
+public interface VolumeApiService {
+    /**
+     * Creates the database object for a volume based on the given criteria
+     *
+     * @param cmd
+     *            the API command wrapping the criteria (account/domainId [admin only], zone, diskOffering, snapshot,
+     *            name)
+     * @return the volume object
+     * @throws PermissionDeniedException
+     */
+    Volume allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationException;
+    
+    /**
+     * Creates the volume based on the given criteria
+     *
+     * @param cmd
+     *            the API command wrapping the criteria (account/domainId [admin only], zone, diskOffering, snapshot,
+     *            name)
+     * @return the volume object
+     */
+    Volume createVolume(CreateVolumeCmd cmd);
+
+
+    /**
+     * Resizes the volume based on the given criteria
+     * 
+     * @param cmd
+     *            the API command wrapping the criteria
+     * @return the volume object
+     */
+    Volume resizeVolume(ResizeVolumeCmd cmd);
+    
+    Volume migrateVolume(Long volumeId, Long storagePoolId) throws ConcurrentOperationException;
+
+    /**
+     * Uploads the volume to secondary storage
+     *
+     * @param UploadVolumeCmd cmd
+     *
+     * @return Volume object
+     */
+    Volume uploadVolume(UploadVolumeCmd cmd)    throws ResourceAllocationException;
+
+    boolean deleteVolume(long volumeId, Account caller) throws ConcurrentOperationException;
+
+    Volume attachVolumeToVM(AttachVolumeCmd command);
+
+    Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/template/TemplateService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/template/TemplateService.java b/api/src/com/cloud/template/TemplateService.java
index 11475d4..7e831fb 100755
--- a/api/src/com/cloud/template/TemplateService.java
+++ b/api/src/com/cloud/template/TemplateService.java
@@ -25,6 +25,7 @@ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
 import org.apache.cloudstack.api.command.user.template.CopyTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.CreateTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
@@ -32,6 +33,8 @@ import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
 import com.cloud.exception.InternalErrorException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.StorageUnavailableException;
+import com.cloud.user.Account;
+import com.cloud.utils.exception.CloudRuntimeException;
 
 public interface TemplateService {
 
@@ -87,4 +90,11 @@ public interface TemplateService {
     List<String> listTemplatePermissions(BaseListTemplateOrIsoPermissionsCmd cmd);
 
     boolean updateTemplateOrIsoPermissions(BaseUpdateTemplateOrIsoPermissionsCmd cmd);
+    
+    VirtualMachineTemplate createPrivateTemplateRecord(CreateTemplateCmd cmd,
+            Account templateOwner) throws ResourceAllocationException;
+
+    VirtualMachineTemplate createPrivateTemplate(CreateTemplateCmd command)
+            throws CloudRuntimeException;
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/com/cloud/vm/UserVmService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java
index fb574fa..ea89eda 100755
--- a/api/src/com/cloud/vm/UserVmService.java
+++ b/api/src/com/cloud/vm/UserVmService.java
@@ -23,7 +23,6 @@ import javax.naming.InsufficientResourcesException;
 
 import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
 import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
-import org.apache.cloudstack.api.command.user.template.CreateTemplateCmd;
 import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
 import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
 import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
@@ -103,24 +102,6 @@ public interface UserVmService {
      */
     UserVm resetVMSSHKey(ResetVMSSHKeyCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException;
 
-    /**
-     * Attaches the specified volume to the specified VM
-     *
-     * @param cmd
-     *            - the command specifying volumeId and vmId
-     * @return the Volume object if attach worked successfully.
-     */
-    Volume attachVolumeToVM(AttachVolumeCmd cmd);
-
-    /**
-     * Detaches the specified volume from the VM it is currently attached to.
-     *
-     * @param cmd
-     *            - the command specifying volumeId
-     * @return the Volume object if detach worked successfully.
-     */
-    Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
-
     UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, ExecutionException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException,
             ResourceAllocationException;
 
@@ -151,28 +132,6 @@ public interface UserVmService {
 
     UserVm recoverVirtualMachine(RecoverVMCmd cmd) throws ResourceAllocationException;
 
-    /**
-     * Create a template database record in preparation for creating a private template.
-     *
-     * @param cmd
-     *            the command object that defines the name, display text, snapshot/volume, bits, public/private, etc.
-     *            for the
-     *            private template
-     * @param templateOwner
-     *            TODO
-     * @return the vm template object if successful, null otherwise
-     * @throws ResourceAllocationException
-     */
-    VirtualMachineTemplate createPrivateTemplateRecord(CreateTemplateCmd cmd, Account templateOwner) throws ResourceAllocationException;
-
-    /**
-     * Creates a private template from a snapshot of a VM
-     *
-     * @param cmd
-     *            - the command specifying snapshotId, name, description
-     * @return a template if successfully created, null otherwise
-     */
-    VirtualMachineTemplate createPrivateTemplate(CreateTemplateCmd cmd);
 
     /**
      * Creates a Basic Zone User VM in the database and returns the VM to the caller.

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index cd7d700..3a4055c 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -443,6 +443,7 @@ public class ApiConstants {
     public static final String VM_SNAPSHOT_ID = "vmsnapshotid";
     public static final String VM_SNAPSHOT_DISK_IDS = "vmsnapshotdiskids";
     public static final String VM_SNAPSHOT_MEMORY = "snapshotmemory";
+    public static final String IMAGE_STORE_UUID = "imagestoreuuid";
 
     public enum HostDetails {
         all, capacity, events, stats, min;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java
index 17f789f..816b6de 100644
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@ -62,6 +62,7 @@ import com.cloud.resource.ResourceService;
 import com.cloud.server.ManagementService;
 import com.cloud.server.TaggedResourceService;
 import com.cloud.storage.StorageService;
+import com.cloud.storage.VolumeApiService;
 import com.cloud.storage.snapshot.SnapshotService;
 import com.cloud.template.TemplateService;
 import com.cloud.user.Account;
@@ -69,7 +70,6 @@ import com.cloud.user.AccountService;
 import com.cloud.user.DomainService;
 import com.cloud.user.ResourceLimitService;
 import com.cloud.utils.Pair;
-import com.cloud.vm.BareMetalVmService;
 import com.cloud.vm.UserVmService;
 import com.cloud.vm.snapshot.VMSnapshotService;
 
@@ -102,6 +102,7 @@ public abstract class BaseCmd {
     @Inject public UserVmService _userVmService;
     @Inject public ManagementService _mgr;
     @Inject public StorageService _storageService;
+    @Inject public VolumeApiService _volumeService;
     @Inject public ResourceService _resourceService;
     @Inject public NetworkService _networkService;
     @Inject public TemplateService _templateService;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
index a3497a8..cae5888 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
@@ -36,6 +36,7 @@ import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.storage.StoragePool;
 import com.cloud.user.Account;
 
+
 @SuppressWarnings("rawtypes")
 @APICommand(name = "createStoragePool", description="Creates a storage pool.", responseObject=StoragePoolResponse.class)
 public class CreateStoragePoolCmd extends BaseCmd {
@@ -70,6 +71,14 @@ public class CreateStoragePoolCmd extends BaseCmd {
     @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
             required=true, description="the Zone ID for the storage pool")
     private Long zoneId;
+    
+    @Parameter(name=ApiConstants.PROVIDER, type=CommandType.UUID,
+            required=false, description="the storage provider uuid")
+    private String storageProviderUuid;
+    
+    @Parameter(name=ApiConstants.SCOPE, type=CommandType.STRING,
+            required=false, description="the scope of the storage: cluster or zone")
+    private String scope;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -102,6 +111,14 @@ public class CreateStoragePoolCmd extends BaseCmd {
     public Long getZoneId() {
         return zoneId;
     }
+    
+    public String getStorageProviderUuid() {
+        return this.storageProviderUuid;
+    }
+    
+    public String getScope() {
+       return this.scope;
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
index a4a37c8..5bc4d6e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
@@ -88,6 +88,10 @@ public class RegisterIsoCmd extends BaseCmd {
     @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class,
             description="Register iso for the project")
     private Long projectId;
+    
+    @Parameter(name=ApiConstants.IMAGE_STORE_UUID, type=CommandType.UUID,
+            description="Image store uuid")
+    private String imageStoreUuid;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -140,6 +144,10 @@ public class RegisterIsoCmd extends BaseCmd {
     public String getChecksum() {
         return checksum;
     }
+    
+    public String getImageStoreUuid() {
+        return this.imageStoreUuid;
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
index 84fa197..ba1f924 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
@@ -240,7 +240,7 @@ import com.cloud.user.UserContext;
     @Override
     public void create() throws ResourceAllocationException {
         VirtualMachineTemplate template = null;
-        template = _userVmService.createPrivateTemplateRecord(this, _accountService.getAccount(getEntityOwnerId()));
+        template = this._templateService.createPrivateTemplateRecord(this, _accountService.getAccount(getEntityOwnerId()));
         if (template != null) {
             this.setEntityId(template.getId());
             this.setEntityUuid(template.getUuid());
@@ -255,7 +255,7 @@ import com.cloud.user.UserContext;
     public void execute() {
         UserContext.current().setEventDetails("Template Id: "+getEntityId()+((getSnapshotId() == null) ? " from volume Id: " + getVolumeId() : " from snapshot Id: " + getSnapshotId()));
         VirtualMachineTemplate template = null;
-        template = _userVmService.createPrivateTemplate(this);
+        template = this._templateService.createPrivateTemplate(this);
 
         if (template != null){
             List<TemplateResponse> templateResponses;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
index 3e98ca6..ed71967 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
@@ -110,7 +110,11 @@ public class RegisterTemplateCmd extends BaseCmd {
     @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class,
             description="Register template for the project")
     private Long projectId;
-
+    
+    @Parameter(name=ApiConstants.IMAGE_STORE_UUID, type=CommandType.UUID,
+            description="Image store uuid")
+    private String imageStoreUuid;
+    
     @Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, description="Template details in key/value pairs.")
     protected Map details;
 
@@ -189,6 +193,10 @@ public class RegisterTemplateCmd extends BaseCmd {
     public String getTemplateTag() {
         return templateTag;
     }
+    
+    public String getImageStoreUuid() {
+        return this.imageStoreUuid;
+    }
 
     public Map getDetails() {
         if (details == null || details.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
index 4d82534..e577e35 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
@@ -119,7 +119,7 @@ public class AttachVolumeCmd extends BaseAsyncCmd {
     @Override
     public void execute(){
         UserContext.current().setEventDetails("Volume Id: "+getId()+" VmId: "+getVirtualMachineId());
-        Volume result = _userVmService.attachVolumeToVM(this);
+        Volume result = _volumeService.attachVolumeToVM(this);
         if (result != null) {
             VolumeResponse response = _responseGenerator.createVolumeResponse(result);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
index 2f77862..5db06bc 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
@@ -153,7 +153,7 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
     @Override
     public void create() throws ResourceAllocationException{
 
-        Volume volume = _storageService.allocVolume(this);
+        Volume volume = this._volumeService.allocVolume(this);
         if (volume != null) {
             this.setEntityId(volume.getId());
             this.setEntityUuid(volume.getUuid());
@@ -165,7 +165,7 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
     @Override
     public void execute(){
         UserContext.current().setEventDetails("Volume Id: "+getEntityId()+((getSnapshotId() == null) ? "" : " from snapshot: " + getSnapshotId()));
-        Volume volume = _storageService.createVolume(this);
+        Volume volume = _volumeService.createVolume(this);
         if (volume != null) {
             VolumeResponse response = _responseGenerator.createVolumeResponse(volume);
             //FIXME - have to be moved to ApiResponseHelper

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
index 39c3de3..394b009 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
@@ -80,7 +80,7 @@ public class DeleteVolumeCmd extends BaseCmd {
     @Override
     public void execute() throws ConcurrentOperationException {
         UserContext.current().setEventDetails("Volume Id: "+getId());
-        boolean result = _storageService.deleteVolume(id, UserContext.current().getCaller());
+        boolean result = this._volumeService.deleteVolume(id, UserContext.current().getCaller());
         if (result) {
             SuccessResponse response = new SuccessResponse(getCommandName());
             this.setResponseObject(response);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
index 6153e17..9a5929e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
@@ -130,7 +130,7 @@ public class DetachVolumeCmd extends BaseAsyncCmd {
     @Override
     public void execute(){
         UserContext.current().setEventDetails("Volume Id: "+getId()+" VmId: "+getVirtualMachineId());
-        Volume result = _userVmService.detachVolumeFromVM(this);
+        Volume result = _volumeService.detachVolumeFromVM(this);
         if (result != null){
             VolumeResponse response = _responseGenerator.createVolumeResponse(result);
             response.setResponseName("volume");

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
index d43ad55..8c09f8f 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
@@ -92,7 +92,7 @@ public class MigrateVolumeCmd extends BaseAsyncCmd {
     public void execute(){
         Volume result;
         try {
-            result = _storageService.migrateVolume(getVolumeId(), getStoragePoolId());
+            result = _volumeService.migrateVolume(getVolumeId(), getStoragePoolId());
              if (result != null) {
                  VolumeResponse response = _responseGenerator.createVolumeResponse(result);
                  response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
index 5286344..955727a 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
@@ -133,7 +133,7 @@ public class ResizeVolumeCmd extends BaseAsyncCmd {
     @Override
     public void execute(){
         UserContext.current().setEventDetails("Volume Id: " + getEntityId() + " to size " + getSize() + "G");
-    	Volume volume = _storageService.resizeVolume(this);
+    	Volume volume = _volumeService.resizeVolume(this);
     	if (volume != null) {
             VolumeResponse response = _responseGenerator.createVolumeResponse(volume);
             //FIXME - have to be moved to ApiResponseHelper

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
index 107d938..94c3d38 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
@@ -67,6 +67,10 @@ public class UploadVolumeCmd extends BaseAsyncCmd {
 
     @Parameter(name=ApiConstants.CHECKSUM, type=CommandType.STRING, description="the MD5 checksum value of this volume")
     private String checksum;
+    
+    @Parameter(name=ApiConstants.IMAGE_STORE_UUID, type=CommandType.UUID,
+            description="Image store uuid")
+    private String imageStoreUuid;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -99,6 +103,10 @@ public class UploadVolumeCmd extends BaseAsyncCmd {
     public String getChecksum() {
         return checksum;
     }
+    
+    public String getImageStoreUuid() {
+        return this.imageStoreUuid;
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
@@ -110,7 +118,7 @@ public class UploadVolumeCmd extends BaseAsyncCmd {
             ConcurrentOperationException, ResourceAllocationException,
             NetworkRuleConflictException {
 
-            Volume volume = _storageService.uploadVolume(this);
+            Volume volume = _volumeService.uploadVolume(this);
             if (volume != null){
                 VolumeResponse response = _responseGenerator.createVolumeResponse(volume);
                 response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
----------------------------------------------------------------------
diff --git a/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java b/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
index 7836b6d..7100497 100644
--- a/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
+++ b/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
@@ -133,15 +133,15 @@ public class BackupSnapshotCommandTest {
         }
 
         @Override
-        public String getStorageProvider() {
+        public Long getStorageProviderId() {
             // TODO Auto-generated method stub
             return null;
         }
 
         @Override
-        public String getStorageType() {
+        public boolean isInMaintenance() {
             // TODO Auto-generated method stub
-            return null;
+            return false;
         };
     };
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
----------------------------------------------------------------------
diff --git a/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java b/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
index 3545d0f..767d7c3 100644
--- a/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
+++ b/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
@@ -115,16 +115,16 @@ public class SnapshotCommandTest {
         }
 
 		@Override
-		public String getStorageProvider() {
+		public Long getStorageProviderId() {
 			// TODO Auto-generated method stub
 			return null;
 		}
 
-		@Override
-		public String getStorageType() {
-			// TODO Auto-generated method stub
-			return null;
-		};
+        @Override
+        public boolean isInMaintenance() {
+            // TODO Auto-generated method stub
+            return false;
+        };
     };
 
     SnapshotCommand ssc = new SnapshotCommand(pool,

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java
----------------------------------------------------------------------
diff --git a/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java b/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java
index 7f5540f..852e52b 100644
--- a/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java
+++ b/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java
@@ -134,15 +134,15 @@ public class ResizeVolumeCommandTest {
         }
 
         @Override
-        public String getStorageProvider() {
+        public Long getStorageProviderId() {
             // TODO Auto-generated method stub
             return null;
         }
 
         @Override
-        public String getStorageType() {
+        public boolean isInMaintenance() {
             // TODO Auto-generated method stub
-            return null;
+            return false;
         };
     };
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/client/pom.xml
----------------------------------------------------------------------
diff --git a/client/pom.xml b/client/pom.xml
index 0c37df3..d2ae54c 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -269,7 +269,8 @@
                 </copy>
                 <copy
                   todir="${basedir}/target/generated-webapp/WEB-INF/classes/scripts">
-                  <fileset dir="${basedir}/../scripts" />
+                  <fileset dir="${basedir}/../scripts">
+                  </fileset>
                 </copy>
                 <copy
                   todir="${basedir}/target/generated-webapp/WEB-INF/classes/vms">

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 3d6356e..16ee8ea 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -31,7 +31,11 @@
       <artifactId>cloud-api</artifactId>
       <version>${project.version}</version>
     </dependency>
-
+    <dependency>
+      <groupId>org.apache.cloudstack</groupId>
+      <artifactId>cloud-engine-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>commons-httpclient</groupId>
       <artifactId>commons-httpclient</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/StoragePoolDiscoverer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/StoragePoolDiscoverer.java b/core/src/com/cloud/storage/StoragePoolDiscoverer.java
index 816e899..c7dd362 100644
--- a/core/src/com/cloud/storage/StoragePoolDiscoverer.java
+++ b/core/src/com/cloud/storage/StoragePoolDiscoverer.java
@@ -19,6 +19,8 @@ package com.cloud.storage;
 import java.net.URI;
 import java.util.Map;
 
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
 import com.cloud.exception.DiscoveryException;
 import com.cloud.utils.component.Adapter;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/StoragePoolVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/StoragePoolVO.java b/core/src/com/cloud/storage/StoragePoolVO.java
deleted file mode 100644
index af6e4e2..0000000
--- a/core/src/com/cloud/storage/StoragePoolVO.java
+++ /dev/null
@@ -1,346 +0,0 @@
-// 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 com.cloud.storage;
-
-import java.util.Date;
-import java.util.UUID;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.utils.db.GenericDao;
-
-@Entity
-@Table(name="storage_pool")
-public class StoragePoolVO implements StoragePool {
-    @Id
-    @TableGenerator(name="storage_pool_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="storage_pool_seq", allocationSize=1)
-    @Column(name="id", updatable=false, nullable = false)
-	private long id;
-    
-    @Column(name="name", updatable=false, nullable=false, length=255)
-	private String name = null;
-
-    @Column(name="uuid", length=255)
-	private String uuid = null;
-    
-    @Column(name="pool_type", updatable=false, nullable=false, length=32)
-    @Enumerated(value=EnumType.STRING)
-    private StoragePoolType poolType;
-    
-    @Column(name=GenericDao.CREATED_COLUMN)
-    Date created;
-    
-    @Column(name=GenericDao.REMOVED_COLUMN)
-    private Date removed;
-    
-    @Column(name="update_time", updatable=true)
-    @Temporal(value=TemporalType.TIMESTAMP)
-    private Date updateTime;
-    
-    @Column(name="data_center_id", updatable=true, nullable=false)
-    private long dataCenterId;
-    
-    @Column(name="pod_id", updatable=true)
-    private Long podId;
-    
-    @Column(name="available_bytes", updatable=true, nullable=true)
-    private long availableBytes;
-    
-    @Column(name="capacity_bytes", updatable=true, nullable=true)
-    private long capacityBytes;
-
-    @Column(name="status",  updatable=true, nullable=false)
-    @Enumerated(value=EnumType.STRING)
-    private StoragePoolStatus status;
-    
-    // TODO, disable persisency of storageProvider and storageType, javelin new code not
-    // sync with the schema!
-    
-    // @Column(name="storage_provider", updatable=true, nullable=false)
-    @Transient private String storageProvider;
-    
-    // Column(name="storage_type", nullable=false)
-    @Transient private String storageType;
-    
-	@Override
-    public long getId() {
-		return id;
-	}
-	
-	@Override
-	public StoragePoolStatus getStatus() {
-		return status;
-	}
-
-	public StoragePoolVO() {
-		// TODO Auto-generated constructor stub
-	}
-
-	@Override
-    public String getName() {
-		return name;
-	}
-
-	@Override
-    public String getUuid() {
-		return uuid;
-	}
-	
-	@Override
-    public StoragePoolType getPoolType() {
-		return poolType;
-	}
-
-	@Override
-    public Date getCreated() {
-		return created;
-	}
-
-	public Date getRemoved() {
-		return removed;
-	}
-
-	@Override
-    public Date getUpdateTime() {
-		return updateTime;
-	}
-
-	@Override
-    public long getDataCenterId() {
-		return dataCenterId;
-	}
-
-	@Override
-    public long getAvailableBytes() {
-		return availableBytes;
-	}
-
-	@Override
-	public String getStorageProvider() {
-		return storageProvider;
-	}
-	
-	public void setStorageProvider(String provider) {
-		storageProvider = provider;
-	}
-	
-	@Override
-	public String getStorageType() {
-		return storageType;
-	}
-	
-	public void setStorageType(String type) {
-		storageType = type;
-	}
-	
-	@Override
-    public long getCapacityBytes() {
-		return capacityBytes;
-	}
-
-	public void setAvailableBytes(long available) {
-		availableBytes = available;
-	}
-	
-	public void setCapacityBytes(long capacity) {
-		capacityBytes = capacity;
-	}
-	
-    @Column(name="host_address")
-    private String hostAddress;
-    
-    @Column(name="path")
-    private String path;
-    
-    @Column(name="port")
-    private int port;
-
-    @Column(name="user_info")
-    private String userInfo;
-
-    @Column(name="cluster_id")
-    private Long clusterId;
-    
-    
-    @Override
-    public Long getClusterId() {
-        return clusterId;
-    }
-    
-    public void setClusterId(Long clusterId) {
-        this.clusterId = clusterId;
-    }
-    
-    @Override
-    public String getHostAddress() {
-        return hostAddress;
-    }
-    
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public String getUserInfo() {
-        return userInfo;
-    }
-    
-    public StoragePoolVO(long poolId, String name, String uuid, StoragePoolType type,
-            long dataCenterId, Long podId, long availableBytes, long capacityBytes, String hostAddress, int port, String hostPath) {
-        this.name  = name;
-        this.id = poolId;
-        this.uuid = uuid;
-        this.poolType = type;
-        this.dataCenterId = dataCenterId;
-        this.availableBytes = availableBytes;
-        this.capacityBytes = capacityBytes;
-        this.hostAddress = hostAddress;
-        this.path = hostPath;
-        this.port = port;
-        this.podId = podId;
-        this.setStatus(StoragePoolStatus.Creating);
-    }
-    
-    public StoragePoolVO(StoragePoolVO that) {
-        this(that.id, that.name, that.uuid, that.poolType, that.dataCenterId, that.podId, that.availableBytes, that.capacityBytes, that.hostAddress, that.port, that.path);
-    }
-    
-    public StoragePoolVO(StoragePoolType type, String hostAddress, int port, String path) {
-        this.poolType = type;
-        this.hostAddress = hostAddress;
-        this.port = port;
-        this.path = path;
-        this.setStatus(StoragePoolStatus.Creating);
-        this.uuid = UUID.randomUUID().toString();
-    }
-
-    public StoragePoolVO(StoragePoolType type, String hostAddress, int port, String path, String userInfo) {
-        this.poolType = type;
-        this.hostAddress = hostAddress;
-        this.port = port;
-        this.path = path;
-        this.userInfo = userInfo;
-        this.setStatus(StoragePoolStatus.Creating);
-        this.uuid = UUID.randomUUID().toString();
-    }
-    
-    public void setStatus(StoragePoolStatus status)
-    {
-    	this.status = status;
-    }
-    
-    public void setId(long id) {
-        this.id = id;
-    }
-    
-    public void setDataCenterId(long dcId) {
-        this.dataCenterId = dcId;
-    }
-    
-    public void setPodId(Long podId) {
-        this.podId = podId;
-    }
-    
-    public void setUuid(String uuid) {
-        this.uuid = uuid;
-    }
-    
-    public void setPath(String path) {
-    	this.path = path;
-    }
-
-    public void setUserInfo(String userInfo) {
-        this.userInfo = userInfo;
-    }
-    
-    @Override
-    public int getPort() {
-        return port;
-    }
-    
-    @Override
-    public boolean isShared() {
-    	return poolType.isShared();
-    }
-    
-    @Override
-    public boolean isLocal() {
-    	return !poolType.isShared();
-    }
-    
-    @Transient
-    public String toUri() {
-        /*
-        URI uri = new URI();
-        try {
-            if (type == StoragePoolType.Filesystem) {
-                uri.setScheme("file");
-            } else if (type == StoragePoolType.NetworkFilesystem) {
-                uri.setScheme("nfs");
-            } else if (type == StoragePoolType.IscsiLUN) {
-            }
-        } catch (MalformedURIException e) {
-            throw new VmopsRuntimeException("Unable to form the uri " + id);
-        }
-        return uri.toString();
-        */
-        return null;
-    }
-
-	@Override
-    public Long getPodId() {
-		return podId;
-	}
-	
-	public void setName(String name) {
-	    this.name = name;
-	}
-	
-	public boolean isInMaintenance() {
-	    return status == StoragePoolStatus.PrepareForMaintenance || status == StoragePoolStatus.Maintenance || status == StoragePoolStatus.ErrorInMaintenance || removed != null;
-	}
-	
-	@Override
-    public boolean equals(Object obj) {
-	    if (!(obj instanceof StoragePoolVO) || obj == null) {
-	        return false;
-	    }
-	    StoragePoolVO that = (StoragePoolVO)obj;
-	    return this.id == that.id;
-	}
-	
-	@Override
-	public int hashCode() {
-	    return new Long(id).hashCode();
-	}
-	
-    @Override
-    public String toString() {
-        return new StringBuilder("Pool[").append(id).append("|").append(poolType).append("]").toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/VMTemplateHostVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/VMTemplateHostVO.java b/core/src/com/cloud/storage/VMTemplateHostVO.java
index 9eae1a0..b8dfc41 100755
--- a/core/src/com/cloud/storage/VMTemplateHostVO.java
+++ b/core/src/com/cloud/storage/VMTemplateHostVO.java
@@ -29,8 +29,10 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+
 import com.cloud.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
 
 /**
  * Join table for storage hosts and templates
@@ -38,7 +40,7 @@ import org.apache.cloudstack.api.InternalIdentity;
  */
 @Entity
 @Table(name="template_host_ref")
-public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
+public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc, DataObjectInStore {
 	@Id
 	@GeneratedValue(strategy=GenerationType.IDENTITY)
 	Long id;
@@ -90,6 +92,18 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
     @Column(name="destroyed")
     boolean destroyed = false;
     
+    @Column(name="update_count", updatable = true, nullable=false)
+    protected long updatedCount;
+    
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    Date updated;
+    
+    @Column(name = "state")
+    @Enumerated(EnumType.STRING)
+    ObjectInDataStoreStateMachine.State state;
+    
+    
 	@Override
     public String getInstallPath() {
 		return installPath;
@@ -162,6 +176,7 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
 		super();
 		this.hostId = hostId;
 		this.templateId = templateId;
+		this.state = ObjectInDataStoreStateMachine.State.Allocated;
 	}
 
 	public VMTemplateHostVO(long hostId, long templateId, Date lastUpdated,
@@ -282,4 +297,26 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
 	    return new StringBuilder("TmplHost[").append(id).append("-").append(templateId).append("-").append(hostId).append(installPath).append("]").toString();
 	}
 
+    @Override
+    public ObjectInDataStoreStateMachine.State getState() {
+        // TODO Auto-generated method stub
+        return this.state;
+    }
+    
+    public long getUpdatedCount() {
+        return this.updatedCount;
+    }
+    
+    public void incrUpdatedCount() {
+        this.updatedCount++;
+    }
+
+    public void decrUpdatedCount() {
+        this.updatedCount--;
+    }
+    
+    public Date getUpdated() {
+        return updated;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
index 32c9dd2..9b76176 100644
--- a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
+++ b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java
@@ -29,8 +29,11 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+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.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
 
 /**
  * Join table for storage pools and templates
@@ -38,7 +41,7 @@ import org.apache.cloudstack.api.InternalIdentity;
  */
 @Entity
 @Table(name="template_spool_ref")
-public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
+public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc, DataObjectInStore {
 	@Id
 	@GeneratedValue(strategy=GenerationType.IDENTITY)
 	long id;
@@ -69,7 +72,18 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
 	@Column (name="template_size") long templateSize;
 	
 	@Column (name="marked_for_gc") boolean markedForGC;
-    
+
+	@Column(name="update_count", updatable = true, nullable=false)
+	protected long updatedCount;
+
+	@Column(name = "updated")
+	@Temporal(value = TemporalType.TIMESTAMP)
+	Date updated;
+
+	@Column(name = "state")
+	@Enumerated(EnumType.STRING)
+	ObjectInDataStoreStateMachine.State state;
+
 	@Override
     public String getInstallPath() {
 		return installPath;
@@ -148,6 +162,7 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
 		this.poolId = poolId;
 		this.templateId = templateId;
 		this.downloadState = Status.NOT_DOWNLOADED;
+		this.state = ObjectInDataStoreStateMachine.State.Allocated;
 		this.markedForGC = false;
 	}
 
@@ -235,4 +250,26 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc {
 	    return new StringBuilder("TmplPool[").append(id).append("-").append(templateId).append("-").append("poolId").append("-").append(installPath).append("]").toString();
 	}
 
+    @Override
+    public State getState() {
+        return this.state;
+    }
+    
+    public long getUpdatedCount() {
+        return this.updatedCount;
+    }
+    
+    public void incrUpdatedCount() {
+        this.updatedCount++;
+    }
+
+    public void decrUpdatedCount() {
+        this.updatedCount--;
+    }
+    
+    public Date getUpdated() {
+        return updated;
+    }
+    
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/VMTemplateVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/VMTemplateVO.java b/core/src/com/cloud/storage/VMTemplateVO.java
index fcfdd00..e643d75 100755
--- a/core/src/com/cloud/storage/VMTemplateVO.java
+++ b/core/src/com/cloud/storage/VMTemplateVO.java
@@ -31,17 +31,18 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
-import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
+
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
 import com.cloud.template.VirtualMachineTemplate;
 import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
+import com.cloud.utils.fsm.StateObject;
 
 @Entity
 @Table(name="vm_template")
-public class VMTemplateVO implements VirtualMachineTemplate {
+public class VMTemplateVO implements VirtualMachineTemplate, StateObject<TemplateState> {
     @Id
     @TableGenerator(name="vm_template_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_template_seq", allocationSize=1)
     @Column(name="id", nullable = false)
@@ -127,6 +128,22 @@ public class VMTemplateVO implements VirtualMachineTemplate {
 
     @Column(name="enable_sshkey")
     private boolean enableSshKey;
+    
+    @Column(name = "image_data_store_id")
+    private long imageDataStoreId;
+    
+    @Column(name = "size")
+    private Long size;
+    
+    @Column(name = "state")
+    private TemplateState state;
+    
+    @Column(name="update_count", updatable = true)
+    protected long updatedCount;
+    
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    Date updated;
 
     @Transient
     Map details;
@@ -140,8 +157,9 @@ public class VMTemplateVO implements VirtualMachineTemplate {
         this.uniqueName = uniqueName;
     }
 
-    protected VMTemplateVO() {
+    public VMTemplateVO() {
     	this.uuid = UUID.randomUUID().toString();
+    	this.state = TemplateState.Allocated;
     }
 
     /**
@@ -150,12 +168,14 @@ public class VMTemplateVO implements VirtualMachineTemplate {
     public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable, HypervisorType hyperType, Map details) {
         this(id, generateUniqueName(id, accountId, name), name, format, isPublic, featured, isExtractable, type, url, null, requiresHvm, bits, accountId, cksum, displayText, enablePassword, guestOSId, bootable, hyperType, details);
     	this.uuid = UUID.randomUUID().toString();
+    	this.state = TemplateState.Allocated;
     }
 
     public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable, HypervisorType hyperType, String templateTag, Map details, boolean sshKeyEnabled) {
         this(id, name, format, isPublic, featured, isExtractable, type, url, requiresHvm, bits, accountId, cksum, displayText, enablePassword, guestOSId, bootable, hyperType, details);
         this.templateTag = templateTag;
     	this.uuid = UUID.randomUUID().toString();
+    	this.state = TemplateState.Allocated;
     	this.enableSshKey = sshKeyEnabled;
     }
 
@@ -179,6 +199,7 @@ public class VMTemplateVO implements VirtualMachineTemplate {
         this.bootable = bootable;
         this.hypervisorType = hyperType;
     	this.uuid = UUID.randomUUID().toString();
+    	this.state = TemplateState.Allocated;
     }
 
     // Has an extra attribute - isExtractable
@@ -468,5 +489,46 @@ public class VMTemplateVO implements VirtualMachineTemplate {
 	public void setEnableSshKey(boolean enable) {
 		enableSshKey = enable;
 	}
+	
+	 public Long getImageDataStoreId() {
+	        return this.imageDataStoreId;
+	    }
+
+	    public void setImageDataStoreId(long dataStoreId) {
+	        this.imageDataStoreId = dataStoreId;
+	    }
+	    
+	    public void setSize(Long size) {
+	        this.size = size;
+	    }
+	    
+	    public Long getSize() {
+	        return this.size;
+	    }
+	    
+	    public TemplateState getState() {
+	        return this.state;
+	    }
+	    
+	    public long getUpdatedCount() {
+	        return this.updatedCount;
+	    }
+	    
+	    public void incrUpdatedCount() {
+	        this.updatedCount++;
+	    }
+
+	    public void decrUpdatedCount() {
+	        this.updatedCount--;
+	    }
+	    
+	    public Date getUpdated() {
+	        return updated;
+	    }
+	    
+	    public void setUpdated(Date updated) {
+	        this.updated = updated;
+	    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/VolumeHostVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/VolumeHostVO.java b/core/src/com/cloud/storage/VolumeHostVO.java
index f4fc7ab..40bae49 100755
--- a/core/src/com/cloud/storage/VolumeHostVO.java
+++ b/core/src/com/cloud/storage/VolumeHostVO.java
@@ -29,11 +29,13 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-//import com.cloud.storage.VMVolumeStorageResourceAssoc.Status;
+import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 import com.cloud.utils.db.GenericDaoBase;
-import org.apache.cloudstack.api.InternalIdentity;
 
 /**
  * Join table for storage hosts and volumes
@@ -41,7 +43,7 @@ import org.apache.cloudstack.api.InternalIdentity;
  */
 @Entity
 @Table(name="volume_host_ref")
-public class VolumeHostVO implements InternalIdentity {
+public class VolumeHostVO implements InternalIdentity, DataObjectInStore {
 	@Id
 	@GeneratedValue(strategy=GenerationType.IDENTITY)
 	Long id;
@@ -99,6 +101,16 @@ public class VolumeHostVO implements InternalIdentity {
     @Column(name="destroyed")
     boolean destroyed = false;
     
+    @Column(name="update_count", updatable = true, nullable=false)
+    protected long updatedCount;
+    
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    Date updated;
+    
+    @Column(name = "state")
+    @Enumerated(EnumType.STRING)
+    ObjectInDataStoreStateMachine.State state;
 	
     public String getInstallPath() {
 		return installPath;
@@ -187,6 +199,7 @@ public class VolumeHostVO implements InternalIdentity {
 		super();
 		this.hostId = hostId;
 		this.volumeId = volumeId;
+		this.state = ObjectInDataStoreStateMachine.State.Allocated;
 	}
 
 	public VolumeHostVO(long hostId, long volumeId, long zoneId, Date lastUpdated,
@@ -308,5 +321,27 @@ public class VolumeHostVO implements InternalIdentity {
     public String toString() {
 	    return new StringBuilder("VolumeHost[").append(id).append("-").append(volumeId).append("-").append(hostId).append(installPath).append("]").toString();
 	}
+    
+    public long getUpdatedCount() {
+        return this.updatedCount;
+    }
+    
+    public void incrUpdatedCount() {
+        this.updatedCount++;
+    }
+
+    public void decrUpdatedCount() {
+        this.updatedCount--;
+    }
+    
+    public Date getUpdated() {
+        return updated;
+    }
+
+    @Override
+    public ObjectInDataStoreStateMachine.State getState() {
+        // TODO Auto-generated method stub
+        return this.state;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/core/src/com/cloud/storage/VolumeVO.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java
index defc841..a287c26 100755
--- a/core/src/com/cloud/storage/VolumeVO.java
+++ b/core/src/com/cloud/storage/VolumeVO.java
@@ -32,11 +32,9 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
-import org.apache.cloudstack.api.Identity;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.GenericDao;
-import org.apache.cloudstack.api.InternalIdentity;
 
 @Entity
 @Table(name = "volumes")
@@ -69,7 +67,7 @@ public class VolumeVO implements Volume {
     Long deviceId = null;
 
     @Column(name = "size")
-    long size;
+    Long size;
 
     @Column(name = "folder")
     String folder;
@@ -257,11 +255,11 @@ public class VolumeVO implements Volume {
     }
 
     @Override
-    public long getSize() {
+    public Long getSize() {
         return size;
     }
 
-    public void setSize(long size) {
+    public void setSize(Long size) {
         this.size = size;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/engine/api/pom.xml
----------------------------------------------------------------------
diff --git a/engine/api/pom.xml b/engine/api/pom.xml
index cbb83e4..5c99c4c 100644
--- a/engine/api/pom.xml
+++ b/engine/api/pom.xml
@@ -32,7 +32,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.cloudstack</groupId>
-      <artifactId>cloud-framework-ipc</artifactId>
+      <artifactId>cloud-framework-api</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
index 812db48..0827cf6 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
@@ -28,4 +28,5 @@ public interface DataObject {
     public DataObjectType getType();
     public DiskFormat getFormat();
     public String getUuid();
+    public void processEvent(ObjectInDataStoreStateMachine.Event event);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectInStore.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectInStore.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectInStore.java
new file mode 100644
index 0000000..60dfb9f
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectInStore.java
@@ -0,0 +1,26 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import com.cloud.utils.fsm.StateObject;
+
+
+public interface DataObjectInStore extends StateObject<ObjectInDataStoreStateMachine.State> {
+    public String getInstallPath();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
index 03f2b04..f101f24 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
@@ -20,6 +20,9 @@ public interface DataStore {
     DataStoreDriver getDriver();
     DataStoreRole getRole();
     long getId();
+    String getUuid();
     String getUri();
     Scope getScope();
+    DataObject create(DataObject obj);
+    boolean delete(DataObject obj);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/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 ef578a7..95e3d0b 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
@@ -20,23 +20,23 @@ package org.apache.cloudstack.engine.subsystem.api.storage;
 
 import java.util.Map;
 
+import com.cloud.agent.api.StoragePoolInfo;
+
 
 public interface DataStoreLifeCycle {
-    public DataStore initialize(Map<String, String> dsInfos);
+    public DataStore initialize(Map<String, Object> dsInfos);
 
     public boolean attachCluster(DataStore store, ClusterScope scope);
-    
+    public boolean attachHost(DataStore store, HostScope scope, StoragePoolInfo existingInfo);
     boolean attachZone(DataStore dataStore, ZoneScope scope);
     
     public boolean dettach();
 
     public boolean unmanaged();
 
-    public boolean maintain();
-
-    public boolean cancelMaintain();
-
-    public boolean deleteDataStore();
+    public boolean maintain(long storeId);
 
+    public boolean cancelMaintain(long storeId);
 
+    public boolean deleteDataStore(long storeId);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a9b79359/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
new file mode 100644
index 0000000..15e49e1
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
@@ -0,0 +1,31 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface DataStoreManager {
+    public DataStore getDataStore(long storeId, DataStoreRole role);
+    public DataStore getPrimaryDataStore(long storeId);
+    public DataStore getDataStore(String uuid, DataStoreRole role);
+    public List<DataStore> getImageStores(Scope scope);
+    public DataStore registerDataStore(Map<String, String> params, String providerUuid);
+}