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 2012/11/21 04:01:20 UTC

[7/8] git commit: create template/primary data store is done

create template/primary data store is done


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

Branch: refs/heads/javelin
Commit: 550f4fbcdcd3058f3e130165dd2d19bba277f5e0
Parents: 573d13d
Author: Edison Su <su...@gmail.com>
Authored: Tue Nov 20 18:56:51 2012 -0800
Committer: Edison Su <su...@gmail.com>
Committed: Tue Nov 20 18:57:19 2012 -0800

----------------------------------------------------------------------
 developer/pom.xml                                  |    1 +
 .../engine/cloud/entity/api/VolumeEntity.java      |    1 +
 .../storage/StorageOrchestratorImpl.java           |   13 +-
 .../datastore/DefaultPrimaryDataStoreImpl.java     |   13 +-
 .../storage/datastore/db/DataStoreVO.java          |  255 --------------
 .../storage/datastore/db/PrimaryDataStoreDao.java  |   30 +-
 .../datastore/db/PrimaryDataStoreDaoImpl.java      |   80 +++---
 .../datastore/db/PrimaryDataStoreProviderDao.java  |    2 +-
 .../db/PrimaryDataStoreProviderDaoImpl.java        |   10 +
 .../datastore/db/PrimaryDataStoreProviderVO.java   |   13 +-
 .../storage/datastore/db/PrimaryDataStoreVO.java   |  256 +++++++++++++++
 .../DefaultPrimaryDataStoreLifeCycleImpl.java      |   69 ++++-
 .../lifecycle/PrimaryDataStoreLifeCycle.java       |    4 +-
 .../DefaultPrimaryDataStoreManagerImpl.java        |    4 +-
 .../DefaultPrimaryDatastoreProviderImpl.java       |   49 +++-
 .../provider/PrimaryDataStoreProvider.java         |   10 +-
 .../provider/PrimaryDataStoreProviderManager.java  |    8 +-
 .../PrimaryDataStoreProviderManagerImpl.java       |   73 ++++-
 .../storage/image/TemplateEntityImpl.java          |    1 -
 .../storage/image/db/ImageDaoStoreDaoImpl.java     |   10 +
 .../storage/image/db/ImageDataStoreDao.java        |    2 +-
 .../image/db/ImageDataStoreProviderDao.java        |    1 +
 .../image/db/ImageDataStoreProviderDaoImpl.java    |   10 +-
 .../storage/image/db/ImageDataStoreVO.java         |    2 +-
 .../cloudstack/storage/image/db/ImageDataVO.java   |   10 +-
 .../cloudstack/storage/image/format/VHD.java       |    2 +-
 .../image/manager/ImageDataStoreManagerImpl.java   |    2 +-
 .../provider/DefaultImageDataStoreProvider.java    |   25 ++-
 .../image/provider/ImageDataStoreProvider.java     |    8 +-
 .../provider/ImageDataStoreProviderManager.java    |    9 +-
 .../ImageDataStoreProviderManagerImpl.java         |   10 +-
 .../storage/image/store/ImageDataStoreImpl.java    |    3 +-
 .../store/lifecycle/ImageDataStoreLifeCycle.java   |   27 ++
 .../storage/strategy/DefaultVolumeStrategy.java    |    5 +-
 .../storage/volume/VolumeEntityImpl.java           |   16 +-
 .../cloudstack/storage/volume/VolumeManager.java   |   10 +-
 .../storage/volume/VolumeManagerImpl.java          |   44 +++-
 .../cloudstack/storage/volume/VolumeObject.java    |   17 +-
 .../storage/volume/VolumeServiceImpl.java          |   18 +-
 .../cloudstack/storage/volume/db/VolumeDao.java    |    2 +-
 .../storage/volume/db/VolumeDaoImpl.java           |    2 +-
 .../cloudstack/storage/volume/db/VolumeVO.java     |   14 +-
 .../cloudstack/storage/test/volumeServiceTest.java |  110 ++++++-
 engine/storage/test/resource/storageContext.xml    |   32 +--
 server/src/com/cloud/upgrade/DatabaseCreator.java  |    4 +-
 setup/db/4.1-new-db-schema.sql                     |   41 +++
 setup/db/create-schema.sql                         |   15 +-
 47 files changed, 918 insertions(+), 425 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/developer/pom.xml
----------------------------------------------------------------------
diff --git a/developer/pom.xml b/developer/pom.xml
index 53dd00d..c4d77f7 100644
--- a/developer/pom.xml
+++ b/developer/pom.xml
@@ -145,6 +145,7 @@
               <mainClass>com.cloud.upgrade.DatabaseCreator</mainClass>
               <arguments>
                 <argument>${basedir}/target/db/create-schema.sql</argument>
+                <argument>${basedir}/target/db/4.1-new-db-schema.sql</argument>
                 <argument>${basedir}/target/db/create-schema-premium.sql</argument>
                 <argument>com.cloud.upgrade.DatabaseUpgradeChecker</argument>
               </arguments>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
index 61736bc..b9c9db3 100755
--- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
@@ -82,4 +82,5 @@ public interface VolumeEntity extends CloudStackEntity {
     VolumeType getType();
     StorageEntity getDataStore();
     void setPath(String path);
+    boolean createVolumeFromTemplate(long dataStoreId, VolumeDiskType diskType, TemplateEntity template);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
index efc9b70..d71b72a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java
@@ -110,7 +110,7 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
         if (!ds.contains(volume)) {
             throw new CloudRuntimeException("volume: " + volume + "doesn't exist on backup storage");
         }
-
+/*
         VolumeProfile vp = ds.prepareVolume(volume, destStore);
 
         VolumeStrategy vs = destStore.getVolumeStrategy();
@@ -130,12 +130,15 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
         txn.commit();
 
         return destVolume;
+        */
+        return null;
     }
 
     @DB
     protected Volume migrateVolume(VolumeVO volume, DataStore srcStore, DataStore destStore, String reservationId) throws NoTransitionException {
         Transaction txn = Transaction.currentTxn();
         txn.start();
+        /*
         volume.setReservationId(reservationId);
         volume = _volumeMgr.processEvent(volume, Volume.Event.MigrationRequested);
         Volume destVolume = _volumeMgr.allocateDuplicateVolume(volume);
@@ -156,12 +159,15 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
 
         _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
         return destVolume;
+        */
+        return null;
     }
 
     @DB
     protected Volume recreateVolume(VolumeVO srcVolume, DataStore destStore, String reservationId) throws NoTransitionException {
         Transaction txn = Transaction.currentTxn();
         txn.start();
+        /*
         srcVolume.setReservationId(reservationId);
         srcVolume = _volumeMgr.processEvent(srcVolume, Volume.Event.CopyRequested);
         Volume destVolume = _volumeMgr.allocateDuplicateVolume(srcVolume);
@@ -185,10 +191,13 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
         _volumeMgr.processEvent(srcVolume, Volume.Event.OperationSucceeded);
 
         return destVolume;
+        */
+        return null;
     }
 
     protected Volume createVolumeOnStorage(Volume volume, DataStore destStore, String reservationId) throws NoTransitionException {
         VolumeStrategy vs = destStore.getVolumeStrategy();
+        /*
         volume.setReservationId(reservationId);
         volume = _volumeMgr.processEvent(volume, Volume.Event.CreateRequested);
 
@@ -208,6 +217,8 @@ public class StorageOrchestratorImpl implements StorageOrchestrator {
 
         volume = _volumeMgr.processEvent(volume, Volume.Event.OperationSucceeded);
         return volume;
+        */
+        return null;
     }
 
     @DB

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java
index 9981d68..696085d 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStoreImpl.java
@@ -12,7 +12,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
 import org.apache.cloudstack.storage.HypervisorHostEndPoint;
-import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.image.TemplateObject;
@@ -38,16 +38,16 @@ import edu.emory.mathcs.backport.java.util.Collections;
 public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
     private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreImpl.class);
     protected PrimaryDataStoreDriver driver;
-    protected DataStoreVO pdsv;
+    protected PrimaryDataStoreVO pdsv;
     protected PrimaryDataStoreInfo pdsInfo;
     @Inject
     private VolumeDao volumeDao;
-    @Inject
+    //@Inject
     private HostDao hostDao;
     @Inject
     TemplatePrimaryDataStoreManager templatePrimaryStoreMgr;
 
-    public DefaultPrimaryDataStoreImpl(PrimaryDataStoreDriver driver, DataStoreVO pdsv, PrimaryDataStoreInfo pdsInfo) {
+    public DefaultPrimaryDataStoreImpl(PrimaryDataStoreDriver driver, PrimaryDataStoreVO pdsv, PrimaryDataStoreInfo pdsInfo) {
         this.driver = driver;
         this.pdsv = pdsv;
         this.pdsInfo = pdsInfo;
@@ -56,7 +56,7 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
     @Override
     public VolumeInfo getVolume(long id) {
         VolumeVO volumeVO = volumeDao.findById(id);
-        VolumeObject vol = new VolumeObject(this, volumeVO);
+        VolumeObject vol = VolumeObject.getVolumeObject(this, volumeVO);
         return vol;
     }
 
@@ -155,8 +155,7 @@ public class DefaultPrimaryDataStoreImpl implements PrimaryDataStore {
 
     @Override
     public long getId() {
-        // TODO Auto-generated method stub
-        return 0;
+        return pdsv.getId();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java
deleted file mode 100644
index dc732d9..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java
+++ /dev/null
@@ -1,255 +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 org.apache.cloudstack.storage.datastore.db;
-
-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 org.apache.cloudstack.storage.datastore.DataStoreStatus;
-
-import com.cloud.api.Identity;
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.utils.db.GenericDao;
-
-@Entity
-@Table(name = "storage_pool")
-public class DataStoreVO implements Identity {
-    @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)
-    private String protocol;
-
-    @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 DataStoreStatus status;
-
-    @Column(name = "storage_provider", updatable = true, nullable = false)
-    private Long storageProvider;
-
-    @Column(name = "storage_type", nullable = false)
-    private String storageType;
-
-    @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;
-
-    public long getId() {
-        return id;
-    }
-
-    public DataStoreStatus getStatus() {
-        return status;
-    }
-
-    public DataStoreVO() {
-        // TODO Auto-generated constructor stub
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getUuid() {
-        return uuid;
-    }
-
-    public String getPoolType() {
-        return protocol;
-    }
-
-    public Date getCreated() {
-        return created;
-    }
-
-    public Date getRemoved() {
-        return removed;
-    }
-
-    public Date getUpdateTime() {
-        return updateTime;
-    }
-
-    public long getDataCenterId() {
-        return dataCenterId;
-    }
-
-    public long getAvailableBytes() {
-        return availableBytes;
-    }
-
-    public Long getStorageProviderId() {
-        return storageProvider;
-    }
-
-    public void setStorageProviderId(Long provider) {
-        storageProvider = provider;
-    }
-
-    public String getStorageType() {
-        return storageType;
-    }
-
-    public void setStorageType(String type) {
-        storageType = type;
-    }
-
-    public long getCapacityBytes() {
-        return capacityBytes;
-    }
-
-    public void setAvailableBytes(long available) {
-        availableBytes = available;
-    }
-
-    public void setCapacityBytes(long capacity) {
-        capacityBytes = capacity;
-    }
-
-    public Long getClusterId() {
-        return clusterId;
-    }
-
-    public void setClusterId(Long clusterId) {
-        this.clusterId = clusterId;
-    }
-
-    public String getHostAddress() {
-        return hostAddress;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getUserInfo() {
-        return userInfo;
-    }
-
-    public void setStatus(DataStoreStatus 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;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public Long getPodId() {
-        return podId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof DataStoreVO) || obj == null) {
-            return false;
-        }
-        DataStoreVO that = (DataStoreVO) 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(protocol).append("]").toString();
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
index f525632..24a5c79 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
@@ -25,19 +25,19 @@ import org.apache.cloudstack.storage.datastore.DataStoreStatus;
 
 import com.cloud.utils.db.GenericDao;
 
-public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
+public interface PrimaryDataStoreDao extends GenericDao<PrimaryDataStoreVO, Long> {
 
     /**
      * @param datacenterId
      *            -- the id of the datacenter (availability zone)
      */
-    List<DataStoreVO> listByDataCenterId(long datacenterId);
+    List<PrimaryDataStoreVO> listByDataCenterId(long datacenterId);
 
     /**
      * @param datacenterId
      *            -- the id of the datacenter (availability zone)
      */
-    List<DataStoreVO> listBy(long datacenterId, long podId, Long clusterId);
+    List<PrimaryDataStoreVO> listBy(long datacenterId, long podId, Long clusterId);
 
     /**
      * Set capacity of storage pool in bytes
@@ -59,7 +59,7 @@ public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
      */
     void updateAvailable(long id, long available);
 
-    DataStoreVO persist(DataStoreVO pool, Map<String, String> details);
+    PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map<String, String> details);
 
     /**
      * Find pool by name.
@@ -68,7 +68,7 @@ public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
      *            name of pool.
      * @return the single StoragePoolVO
      */
-    List<DataStoreVO> findPoolByName(String name);
+    List<PrimaryDataStoreVO> findPoolByName(String name);
 
     /**
      * Find pools by the pod that matches the details.
@@ -79,9 +79,9 @@ public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
      *            details to match. All must match for the pool to be returned.
      * @return List of StoragePoolVO
      */
-    List<DataStoreVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details);
+    List<PrimaryDataStoreVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details);
 
-    List<DataStoreVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared);
+    List<PrimaryDataStoreVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared);
 
     /**
      * Find pool by UUID.
@@ -90,13 +90,13 @@ public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
      *            uuid of pool.
      * @return the single StoragePoolVO
      */
-    DataStoreVO findPoolByUUID(String uuid);
+    PrimaryDataStoreVO findPoolByUUID(String uuid);
 
-    List<DataStoreVO> listByStorageHost(String hostFqdnOrIp);
+    List<PrimaryDataStoreVO> listByStorageHost(String hostFqdnOrIp);
 
-    DataStoreVO findPoolByHostPath(long dcId, Long podId, String host, String path, String uuid);
+    PrimaryDataStoreVO findPoolByHostPath(long dcId, Long podId, String host, String path, String uuid);
 
-    List<DataStoreVO> listPoolByHostPath(String host, String path);
+    List<PrimaryDataStoreVO> listPoolByHostPath(String host, String path);
 
     void updateDetails(long poolId, Map<String, String> details);
 
@@ -104,13 +104,13 @@ public interface PrimaryDataStoreDao extends GenericDao<DataStoreVO, Long> {
 
     List<String> searchForStoragePoolDetails(long poolId, String value);
 
-    List<DataStoreVO> findIfDuplicatePoolsExistByUUID(String uuid);
+    List<PrimaryDataStoreVO> findIfDuplicatePoolsExistByUUID(String uuid);
 
-    List<DataStoreVO> listByStatus(DataStoreStatus status);
+    List<PrimaryDataStoreVO> listByStatus(DataStoreStatus status);
 
     long countPoolsByStatus(DataStoreStatus... statuses);
 
-    List<DataStoreVO> listByStatusInZone(long dcId, DataStoreStatus status);
+    List<PrimaryDataStoreVO> listByStatusInZone(long dcId, DataStoreStatus status);
 
-    List<DataStoreVO> listPoolsByCluster(long clusterId);
+    List<PrimaryDataStoreVO> listPoolsByCluster(long clusterId);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
index 9986525..adf131f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
@@ -47,12 +47,12 @@ import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
-public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> implements PrimaryDataStoreDao {
-    protected final SearchBuilder<DataStoreVO> AllFieldSearch;
-    protected final SearchBuilder<DataStoreVO> DcPodSearch;
-    protected final SearchBuilder<DataStoreVO> DcPodAnyClusterSearch;
-    protected final SearchBuilder<DataStoreVO> DeleteLvmSearch;
-    protected final GenericSearchBuilder<DataStoreVO, Long> StatusCountSearch;
+public class PrimaryDataStoreDaoImpl extends GenericDaoBase<PrimaryDataStoreVO, Long> implements PrimaryDataStoreDao {
+    protected final SearchBuilder<PrimaryDataStoreVO> AllFieldSearch;
+    protected final SearchBuilder<PrimaryDataStoreVO> DcPodSearch;
+    protected final SearchBuilder<PrimaryDataStoreVO> DcPodAnyClusterSearch;
+    protected final SearchBuilder<PrimaryDataStoreVO> DeleteLvmSearch;
+    protected final GenericSearchBuilder<PrimaryDataStoreVO, Long> StatusCountSearch;
 
     protected final PrimaryDataStoreDetailsDao _detailsDao = null;
 
@@ -105,73 +105,73 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
     }
 
     @Override
-    public List<DataStoreVO> findPoolByName(String name) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> findPoolByName(String name) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("name", name);
         return listIncludingRemovedBy(sc);
     }
 
     @Override
-    public DataStoreVO findPoolByUUID(String uuid) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public PrimaryDataStoreVO findPoolByUUID(String uuid) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("uuid", uuid);
         return findOneIncludingRemovedBy(sc);
     }
 
     @Override
-    public List<DataStoreVO> findIfDuplicatePoolsExistByUUID(String uuid) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> findIfDuplicatePoolsExistByUUID(String uuid) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("uuid", uuid);
         return listBy(sc);
     }
 
     @Override
-    public List<DataStoreVO> listByDataCenterId(long datacenterId) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listByDataCenterId(long datacenterId) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("datacenterId", datacenterId);
         return listBy(sc);
     }
 
     @Override
     public void updateAvailable(long id, long available) {
-        DataStoreVO pool = createForUpdate(id);
+        PrimaryDataStoreVO pool = createForUpdate(id);
         pool.setAvailableBytes(available);
         update(id, pool);
     }
 
     @Override
     public void updateCapacity(long id, long capacity) {
-        DataStoreVO pool = createForUpdate(id);
+        PrimaryDataStoreVO pool = createForUpdate(id);
         pool.setCapacityBytes(capacity);
         update(id, pool);
 
     }
 
     @Override
-    public List<DataStoreVO> listByStorageHost(String hostFqdnOrIp) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listByStorageHost(String hostFqdnOrIp) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("hostAddress", hostFqdnOrIp);
         return listIncludingRemovedBy(sc);
     }
 
     @Override
-    public List<DataStoreVO> listByStatus(DataStoreStatus status) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listByStatus(DataStoreStatus status) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("status", status);
         return listBy(sc);
     }
 
     @Override
-    public List<DataStoreVO> listByStatusInZone(long dcId, DataStoreStatus status) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listByStatusInZone(long dcId, DataStoreStatus status) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("status", status);
         sc.setParameters("datacenterId", dcId);
         return listBy(sc);
     }
 
     @Override
-    public DataStoreVO findPoolByHostPath(long datacenterId, Long podId, String host, String path, String uuid) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public PrimaryDataStoreVO findPoolByHostPath(long datacenterId, Long podId, String host, String path, String uuid) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("hostAddress", host);
         sc.setParameters("path", path);
         sc.setParameters("datacenterId", datacenterId);
@@ -182,16 +182,16 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
     }
 
     @Override
-    public List<DataStoreVO> listBy(long datacenterId, long podId, Long clusterId) {
+    public List<PrimaryDataStoreVO> listBy(long datacenterId, long podId, Long clusterId) {
         if (clusterId != null) {
-            SearchCriteria<DataStoreVO> sc = DcPodSearch.create();
+            SearchCriteria<PrimaryDataStoreVO> sc = DcPodSearch.create();
             sc.setParameters("datacenterId", datacenterId);
             sc.setParameters("podId", podId);
 
             sc.setParameters("cluster", clusterId);
             return listBy(sc);
         } else {
-            SearchCriteria<DataStoreVO> sc = DcPodAnyClusterSearch.create();
+            SearchCriteria<PrimaryDataStoreVO> sc = DcPodAnyClusterSearch.create();
             sc.setParameters("datacenterId", datacenterId);
             sc.setParameters("podId", podId);
             return listBy(sc);
@@ -199,16 +199,16 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
     }
 
     @Override
-    public List<DataStoreVO> listPoolByHostPath(String host, String path) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listPoolByHostPath(String host, String path) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("hostAddress", host);
         sc.setParameters("path", path);
 
         return listBy(sc);
     }
 
-    public DataStoreVO listById(Integer id) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public PrimaryDataStoreVO listById(Integer id) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("id", id);
 
         return findOneIncludingRemovedBy(sc);
@@ -216,7 +216,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
 
     @Override
     @DB
-    public DataStoreVO persist(DataStoreVO pool, Map<String, String> details) {
+    public PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map<String, String> details) {
         Transaction txn = Transaction.currentTxn();
         txn.start();
         pool = super.persist(pool);
@@ -232,7 +232,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
 
     @DB
     @Override
-    public List<DataStoreVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details) {
+    public List<PrimaryDataStoreVO> findPoolsByDetails(long dcId, long podId, Long clusterId, Map<String, String> details) {
         StringBuilder sql = new StringBuilder(DetailsSqlPrefix);
         if (clusterId != null) {
             sql.append("storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND (");
@@ -254,7 +254,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
             }
             pstmt.setInt(i++, details.size());
             ResultSet rs = pstmt.executeQuery();
-            List<DataStoreVO> pools = new ArrayList<DataStoreVO>();
+            List<PrimaryDataStoreVO> pools = new ArrayList<PrimaryDataStoreVO>();
             while (rs.next()) {
                 pools.add(toEntityBean(rs, false));
             }
@@ -273,8 +273,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
     }
 
     @Override
-    public List<DataStoreVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared) {
-        List<DataStoreVO> storagePools = null;
+    public List<PrimaryDataStoreVO> findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared) {
+        List<PrimaryDataStoreVO> storagePools = null;
         if (tags == null || tags.length == 0) {
             storagePools = listBy(dcId, podId, clusterId);
         } else {
@@ -285,8 +285,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
         if (shared == null) {
             return storagePools;
         } else {
-            List<DataStoreVO> filteredStoragePools = new ArrayList<DataStoreVO>(storagePools);
-            for (DataStoreVO pool : storagePools) {
+            List<PrimaryDataStoreVO> filteredStoragePools = new ArrayList<PrimaryDataStoreVO>(storagePools);
+            for (PrimaryDataStoreVO pool : storagePools) {
                 /*
                  * if (shared != pool.isShared()) {
                  * filteredStoragePools.remove(pool); }
@@ -357,8 +357,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<DataStoreVO, Long> i
     }
 
     @Override
-    public List<DataStoreVO> listPoolsByCluster(long clusterId) {
-        SearchCriteria<DataStoreVO> sc = AllFieldSearch.create();
+    public List<PrimaryDataStoreVO> listPoolsByCluster(long clusterId) {
+        SearchCriteria<PrimaryDataStoreVO> sc = AllFieldSearch.create();
         sc.setParameters("clusterId", clusterId);
 
         return listBy(sc);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDao.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDao.java
index 2fb556e..ebba01c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDao.java
@@ -21,5 +21,5 @@ package org.apache.cloudstack.storage.datastore.db;
 import com.cloud.utils.db.GenericDao;
 
 public interface PrimaryDataStoreProviderDao extends GenericDao<PrimaryDataStoreProviderVO, Long> {
-
+    public PrimaryDataStoreProviderVO findByName(String name);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDaoImpl.java
index c65ca4c..0050c2f 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderDaoImpl.java
@@ -21,8 +21,18 @@ package org.apache.cloudstack.storage.datastore.db;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.SearchCriteria.Op;
 
 @Component
 class PrimaryDataStoreProviderDaoImpl extends GenericDaoBase<PrimaryDataStoreProviderVO, Long> implements PrimaryDataStoreProviderDao {
 
+    @Override
+    public PrimaryDataStoreProviderVO findByName(String name) {
+        SearchCriteriaService<PrimaryDataStoreProviderVO, PrimaryDataStoreProviderVO> sc = SearchCriteria2.create(PrimaryDataStoreProviderVO.class);
+        sc.addAnd(sc.getEntity().getName(), Op.EQ, name);
+        return sc.find();
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderVO.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderVO.java
index 4047819..7e31d9c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreProviderVO.java
@@ -25,14 +25,25 @@ import javax.persistence.Table;
 import javax.persistence.TableGenerator;
 
 @Entity
-@Table(name = "data_store_provider")
+@Table(name = "primary_data_store_provider")
 public class PrimaryDataStoreProviderVO {
     @Id
     @TableGenerator(name = "data_store_provider_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "data_store_provider_seq", allocationSize = 1)
     @Column(name = "id", updatable = false, nullable = false)
     private long id;
 
+    @Column(name = "name", nullable = false)
+    private String name;
+    
     public long getId() {
         return id;
     }
+    
+    public String getName() {
+        return this.name;
+    }
+    
+    public void setName(String name) {
+        this.name = name;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
new file mode 100644
index 0000000..6c05d10
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
@@ -0,0 +1,256 @@
+/*
+ * 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.storage.datastore.db;
+
+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 org.apache.cloudstack.storage.datastore.DataStoreStatus;
+
+import com.cloud.api.Identity;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "storage_pool")
+public class PrimaryDataStoreVO implements Identity {
+    @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)
+    private String protocol;
+
+    @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 DataStoreStatus status;
+
+    @Column(name = "storage_provider_id", updatable = true, nullable = false)
+    private Long storageProviderId;
+
+    @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;
+
+    public long getId() {
+        return id;
+    }
+
+    public DataStoreStatus getStatus() {
+        return status;
+    }
+
+    public PrimaryDataStoreVO() {
+        // TODO Auto-generated constructor stub
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public String getPoolType() {
+        return protocol;
+    }
+    
+    public void setPoolType(String protocol) {
+        this.protocol = protocol;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public Date getRemoved() {
+        return removed;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public long getDataCenterId() {
+        return dataCenterId;
+    }
+
+    public long getAvailableBytes() {
+        return availableBytes;
+    }
+
+    public Long getStorageProviderId() {
+        return storageProviderId;
+    }
+
+    public void setStorageProviderId(Long provider) {
+        storageProviderId = provider;
+    }
+
+    public long getCapacityBytes() {
+        return capacityBytes;
+    }
+
+    public void setAvailableBytes(long available) {
+        availableBytes = available;
+    }
+
+    public void setCapacityBytes(long capacity) {
+        capacityBytes = capacity;
+    }
+
+    public Long getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(Long clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getHostAddress() {
+        return hostAddress;
+    }
+    
+    public void setHostAddress(String host) {
+        this.hostAddress = host;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public String getUserInfo() {
+        return userInfo;
+    }
+
+    public void setStatus(DataStoreStatus 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;
+    }
+
+    public int getPort() {
+        return port;
+    }
+    
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public Long getPodId() {
+        return podId;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof PrimaryDataStoreVO) || obj == null) {
+            return false;
+        }
+        PrimaryDataStoreVO that = (PrimaryDataStoreVO) 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(protocol).append("]").toString();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
index a50ebdc..c16c230 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
@@ -18,17 +18,76 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Map;
 
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
 import org.springframework.stereotype.Component;
 
-@Component
 public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle {
-
+    private final PrimaryDataStoreProvider provider;
+    protected PrimaryDataStoreDao dataStoreDao;
+    public DefaultPrimaryDataStoreLifeCycleImpl(PrimaryDataStoreProvider provider, PrimaryDataStoreDao dataStoreDao) {
+        this.provider = provider;
+        this.dataStoreDao = dataStoreDao;
+    }
+    
+    protected class DataStoreUrlParser {
+        private String schema;
+        private String host;
+        private String path;
+        private int port;
+        
+        public DataStoreUrlParser(String url) {
+            try {
+                URI uri = new URI(url);
+                schema = uri.getScheme();
+                host = uri.getHost();
+                path = uri.getPath();
+                port = (uri.getPort() == -1) ? 0 : uri.getPort();
+            } catch (URISyntaxException e) {
+               
+            }
+        }
+        
+        public String getSchema() {
+            return this.schema;
+        }
+        
+        public String getHost() {
+            return this.host;
+        }
+        
+        public String getPath() {
+            return this.path;
+        }
+        
+        public int getPort() {
+            return this.port;
+        }
+    }
+    
     @Override
-    public boolean registerDataStore(Map<String, String> dsInfos) {
-        // TODO Auto-generated method stub
-        return false;
+    public PrimaryDataStoreInfo registerDataStore(Map<String, String> dsInfos) {
+        DataStoreUrlParser parser = new DataStoreUrlParser(dsInfos.get("url"));
+        PrimaryDataStoreVO dataStore = new PrimaryDataStoreVO();
+        dataStore.setName(dsInfos.get("name"));
+        dataStore.setPoolType(parser.getSchema());
+        dataStore.setPort(parser.port);
+        dataStore.setDataCenterId(Integer.parseInt(dsInfos.get("dcId")));
+        dataStore.setHostAddress(parser.getHost());
+        dataStore.setPath(parser.getPath());
+        dataStore.setStorageProviderId(this.provider.getId());
+        dataStore = dataStoreDao.persist(dataStore);
+        //TODO: add extension point for each data store
+        return this.provider.getDataStore(dataStore.getId());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java
index 99bb995..570a622 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/lifecycle/PrimaryDataStoreLifeCycle.java
@@ -20,8 +20,10 @@ package org.apache.cloudstack.storage.datastore.lifecycle;
 
 import java.util.Map;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+
 public interface PrimaryDataStoreLifeCycle {
-    public boolean registerDataStore(Map<String, String> dsInfos);
+    public PrimaryDataStoreInfo registerDataStore(Map<String, String> dsInfos);
 
     public boolean attach(long scope);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
index e55b126..91528ba 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
@@ -21,7 +21,7 @@ package org.apache.cloudstack.storage.datastore.manager;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
 import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
@@ -40,7 +40,7 @@ public class DefaultPrimaryDataStoreManagerImpl implements PrimaryDataStoreManag
 
     @Override
     public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
-        DataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
         Long providerId = dataStoreVO.getStorageProviderId();
         PrimaryDataStoreProvider provider = providerManager.getDataStoreProvider(providerId);
         PrimaryDataStore dataStore = provider.getDataStore(dataStoreId);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
index 6126a8a..8437872 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
@@ -1,31 +1,43 @@
 package org.apache.cloudstack.storage.datastore.provider;
 
+import java.util.Map;
+
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStoreImpl;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
 import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
+import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl;
+import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.lifecycle.DefaultPrimaryDataStoreLifeCycle;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.component.ComponentInject;
 
 @Component
 public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider {
+    private final String providerName = "default primary data store provider";
     protected PrimaryDataStoreDriver driver;
-    @Inject
-    public PrimaryDataStoreDao dataStoreDao;
+    private PrimaryDataStoreProviderVO provider;
+    private final PrimaryDataStoreDao dataStoreDao;
+    protected PrimaryDataStoreLifeCycle dataStoreLifeCycle;
 
-    public DefaultPrimaryDatastoreProviderImpl() {
+    @Inject
+    public DefaultPrimaryDatastoreProviderImpl(PrimaryDataStoreDao dataStoreDao) {
         this.driver = new DefaultPrimaryDataStoreDriverImpl();
+        this.dataStoreDao = dataStoreDao;
+        this.dataStoreLifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(this, dataStoreDao);
     }
 
     @Override
     public PrimaryDataStore getDataStore(long dataStoreId) {
-        DataStoreVO dsv = dataStoreDao.findById(dataStoreId);
+        PrimaryDataStoreVO dsv = dataStoreDao.findById(dataStoreId);
         if (dsv == null) {
             return null;
         }
@@ -41,4 +53,31 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
         return null;
     }
 
+    @Override
+    public PrimaryDataStoreLifeCycle getDataStoreLifeCycle() {
+        return dataStoreLifeCycle;
+    }
+
+    @Override
+    public long getId() {
+        return this.provider.getId();
+    }
+
+    @Override
+    public boolean register(PrimaryDataStoreProviderVO provider, Map<String, Object> params) {
+        this.provider = provider;
+        return true;
+    }
+
+    @Override
+    public boolean init(PrimaryDataStoreProviderVO provider) {
+        this.provider = provider;
+        return true;
+    }
+
+    @Override
+    public String getName() {
+        return providerName;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java
index dcc8093..b4a82a8 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProvider.java
@@ -1,10 +1,18 @@
 package org.apache.cloudstack.storage.datastore.provider;
 
+import java.util.Map;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
+import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle;
 
 public interface PrimaryDataStoreProvider {
     public PrimaryDataStore getDataStore(long dataStoreId);
-
+    public PrimaryDataStoreLifeCycle getDataStoreLifeCycle();
     public PrimaryDataStoreInfo getDataStoreInfo(long dataStoreId);
+    public long getId();
+    public String getName();
+    public boolean register(PrimaryDataStoreProviderVO provider, Map<String, Object> params);
+    public boolean init(PrimaryDataStoreProviderVO provider);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
index 85a132f..5ede09c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
@@ -1,5 +1,11 @@
 package org.apache.cloudstack.storage.datastore.provider;
 
-public interface PrimaryDataStoreProviderManager {
+import java.util.List;
+
+import com.cloud.utils.component.Manager;
+
+public interface PrimaryDataStoreProviderManager extends Manager {
     public PrimaryDataStoreProvider getDataStoreProvider(Long providerId);
+    public PrimaryDataStoreProvider getDataStoreProvider(String name);
+    public List<PrimaryDataStoreProvider> getDataStoreProviders();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
index 809a7e5..c0ad052 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
@@ -18,15 +18,86 @@
  */
 package org.apache.cloudstack.storage.datastore.provider;
 
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
 import org.springframework.stereotype.Component;
 
 @Component
 public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
-
+    @Inject
+    List<PrimaryDataStoreProvider> providers;
+    @Inject
+    PrimaryDataStoreProviderDao providerDao;
+    
     @Override
     public PrimaryDataStoreProvider getDataStoreProvider(Long providerId) {
+        for (PrimaryDataStoreProvider provider : providers) {
+            if (provider.getId() == providerId) {
+                return provider;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll();
+        for (PrimaryDataStoreProvider provider : providers) {
+            boolean existingProvider = false;
+            for (PrimaryDataStoreProviderVO providerVo : providerVos) {
+                if (providerVo.getName().equalsIgnoreCase(provider.getName())) {
+                    existingProvider = true;
+                    break;
+                }
+            }
+            if (!existingProvider) {
+                PrimaryDataStoreProviderVO dataStoreProvider = new PrimaryDataStoreProviderVO();
+                dataStoreProvider.setName(provider.getName());
+                dataStoreProvider = providerDao.persist(dataStoreProvider);
+                provider.register(dataStoreProvider, params);
+            }
+            PrimaryDataStoreProviderVO providervo = providerDao.findByName(provider.getName());
+            provider.init(providervo);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean start() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean stop() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String getName() {
         // TODO Auto-generated method stub
         return null;
     }
 
+    @Override
+    public PrimaryDataStoreProvider getDataStoreProvider(String name) {
+        for (PrimaryDataStoreProvider provider : providers) {
+            if (provider.getName().equalsIgnoreCase(name)) {
+                return provider;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<PrimaryDataStoreProvider> getDataStoreProviders() {
+        return providers;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
index e775d25..6aacfee 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
@@ -59,7 +59,6 @@ public class TemplateEntityImpl implements TemplateEntity {
        return this.templateInfo.getId();
     }
 
-    @Override
     public String getExternalId() {
         // TODO Auto-generated method stub
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java
index 995aa5e..3f3e9ca 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDaoStoreDaoImpl.java
@@ -21,8 +21,18 @@ package org.apache.cloudstack.storage.image.db;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.SearchCriteria.Op;
 
 @Component
 public class ImageDaoStoreDaoImpl extends GenericDaoBase<ImageDataStoreVO, Long> implements ImageDataStoreDao {
 
+    @Override
+    public ImageDataStoreVO findByName(String name) {
+        SearchCriteriaService<ImageDataStoreVO, ImageDataStoreVO> sc =  SearchCriteria2.create(ImageDataStoreVO.class);
+        sc.addAnd(sc.getEntity().getName(), Op.EQ, name);
+        return sc.find();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java
index 1a95c2d..d7358be 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreDao.java
@@ -21,5 +21,5 @@ package org.apache.cloudstack.storage.image.db;
 import com.cloud.utils.db.GenericDao;
 
 public interface ImageDataStoreDao extends GenericDao<ImageDataStoreVO, Long> {
-
+    public ImageDataStoreVO findByName(String name);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java
index 37a2fe9..1b13b7a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDao.java
@@ -21,4 +21,5 @@ package org.apache.cloudstack.storage.image.db;
 import com.cloud.utils.db.GenericDao;
 
 public interface ImageDataStoreProviderDao extends GenericDao<ImageDataStoreProviderVO, Long> {
+    public ImageDataStoreProviderVO findByName(String name);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java
index 49419d3..f86bf15 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreProviderDaoImpl.java
@@ -21,8 +21,16 @@ package org.apache.cloudstack.storage.image.db;
 import org.springframework.stereotype.Component;
 
 import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.SearchCriteria.Op;
 
 @Component
 public class ImageDataStoreProviderDaoImpl extends GenericDaoBase<ImageDataStoreProviderVO, Long> implements ImageDataStoreProviderDao {
-
+    @Override
+    public ImageDataStoreProviderVO findByName(String name) {
+        SearchCriteriaService<ImageDataStoreProviderVO, ImageDataStoreProviderVO> service = SearchCriteria2.create(ImageDataStoreProviderVO.class);
+        service.addAnd(service.getEntity().getName(), Op.EQ, name);
+        return service.find();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
index 5094418..5b660ec 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataStoreVO.java
@@ -35,7 +35,7 @@ public class ImageDataStoreVO {
     @Column(name = "name", nullable = false)
     private String name;
 
-    @Column(name = "image_provider", nullable = false)
+    @Column(name = "image_provider_id", nullable = false)
     private long provider;
 
     public long getId() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataVO.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataVO.java
index efce33c..19ed0fd 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageDataVO.java
@@ -143,7 +143,7 @@ public class ImageDataVO implements Identity {
         this.uniqueName = uniqueName;
     }
 
-    protected ImageDataVO() {
+    public ImageDataVO() {
         this.uuid = UUID.randomUUID().toString();
     }
 
@@ -178,6 +178,10 @@ public class ImageDataVO implements Identity {
     public boolean requiresHvm() {
         return requiresHvm;
     }
+    
+    public void setRequireHvm(boolean hvm) {
+        this.requiresHvm = hvm;
+    }
 
     public int getBits() {
         return bits;
@@ -230,6 +234,10 @@ public class ImageDataVO implements Identity {
     public long getAccountId() {
         return accountId;
     }
+    
+    public void setAccountId(long accountId) {
+        this.accountId = accountId;
+    }
 
     public String getChecksum() {
         return checksum;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/format/VHD.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/format/VHD.java b/engine/storage/src/org/apache/cloudstack/storage/image/format/VHD.java
index f979ac3..89cd424 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/format/VHD.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/format/VHD.java
@@ -21,7 +21,7 @@ package org.apache.cloudstack.storage.image.format;
 import org.apache.cloudstack.storage.BaseType;
 import org.springframework.stereotype.Component;
 
-@Component
+@Component("image_format_vhd")
 public class VHD extends BaseType implements ImageFormat {
     private final String type = "VHD";
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
index ebd60f1..bf43356 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
@@ -20,7 +20,7 @@ package org.apache.cloudstack.storage.image.manager;
 
 import javax.inject.Inject;
 
-import org.apache.cloudstack.storage.datastore.db.DataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
 import org.apache.cloudstack.storage.image.db.ImageDataDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java b/engine/storage/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
index bfb915f..585c54b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
@@ -18,10 +18,13 @@
  */
 package org.apache.cloudstack.storage.image.provider;
 
+import java.util.Map;
+
 import javax.inject.Inject;
 
 import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreProviderDao;
+import org.apache.cloudstack.storage.image.db.ImageDataStoreProviderVO;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
 import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriver;
 import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriverImpl;
@@ -29,6 +32,8 @@ import org.apache.cloudstack.storage.image.store.ImageDataStore;
 import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl;
 import org.springframework.stereotype.Component;
 
+import com.cloud.utils.component.ComponentInject;
+
 @Component
 public class DefaultImageDataStoreProvider implements ImageDataStoreProvider {
     private final String providerName = "DefaultProvider";
@@ -36,12 +41,14 @@ public class DefaultImageDataStoreProvider implements ImageDataStoreProvider {
     ImageDataStoreProviderDao providerDao;
     @Inject
     ImageDataStoreDao imageStoreDao;
+    ImageDataStoreProviderVO provider;
 
     @Override
     public ImageDataStore getImageDataStore(long imageStoreId) {
         ImageDataStoreVO idsv = imageStoreDao.findById(imageStoreId);
         ImageDataStoreDriver driver = new ImageDataStoreDriverImpl();
         ImageDataStore ids = new ImageDataStoreImpl(idsv, driver, false, null);
+        ids = ComponentInject.inject(ids);
         return ids;
     }
 
@@ -52,8 +59,24 @@ public class DefaultImageDataStoreProvider implements ImageDataStoreProvider {
 
     @Override
     public boolean register(long providerId) {
-        // TODO Auto-generated method stub
         return true;
     }
 
+    @Override
+    public boolean init() {
+        provider = providerDao.findByName(providerName);
+        return true;
+    }
+
+    @Override
+    public ImageDataStore registerDataStore(String name, Map<String, String> params) {
+        ImageDataStoreVO dataStore = imageStoreDao.findByName(name);
+        if (dataStore == null) {
+            dataStore = new ImageDataStoreVO();
+            dataStore.setName(name);
+            dataStore.setProvider(provider.getId());
+            dataStore = imageStoreDao.persist(dataStore);
+        }
+        return getImageDataStore(dataStore.getId());
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
index 8776827..76ab340 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
@@ -19,9 +19,15 @@
 package org.apache.cloudstack.storage.image.provider;
 
 import org.apache.cloudstack.storage.image.store.ImageDataStore;
+import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle;
 
-public interface ImageDataStoreProvider {
+public interface ImageDataStoreProvider extends ImageDataStoreLifeCycle {
     ImageDataStore getImageDataStore(long imageStoreId);
     boolean register(long providerId);
     public String getName();
+    /**
+     * @param providerId
+     * @return
+     */
+    boolean init();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
index 2359a27..f03a0e1 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.storage.image.provider;
 
+import java.util.List;
+
 import org.apache.cloudstack.storage.image.TemplateObject;
 import org.apache.cloudstack.storage.image.store.ImageDataStore;
 
@@ -25,8 +27,13 @@ import com.cloud.utils.component.Manager;
 
 public interface ImageDataStoreProviderManager extends Manager {
     public ImageDataStoreProvider getProvider(long providerId);
-
+    public List<ImageDataStoreProvider> listProvider();
     public ImageDataStore getDataStore(Long dataStoreId);
 
     public ImageDataStore getDataStoreFromTemplateId(long templateId);
+    /**
+     * @param name
+     * @return
+     */
+    ImageDataStoreProvider getProvider(String name);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
index 602973a..32f800c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManagerImpl.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.cloudstack.storage.image.TemplateObject;
 import org.apache.cloudstack.storage.image.db.ImageDataDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreProviderDao;
@@ -51,7 +50,8 @@ public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProvider
         return null;
     }
 
-    protected ImageDataStoreProvider getProvider(String name) {
+    @Override
+    public ImageDataStoreProvider getProvider(String name) {
         for (ImageDataStoreProvider provider : providers) {
             if (provider.getName().equalsIgnoreCase(name)) {
                 return provider;
@@ -104,6 +104,7 @@ public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProvider
                nProvider = providerDao.persist(nProvider);
                provider.register(nProvider.getId());
            }
+           provider.init();
         }
        
         return true;
@@ -126,4 +127,9 @@ public class ImageDataStoreProviderManagerImpl implements ImageDataStoreProvider
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public List<ImageDataStoreProvider> listProvider() {
+        return providers;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
index 8f1b373..5ba91f7 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
@@ -83,8 +83,7 @@ public class ImageDataStoreImpl implements ImageDataStore {
 
     @Override
     public long getImageDataStoreId() {
-        // TODO Auto-generated method stub
-        return 0;
+        return imageDataStoreVO.getId();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java
new file mode 100644
index 0000000..a96983c
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java
@@ -0,0 +1,27 @@
+/*
+ * 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.storage.image.store.lifecycle;
+
+import java.util.Map;
+
+import org.apache.cloudstack.storage.image.store.ImageDataStore;
+
+public interface ImageDataStoreLifeCycle {
+    public ImageDataStore registerDataStore(String name, Map<String, String> params);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java b/engine/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
index 8d1ab79..0f84109 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/strategy/DefaultVolumeStrategy.java
@@ -72,6 +72,7 @@ public class DefaultVolumeStrategy implements VolumeStrategy {
 
         VolumeProfile vp = _driver.createVolumeFromTemplate(get(volume.getId()), tp, dp);
 
+        /*
         VolumeVO vlvo = _volumeMgr.getVolume(volume.getId());
 
         vlvo.setFolder(_ds.getPath());
@@ -80,8 +81,10 @@ public class DefaultVolumeStrategy implements VolumeStrategy {
         vlvo.setPoolType(_ds.getPoolType());
         vlvo.setPoolId(_ds.getId());
         vlvo.setPodId(_ds.getPodId());
-
+        
         return _volumeMgr.updateVolume(vlvo);
+        */
+        return null;
     }
 
     public boolean deleteVolume(Volume vol) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
index cc48f10..d4064d1 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
@@ -24,17 +24,21 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
+import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
 import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
+import org.apache.cloudstack.storage.image.TemplateEntityImpl;
+import org.apache.cloudstack.storage.image.TemplateInfo;
 
 public class VolumeEntityImpl implements VolumeEntity {
     private VolumeInfo volumeInfo;
-
-    public VolumeEntityImpl(VolumeInfo volumeObject) {
+    private final VolumeService vs;
+    public VolumeEntityImpl(VolumeInfo volumeObject, VolumeService vs) {
         this.volumeInfo = volumeObject;
+        this.vs = vs;
     }
 
     public VolumeInfo getVolumeInfo() {
@@ -55,7 +59,6 @@ public class VolumeEntityImpl implements VolumeEntity {
         return volumeInfo.getId();
     }
 
-    @Override
     public String getExternalId() {
         // TODO Auto-generated method stub
         return null;
@@ -214,4 +217,11 @@ public class VolumeEntityImpl implements VolumeEntity {
 
     }
 
+    @Override
+    public boolean createVolumeFromTemplate(long dataStoreId, VolumeDiskType diskType, TemplateEntity template) {
+        TemplateInfo ti = ((TemplateEntityImpl)template).getTemplateInfo();
+        volumeInfo = vs.createVolumeFromTemplate(volumeInfo, dataStoreId, diskType, ti);
+        return true;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/550f4fbc/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
index 22e9baf..f27753d 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManager.java
@@ -19,10 +19,13 @@
 package org.apache.cloudstack.storage.volume;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile;
+import org.apache.cloudstack.storage.volume.db.VolumeVO;
 
 import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
+import com.cloud.storage.Volume.Event;
+import com.cloud.storage.Volume.State;
 import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
 
 public interface VolumeManager {
     VolumeVO allocateDuplicateVolume(VolumeVO oldVol);
@@ -34,4 +37,9 @@ public interface VolumeManager {
     VolumeVO getVolume(long volumeId);
 
     VolumeVO updateVolume(VolumeVO volume);
+
+    /**
+     * @return
+     */
+    StateMachine2<State, Event, VolumeVO> getStateMachine();
 }